Changelog

The latest releases and improvements to Knock.

Feature illustration

We're excited to introduce guides.

Guides enable you to power in-product messaging, everything from paywalls and badges, to one-time announcements and banners, using your own native components.

With guides, your engineering team gets complete control over in-product messages and how they’re rendered in your product, while your product and marketing teams get the ability to draft, A/B test, and manage all your native in-product content.

Native, self-serve, and observable

Here are a few reasons why we think guides will help product and engineering teams:

  • Goodbye <script/>. Hello <Component/>: Unlike legacy in-app messaging tools that inject JavaScript agents and slow down your app, Knock guides integrate directly with your React, Vue.js, or Angular components. No performance penalties. No UI janking. Complete design system compliance.
  • Self-service for PMs and marketers: With guides, product and marketing teams get the ability to draft content, target recipients, and configure message activation in a self-service way, without needing to worry about introducing breaking changes in the frontend.
  • Built-in analytics and observability: Guides automatically track delivery and engagement metrics. You can understand how many users are seeing, interacting with, and archiving your in-app guides. We make it easy to deliver that data where you need it, whether that's your data warehouse or CDPs such as Segment or Amplitude.

We believe in a future for the internet where software teams can ship in-app messaging that powers adoption, growth, and retention, without having to compromise on performance, web vitals, and content layout shift.

Check out a walkthrough here.

Read the full announcement.

Thomas Yu
Thomas Yu
Feature illustration

We're excited to announce two significant upgrades to developer experience at Knock, Docs 2.0 and new auto-generated SDKs.

A brand new docs experience

We first shipped our docs site four years ago along with the initial launch of Knock. Since then, the design hasn’t changed, despite us shipping a lot of new content.

We’ve reorganized our content, rebuilt our “building in-app UI” section, and refreshed our API and management API references using the OpenAPI spec.

We have also added support for all your LLM needs, with llms.txt and llms-full.txt, markdown pages, and a new RAG API endpoint for our MCP server.

If you’re interested in peeking behind the curtains for these changes, our docs are open source and available here.

New SDKs for Node, Go, Python, and Ruby

Today, we’re proud to release the 1.0 versions of our SDKs in Node (Typescript), Go, Python, and Ruby. These new SDKs are richly typed and include all resources across our API. They are a joy to use. In addition to typing, they include retries, auto-pagination, customizable logging, and configurable timeouts.

If you’re a current SDK user, our migration guides will provide information on how to migrate to the 1.0 releases of our SDKs. We’re also anticipating that our PHP and .NET SDKs will follow the same generated treatment in the second half of this year.

Check out a walkthrough here.

Read the full announcement.

Meryl Dakin
Meryl Dakin
Feature illustration

We're excited to announce broadcasts, a way to send one-time cross-channel messages in Knock.

Whether you’re announcing a new feature, alerting users about system maintenance, or driving new feature adoption, broadcasts let you create thoughtful cross-channel messaging sequences that reach users where they are.

Unlike traditional workflows in Knock that trigger based on events, broadcasts are scheduled to run once for an audience. And, because broadcasts use our workflow engine under the hood, you can easily build sophisticated cross-channel one-time messaging.

Audiences, preferences, and analytics

Along with broadcasts, we are also releasing:

  • Audiences: You can now create an audience in Knock using CSV upload, through our rETL integrations with Census and Hightouch and via our API.
  • Commercial preferences and 1-click unsubscribe: To stay compliant with regulations like CAN -SPAM and CASL, you can set a broadcast (or a workflow) as commercial, which give users the ability to one-click opt-out of any future commercial messaging sent with Knock.
  • Observability and analytics: The messages sent by broadcasts are just like any other messages in Knock. You get visibility into all of the same observability and analytics data we provide for trigger-based workflows.

Read the full announcement.

Check out a demo here.

Connor Lindsey
Connor Lindsey
Feature illustration

Today we're excited to introduce Knock workflows 3.0.

Read the full announcement.

This is our biggest update yet to building and designing cross-channel messaging in Knock. We redesigned our template editor and our workflow canvas with a renewed focus on:

  • Speed. All updates are optimistic. You will never see a loading spinner. You can now use keyboard shortcuts for everything.
  • Ease of use. Writing an email in Knock is as easy as writing a doc in Notion.
  • Quality control. We’ve overhauled error handling and introduced AI powered auto-fix suggestions to debug more complex issues

Check out a demo here.

Kyle McDonald
Kyle McDonald
Feature illustration

Today we’re thrilled to introduce Knock Agent Toolkit and our new MCP server.

Knock Agent Toolkit

Agent Toolkit is a set of tools that enables your agents to send messaging across channels such as in-app, email, push, SMS, and chat apps (Slack, Microsoft Teams.) All messaging sent by the agent works within the guardrails of the messaging workflows and templates you configure in Knock.

const toolkit = await createAgentToolkit({
  permissions: {
    workflows: {
      trigger: ["comment-created", "task-completed", "welcome-user"],
    },
  },
});

Human-in-the-loop

An important part of building agents is enabling them to go to humans to provide input, verify work, and approve outputs. Agent Toolkit exposes a set of helper methods that make it easy to wrap your tool calls in asynchronous human approvals or inputs.

import { createToolkit } from "@knocklabs/agent-toolkit/ai-sdk";
 
const toolkit = createToolkit();
 
const classifyToolRequiringInput = toolkit.requireHumanInput(classifyWork, {
  workflow: "approve-classification",
  recipients: ["user_123"],
});

Our toolkit comes with built-in support for major agent frameworks and SDKs including Vercel AI SDK, LangChain, and OpenAI.

Knock MCP server

Anything you can do in the Knock dashboard you can now do using natural language.

We’re shipping a local MCP server that wraps Agent Toolkit and exposes the tools via the Model Context Protocol. The MCP server can be installed in any MCP-compatible client, including AI coding tools such as Cursor, Windsurf, or Claude Code.

We’re giving foundation models and tools like Cursor the ability to set up workflows, design emails, interact with Knock observability data, and much more.

Get started

You can get started today with Agent Toolkit and our MCP server by reading the documentation and installing the package via npm (@knocklabs/agent-toolkit).

The future is agentic. At Knock we’re thrilled to get the opportunity to partner with our customers and define how agents and humans work together.

To learn more, read the full announcement.

Chris Bell
Chris Bell
Feature illustration

Today we're shipping the ability to use AI to generate workflow trigger data schemas, making it effortless to get started with verifying the data being passed to your Knock workflow trigger.

Last year we shipped our workflow trigger data schema validation, which allows you to use a JSON schema to describe the data that's expected as part of your workflow trigger. However, getting started here required you to write out a full JSON schema from scratch.

Now, using AI, you can click the "Generate schema" button to automatically generate a trigger data JSON schema from data available to your workflow. It's like magic.

Fixes and improvements

  • 👀 [Dashboard] We added a new "Commits" tab to the workflow page where you can see all commits on that workflow and promote changes.
  • 👀 [SDKs] We now support a containerStyle prop for the React Native and Expo SDK's NotificationFeed component.
  • 👀 [SDKs] fetchNextPage in the JavaScript SDK FeedClient now supports FetchFeedOptions.
  • 🐛 [SDKs] Trigger data filtering now supports boolean values in the JavaScript and React SDK.
Chris Bell
Chris Bell
Feature illustration

Today we're introducing workflow filtering for our commits page. Users can now filter the commits page by workflow to help teams better track and manage changes across their notifications.

Commit log filtering is available for all users on the "Commits" page, within the "Commit log" and "Unpromoted" tabs. Select a workflow from the filter dropdown to see all commits related to that workflow.

Fixes and improvements

  • 🐛 [Notification engine] We fixed an issue where MS Teams webhooks would unexpectedly retry a sent notification.
  • 👀 [API] We added support for datetime filtering to the user feed endpoint.
  • 👀 [API] We added support for listing recipients with their preference sets loaded.
  • 👀 [Notification engine] We added support for a new from_markdown Liquid helper to convert Markdown to HTML.
Mike Carbone
Mike Carbone
Feature illustration

Today we're excited to announce a new design for our commits page.

Teams operating customer engagement at scale know the difficulty of managing multiple changes across several teams and channels. With all of the moving parts, it's easy to lose track of what's been changed and when.

Knock enables teams to collaborate effectively with a powerful commit and environment model. But we recently identified a need to enhance the commits page UI to be even more useful. That's why we've redesigned our commits page with a focus on clarity and usability, making it easier for growing teams to manage changes to their notifications.

The new design is available today to all users under the "Commits" tab in the sidebar.

Fixes and improvements

  • 👀 [Dashboard] We added support for the "markdown" Liquid filter to allow MarkDown input -> HTML conversion
  • 👀 [Dashboard] Rolled out trigger event improvements
  • 🐛 [Dashboard] We fixed an issue with Menu Buttons firing multiple times
  • 🐛 [Dashboard] We deployed a fix for an email template rendering issue
  • 🐛 [SDK] We addressed an issue in the Go SDK where some user properties were incorrectly marked as required
Mike Carbone
Mike Carbone
Feature illustration

React 19 support in our JavaScript SDKs

Today we're releasing support for React 19 in our web JavaScript SDKs. This will enable projects with React 19 as a dependency to use our SDKs without any additional configuration. Projects using React 18 or below can safely upgrade to the latest SDK versions without any code changes, as this update maintains full backwards compatibility. All code changes can be found in the GitHub pull request here.

To upgrade, set the package versions in your package.json to the latest version listed below, then reinstall.

Here are the latest versions of our SDKs:

With these updates, our web SDKs now support React versions 16, 17, 18, and 19.

A note on the react-native and expo packages:

The react-native and expo packages do not yet support React 19.

React 19 recently became available on React Native, however, some of the internal dependencies need time to catch up and support these changes before we can update our own packages.

Since the underlying dependency on @knocklabs/client was updated, we released a new version for these packages as well.

React 19 support in our Telegraph components

In addition to the JavaScript SDKs, we've also updated our Telegraph components to support React 19. As a dependency of our JavaScript SDKs, this means that you can now use our in-app notification components and hooks with React 19 without any additional configuration.

You can read more about using our React components to build in-app notifications in the docs here.

Fixes and improvements

  • 🐛 [Dashboard] We fixed a bug where users were able to create variables without setting a value
Mike Carbone
Mike Carbone
Feature illustration

Email-based user ID resolution for Slack

Today we’re introducing email-based user ID resolution for Slack, simplifying the steps needed to send direct messages via Slack to your Knock users.

Previously, if you wanted to send a direct message via Slack to one of your users, you needed to update your Knock user’s channel data to include their Slack user ID. This ID is typically found by making a request to the users.lookupByEmail endpoint of the Slack API using your Knock user’s email address.

Now, Knock can automatically make this API request on your behalf before sending a message. When the request succeeds, Knock will automatically add the Slack user ID to the user’s channel data.

You can read more about enabling email-based user ID resolution for Slack in our documentation.

  • 👀 [Dashboard] We made it possible to see who created a workflow, in addition to who last edited a workflow.
  • 🐛 [Notification engine] We fixed a bug in which temporary failures from Mailgun were treated as undelivered.
  • 🐛 [Dashboard] We fixed a bug in which a cloned workflow would default to the inactive state.
  • 👀 [SDK] We updated our SDKs to include ending_at for scheduled workflows.
Matthew Mikolay
Matthew Mikolay