Β 

Changelog

The latest releases and improvements to Knock.

Condition debugging in workflow run logs

Today we're launching a step change in your workflow run debugging experience with our new enhanced conditions debugger that surfaces the conditions we evaluated across step, channel, and preference conditions for each step in your workflow.

Previously, we showed a single log line telling you conditions were not met on step and channel evaluation, leading to a confusing user experience in understanding exactly what caused the condition to not pass. Now, with our new conditions debugger, you can get a clear picture of all of the conditions we evaluated when executing your workflow, including exactly what the variables you're referencing in the conditions evaluated to.

You can read more about the debugging conditions in the documentation.

Sliding batch window support

We've added support for sliding windows in our batch function. Previously, when a batch was opened the window for which the batch was open was static, meaning that there was no way to extend the window to accumulate more items inside of the batch. Today, we've added a new "sliding" feature on our batch windows so that any new activities that are added to the batch will extend the window that the batch is open by recomputing the batch window.

You can read more about sliding batch windows in the documentation.

Fixes and improvements

  • πŸ‘€ We added a new contains_all operator to complement our existing contains conditions operator.
  • πŸ› We fixed an edge case with our user and object upsert API where overriding a null property with an object would cause an API 500.
  • πŸ› We fixed an issue where \n characters could cause an issue with push templates.
  • πŸ› We fixed a regression where syntax highlighting was broken in our code editor.

Swift SDK

Today we're launching our Knock Swift SDK, which you can use to build in-app notification experiences in iOS, macOS, and watchOS. Our Swift SDK makes it easy to interface with the Knock in-app feed, wrapping up all of the real-time socket and API querying behavior for you into an easy-to-use package.

The Swift SDK also supports:

  • Getting and setting push token information via channel data.
  • Working with user preferences to build in-app preference centers.
  • Updating message engagement statuses to track push notification opens and taps.
  • ... And much more!

You can install the SDK from Swift Package Manager, Cocoapods, or Carthage. There's also comprehensive documentation and an example iOS app to get you started.

Date filtering for logs views

We added support for date filtering for all log views in the dashboard, making it easy to find logs that happened on or around a particular date. Finding particular logs is now trivial, which is especially useful when debugging in high-log volume environments.

The new date filter is available now in all log views and across all plans. Please note: you will only be able to retrieve logs in congruence with your plan's retention policy.

Fixes and improvements

  • πŸ‘€ When a workflow is triggered from a subscription, we now include the subscription properties under the recipient.subscription namespace in the workflow run scope (docs).
  • πŸ‘€ We added support for the pap-AW locale.

Run workflows from the CLI

You can now test run your workflows as you're building them, all from the Knock CLI. As you make and push changes, you can use the new workflow run command to trigger a workflow for to up to 5 recipients at a time, enabling quick iterations of your notifications. See how to make these calls in our CLI docs.

Add a signing key to fetch steps and webhooks

We’re improving the security of our fetch step and HTTP webhooks by introducing request signing. Request signing allows a secret to be shared between Knock and your service so that you can verify that a request has come from Knock. Learn more about enabling this for your workflows.

Fixes and improvements

  • πŸ‘€ We improved the performance of loading event and action logs
  • πŸ‘€ We increased the granularity of error messages in the debugger
  • πŸ‘€ We added a dropdown to navigate between object collections in the dashboard
  • πŸ‘€ We now show workflow runs tab on users, objects and tenant pages
  • πŸ‘€ You can now filter tenants by name and ID, and we also show the tenant ID and name in workflow runs that include a tenant
  • πŸ‘€ When you create a workflow, it is now initially now set to active
  • πŸ‘€ We made performance and ergonomic improvements to all places that have a user searchbox
  • πŸ‘€ You can now edit your data payload as JSON in the workflow template builder
  • πŸ‘€ You can delete variables at the environment level
  • πŸ› We fixed a bug where owners of newly created accounts couldn't create new environments
  • πŸ› We fixed a bug in which were treating a batch step skip with a conditions_not_met code as an error in our instrumentation code when in fact it is valid
  • πŸ› We fixed an edge case where a recipient's timezone property doesn't contain a valid timezone
  • πŸ› We fixed an issue where batched workflows that used the same cancellation key weren't being fully canceled
  • πŸ› We now prevent tenant and current_message variables from being extracted from templates into the variable pane when editing a template
  • πŸ› We added better support for when using assign in liquid templates
  • πŸ› We fixed a bug where when switching environments on a translation page the translation wouldn't be found
  • πŸ› We fixed a bug that didn't properly use the scheduled_at date for creating and updating schedules
  • πŸ› We fixed a bug where long condition names would prevent seeing the "..." menu in the workflow builder
  • πŸ› We fixed race condition when scheduling a workflow's next occurrence
  • πŸ› We fixed an issue with cloning a workflow where adding variable properties would error during editing
  • πŸ› We fixed a bug where users couldn't edit Knock-managed environments
  • πŸ› We removed the ability to set a delivered condition on push steps since those aren't supported events for push
  • πŸ› We fixed a bug where the batch_key wouldn't be saved in the workflow builder

The last couple months have been quiet ones here on the Knock changelog. That's because we were heads down on our first ever launch week. Here's a recap of each of the 5 big changes we shipped.

HTTP Source

HTTP Source lets you trigger your multi-channel notifications from any source that can stream events into Knock. This includes dedicated streaming infrastructure, such as Kafka and Kinesis, as well as any product that can stream events and webhooks (think Supabase functions and Radar location-based events.)

This means you can power Knock with even more parts of your infrastructure to send notifications that are relevant for your customers.

Read the announcement β€”>

CLI and management API

Now developers can work with Knock resources in code, and automate pushing that code back into Knock to run on our platform. Read our docs to learn how you can scale notifications on Knock while managing our system from your CI/CD environment.

The Knock CLI and management API release is a big step forward for both Knock’s developer experience and for what you can build on top of our platform.

Read the announcement β€”>

Schedules API

Schedules API is a declarative, code-first way to build recurring notification schedules and to give your users the ability to control when they receive those notifications. We also introduce timezone aware sending with this release, making it even easier to send the right notification at the right time with Knock.

Read the announcement β€”>

Webhook channel

Webhook channels bring a new level of flexibility and extensibility to Knock’s output layer. You can use webhook channels to notify internal service within your application, or 3rd-party apps such as PagerDuty or Zapier.

The best part of webhook channels is they tie into Knock’s preferences model, so you can surface them to your customers.

Read the announcement β€”>

Subscriptions API

With subscriptions, you can model lists of users, then notify all users in that list with a single API call.

Subscriptions are a powerful way for you to offload to Knock the responsibility of who should be notified. You can use subscriptions to power alerting use cases and publish/subscribe models, or to model the concept of a set of dynamic followers of a resource.

Read the announcement β€”>

Idempotent API requests

Knock now supports idempotency so that requests can be retried safely without unintended side effects. This release of idempotency is limited to our workflow trigger endpoint. You can know set an idempotency key on your workflow triggers to ensure that Knock doesn't sent duplicate notifications when you retry requests. You can learn more about API idempotency in Knock in our API reference.

We're powering idempotency in Knock with our new open-source Elixir library for powering idempotency on any API. We're calling it One and Done. 😎 You can learn more about how our One and Done library in our announcement blog post.

Notification localization (i18n) support

In case you missed it last week, we just launched Knock Translations, our solution for teams that need to localize their notifications for a global audience. You can learn more in our announcement post.

Angular in-app feed component

One of our customers wrote a great Angular example of our React in-app feed component. You can find it here. If you're a team that uses Angular and wants to ship an in-app feed in a few minutes, this is a great way to do so. Shoutout to Knock customer and community member Chris Graves for this one!

Fixes and improvements

  • πŸ› We fixed a bug in our conditions builder where conditions with empty values could not be created.
  • πŸ› We fixed a bug in our fetch step where successful requests that resulted in an empty response would show an error status in the Knock dashboard.
  • πŸ› We fixed a bug where our rate limits were too specifically scoped.

New JSON editor for template preview data

Our customers use the variable preview pane to understand which variables a workflow uses in its templates, and to update the values of those variables for use in template previews. Previously, this was managed through a point and click interface, which made it difficult to work with structured data such as lists and objects.

Our new and improved preview data editor lets you work with JSON directly. This means you can copy-paste a sample event payload into the editor and immediately see how it will render in your template. We also handle nested data structures to make it easier to navigate through the lists and objects you're working with in your workflow trigger payloads.

Improved layout management

You can now rename, duplicate, and archive the layouts you create in Knock. This enables teams to clean legacy layouts out of Knock and makes it easier to understand which layouts are in active use within the account.

Configure email providers with JSON overrides

You can now configure your email channels in Knock to always pass through JSON data in the requests Knock makes to that channel. As an example, if you're using SendGrid as your email provider and you want to pass through an email_category to SendGrid, you can configure a JSON override on your channel config. These channel overrides support liquid so you can dynamically set this value based on workflow run state if you prefer. See the example below.

{
  "custom_args": {
    "email_category": "{{ notificationType | default: "TRANSACTIONAL" }}"
  }
}

You can learn more about configuring channels and JSON provider overrides in our docs.

Secret account and environment variables

You can now set your account and environment variables as secrets within Knock. A secret variable is one that will be obfuscated within the Knock dashboard once created. This is helpful for cases where you want to use secret keys as Knock environment variables, e.g. to make calls to downstream systems using the Knock fetch step.

When you're creating a variable, just enable "Set as secret variable".

Fixes and improvements

  • πŸ‘€ You can now pass a comma-separated list of email addresses to the cc and bcc fields on your email channel configurations.
  • πŸ› We fixed an issue where events coming from sources such as Segment or Rudderstack that had properties with empty lists ([]) may fail to sync.
  • πŸ› We fixed a bug in our preferences set code that would prevent certain nested preferences from overriding previously set preferences for workflows and categories.
  • πŸ› We fixed an issue where creating a new environment could lead to some channel configuration not being set for in-app feeds.

An overhaul for message status conditions

This week we've shipped a major update to message status conditions in the workflow editor. While we have long supported workflow step conditions that evaluate against the status of a preceding notification message, we only ever provided a small set of condition cases.

With this update, we've expanded the set of condition cases available to cover all possible message delivery and engagement statuses. Also included are some validation helpers that will warn you if we detect you've designed a condition that will never evaluate successfully.

This is a fully backwards compatible updateβ€”all of your existing message status conditions will continue working as you've come to expect. We're excited about how this update will unlock more powerful, composable control flow for your workflows, especially in combination with Knock open and link tracking.

For more details, visit our message status conditions docs or our general guide on Knock conditions.

Enhanced security mode configuration and user token signing helpers

We're excited to share a couple of developer experience improvements to API security at Knock.

Since the beginning, Knock has required that you include a signed user token in requests to your production environment that use a public API key. Now, you can configure this requirement on a per environment basis. We call this "enhanced security mode", and when enabled we will require those signed user tokens. Existing production environments still have enhanced security mode enabled by default.

We've also made it easier to work with those signed user tokens. When you generate a shared signing key in the Knock Dashboard, we now present the key in base-64 format by default. This can be easier to use within single-line environment variables. The PEM-encoded format is also still available.

The Knock Node SDK now includes a convenience method, Knock.signUserToken(), that will automatically use the KNOCK_SIGNING_KEY environment variable in either base-64 or PEM format to securely sign user IDs for use in your client applications.

Lastly, we've updated our security and authentication guide with more helpful notes on how to work with enhanced security mode.

Head over to the "Developers > API keys" page in the Knock Dashboard to take a look.

Fixes and improvements

  • πŸ‘€ From the workflows list, you can now open a workflow in a new browser tab by cmd + <click>-ing it.
  • πŸ‘€ We shipped a small redesign to the "Integrations > Extensions" management page.
  • πŸ‘€ Users with the support role can now access the Knock analytics page.
  • πŸ‘€ We added some truncation for lengthy ID and key values across the Knock dashboard.
  • πŸ‘€ When setting channel data for a user or object, we now validate that the shape of the channel data you send us is valid for the target channel type.
  • πŸ‘€ Within the workflow builder, you can override channel-level Knock tracking config defaults for specific workflow steps. Now, we've added a button that lets you reset your overrides so that your step once again inherits from channel-level defaults.
  • πŸ› We fixed a bug that prevented you from creating a workflow with more than 10 channel steps. You can now create workflows with any number of channel steps.
  • πŸ› We fixed a bug where we wouldn't display environment default preferences in the Knock dashboard after first creating them.
  • πŸ› We fixed some bugs with user invites where duplicate users would exist after a new user accepted an invite and signed up to join a Knock account.
  • πŸ› We fixed a bug where non-visible Liquid statements (e.g. {% if %}) would result in extra, empty <p> tags when rendering a Markdown template into HTML.
  • πŸ› We fixed a bug where you couldn't set an empty connections list for the channel data for a chat channel for a user or object.

Trigger workflows to lists of recipients with Object Subscriptions

We're happy to announce that we've added support for object subscriptions to Knock. Object subscriptions make it easy for you to create and manage lists of recipients and trigger notification workflows to all recipients who are subscribed to that list, all from a single API call.

You can use object subscriptions to build pub/sub or alerting features on top of Knock, without the need to manage who should be notified and let Knock handle the efficient fan out of sending notifications to thousands of users simultaneously.

// Create an object to subscribe recipients to
await knock.objects.set("project_alerts", project.id, {
  name: project.name,
});

// Subscribe one or more users to the alerts
await knock.objects.addSubscriptions("project_alerts", project.id, {
  recipients: ["esattler", "dnedry"],
});

// Trigger a workflow to all recipients subscribed
await knock.workflows.trigger("alerts", {
  recipients: [{ collection: "project_alerts", id: project.id }],
});

For more details, visit the Object subscriptions docs.

Analyze your notification event data in downstream tools with our Segment extension (beta)

We're excited to announce that our new Segment extension is now in beta. In just a few clicks you can start sending all of the events associated with the notifications being sent through Knock – clicks, opens, and delivery events – to over 350 destinations available in Segment.

For more details, visit the Segment extension docs. The Segment extension is available on the Growth and Enterprise plans. You can receive beta access by contacting us at support@knock.app.

Fixes and improvements

  • πŸ‘€ We've changed our preferences API so default preferences will always be merged into the preferences shown in the dashboard and via the API for both users and objects
  • πŸ‘€ We've extended our support role to include viewing read-only workflows, logs, and workflow runs across all environments
  • πŸ‘€ You can now press "cmd + k" to access the search bar on our docs
  • πŸ› We fixed an issue where our user typeahead wouldn't allow you to select a user where there multiple users with the same emails
  • πŸ› We fixed a bug where specifying a sort order on a batch step would not sort the activities in the same order on the /v1/messages/:id/activities API
  • πŸ› We fixed an issue where a malformed piece of JSON in a preview variable could cause the app to crash
  • πŸ› We fixed a small bug where creating a new email layout would not show up under the "Manage template settings" when selecting a custom layout

Resend + Knock

We're super excited to announce that we now support Resend as an email provider with Knock. Now you can send great-looking emails through Resend's email API, while orchestrating your multi-channel notifications with Knock.

We're a big fan of the Resend team and of modern developer tooling in general, so we're excited to be able to extend their API to Knock customers everywhere. Happy (re)sending!

Read more in our docs

An improved user search component: find by ID or email

This improvement is a long time coming. We've improved our user search component in a big way. Now when you're in the Knock test runner, you can search for recipients and actors by either their user ID or their email. This makes it much easier to quickly find the recipient you're looking for and send them a test notification.

A screenshot of our new user search component

We've updated all of our other user search experiences (across messages, logs, and workflow runs) to use this new behavior, too. This makes it easier for your support team to quickly find the Knock logs associated with a particular user.

New and improved template editor design

We've added some visual polish to our template editor. It helps with general spacing and readability. We've also added new breadcrumbs to the template editor to make it easier to see where you are in Knock and to quickly return to your workflow canvas.

New template editor UI

New undelivered status with outbound webhook support

Our outbound webhooks are a popular way for our customers to stay updated on what's happening in their Knock system and to trigger behavior in their own application based on Knock events.

Previously our message.undelivered webhook would fire with each delivery attempt we made to your downstream notification providers. Now we have two separate webhooks, one for our delivery attempts to your providers (message.delivery_attempted) and one for when delivery has failed and no more attempts will be made (message.undelivered).

This makes it easier to trigger behavior in your application based on undelivered notifications.

Fixes and improvements

  • πŸ‘€ We've added a workflow tag to our datadog metrics
  • πŸ‘€ We've made some performance improvements to our analytics views in the Knock dashboard
  • πŸ‘€ We improved our error messaging when sending a null, undefined, or empty API key into Knock
  • πŸ› We fixed an issue where email fields with liquid would fail on downstream providers when resolving to an empty string
  • πŸ› We fixed an issue where conditions with arguments that resolved to strings containing periods could cause errors when evaluating some conditions