Skip to main content
Plan and run a migration from Knock to Courier.

Map Knock concepts to Courier

Integrations

Knock Channels map to Courier , where you configure providers like SendGrid, Twilio, and FCM. Add several providers to one channel type and Courier between them. If your primary email provider is down, the backup takes over with no code changes. Courier supports providers across email, SMS, push, chat, and webhooks. Provider config lives in the dashboard, so adding or swapping one never needs a deploy.

Templates and Journeys

Knock bundles content and delivery logic into one Workflow. Courier splits them into two resources. This is the biggest difference between the platforms. own the content. Design them visually in Design Studio, with drag-and-drop blocks for email, SMS, push, and chat. Or define them in code with JSON. Either way, your product team ships copy changes without an engineering cycle. own the orchestration: , , , , and . A journey’s references a template by ID, so the two evolve independently. A journey starts from a : an API invoke, an inbound webhook, a Segment event, or a user joining an audience. Those are the same entry points as Knock workflow triggers.

Users and profiles

Courier store a recipient’s email, phone, push tokens, and any custom properties you personalize with. Profiles accept nested JSON, so structured data like feature flags, team roles, or subscription tiers fits. Create profiles ahead of time through the API, or identify users inline at send time. If you pass a user_id that doesn’t exist yet, Courier creates the profile.

Objects and subscriptions

Knock Objects are non-user entities people subscribe to, like a document or a project. That splits into two things in Courier, and they move separately. The subscriber set becomes a list. A list_id is a dotted namespace, so document.doc_a1b2.watchers names the watchers of one document. Subscribing a user creates the list, so there is no object to register first, and list_pattern reaches every entity of a kind in one send. walks the whole pattern. The entity’s own attributes become data. Whatever the template renders about the document, such as its title or URL, goes in data on the send. So a Knock object that is both a subscriber set and a bag of attributes maps to a list plus data, rather than to one resource.

Preferences

Knock’s PreferenceSet maps to Courier . Users opt out by channel, category, or notification topic, and Courier enforces that at send time. Your code needs no conditional logic. Courier also ships a you can deploy in minutes. Embeddable put a preference center inside your app.

Tenants

in Courier work like Tenants in Knock. Scope branding, preference defaults, and notification feeds to a customer organization, workspace, or account. Pass a tenant_id at send time and Courier applies that tenant’s branding and preference defaults. One difference: Courier stores branding attributes on the Tenant resource, not as a separate Brands object.

In-app notifications

Knock’s Feeds map to Courier , a real-time notification center with drop-in components for , , , and . Inbox runs on the same pipeline as your other channels, so there’s no extra provider to configure. You get read/unread state, archiving, per-user history, and .

Versioning

Knock uses a git-style commit model to version dashboard changes. Courier uses draft and published states. Edit templates and journeys in draft, preview them, and publish when ready. Published versions are immutable, so you always have a snapshot of what’s live.

Why Courier

  • Content and logic stay separate. Templates and journeys are independent. Your product team updates copy in Design Studio while engineers tune journey timing.
  • Design Studio. Build email, SMS, push, and chat content with drag-and-drop blocks. Preview across channels, personalize with variables, and publish without deploying code.
  • Built-in in-app channel. Courier Inbox needs no third-party provider. Drop in a React, iOS, or Android component and deliver on the same pipeline as email and push.
  • Automatic failover. Configure multiple providers per channel. If SendGrid goes down, your email goes out through the backup.
  • Hosted preferences. Ship a user-facing preference center with one config, or embed React components in your app. No custom UI required.
  • The providers you already use. Email, SMS, push, chat, webhooks, CDPs, and observability tools. Switch providers without changing your send code.
  • Delivery observability. track every message from API request to provider delivery, with a timeline, error details, and the rendered content.

Migrate step by step

1

Create your Courier workspace

and create a workspace. Courier gives you separate Test and Production with their own API keys, so you can migrate without touching live traffic.
2

Configure integrations

Go to Integrations in your Courier dashboard and connect the same providers you use in Knock (SendGrid, Twilio, FCM, etc.). Each provider maps to a channel type (email, SMS, push, chat). Configure multiple providers per channel for .If you use Knock’s in-app feed, enable . No external provider needed.
3

Recreate templates

Knock workflows combine content and logic. In Courier, recreate the content as in Design Studio:
  1. Create a new template for each notification type
  2. Add content blocks for each channel (email, SMS, push, etc.)
  3. Use syntax for dynamic data. Courier supports the same Handlebars-style variables
  4. Publish the template to make it available for sending
If your Knock workflows include orchestration logic (delays, conditions, batching), recreate that in .
4

Migrate user data

Create user profiles in Courier with the same identifiers you use in Knock. Use the , or identify users inline at send time.
5

Set up preferences

If you use Knock’s PreferenceSet, recreate that structure in Courier:
  1. Define that map to your Knock categories
  2. Configure default channel routing per topic
  3. Migrate user preference selections via the
Courier also provides a you can deploy immediately, or to embed preferences in your app.
6

Update your send calls

Replace Knock’s workflow trigger calls with Courier’s . A basic send looks like this:
Courier applies routing, preferences, and failover from your template and workspace configuration.
7

Test and cut over

  1. Send test messages in your Test environment and verify delivery in
  2. Validate that preferences, routing, and template rendering match your Knock setup
  3. Switch your production code to use Courier’s Production API key
  4. Monitor and for delivery confirmation

Map the API