Skip to main content
This guide helps you plan a migration from Intercom to Courier. It maps Intercom concepts to their Courier equivalents, covers both transactional and marketing sends, and lays out a phased plan. It says ā€œIntercomā€ throughout, since that is still what the product surfaces and the API call themselves. Intercom is a support platform, and it is committing harder to that. The company renamed itself Fin in May 2026 after its AI support agent, and Salesforce has signed a definitive agreement to acquire it and fold that agent technology into Agentforce. Outbound messaging sits beside that focus rather than at the center of it, and the API shows where the investment went: sends are modeled as support conversations owned by an agent seat, push and SMS have no send endpoint at all, and campaign definitions can be exported but never created in code. Those are reasonable tradeoffs for a help desk and poor ones for the messages your product sends. A password reset, a receipt, a usage alert, or an onboarding sequence needs a send API, per-channel routing, provider failover, preference enforcement, and delivery logs. Threading a conversation between a customer and an agent needs almost none of that. So here’s the split most teams land on. Intercom keeps the help desk: Messenger, the Intercom Inbox, tickets, Help Center, and Fin. Courier takes over what your product sends. The rebuild is also less work than it used to be, because Courier’s UI and API are at full parity: every template, journey, audience, and preference topic can be created programmatically, so a coding agent with access to Courier’s MCP server can do most of the mechanical translation. There’s a ready-made prompt for that below.

Mapping Intercom Concepts to Courier

Series and Journeys

Intercom Series is the multi-step campaign builder: contacts enter on a rule or an event, then move through waits, splits, and sends. It requires the Proactive Support Plus add-on. Courier Journeys fill the same role, with four trigger types: API invoke, inbound webhook, Segment event, and audience membership. Two capabilities have no Series equivalent:
  • Batch and digest nodes collapse many events into one message. In Intercom, roll-up messages have to be precomputed in your own backend before you fire the triggering event.
  • Fetch data nodes call an external API mid-journey and use the response in later steps.
Journeys are also buildable through the API. Intercom has no Series endpoint, so a Series exists only in the UI. The one workflow endpoint is GET /export/workflows/{id}, which is read-only, documented as an EU Data Act compliance export, and covers Workflows rather than Series. Either way, campaign definitions can’t be versioned as code.

Event-Triggered Messages and the Send API

This is the biggest change in the migration. Plan it first. Intercom’s POST /messages endpoint accepts message_type values of in_app, email, or whatsapp. There is no push or SMS send endpoint, and its template field is a message style (plain or personal), not a reference to content you built in the composer. So the way you send a designed message from your backend is indirect: post an event, and let a message you configured in the UI match on it.
That returns 202 Accepted with an empty body. Your code learns that the event was accepted, not that a message was created, and Intercom exposes no delivery status endpoint for email, push, or in-app. In Courier, the same send is explicit. You name the template, the recipient, and the data, and the response carries a requestId:
For a single-recipient send like this one, that requestId is also the message’s ID. Use it to get the message, read its delivery history, or cancel it. Sends to a list or audience derive a separate ID per recipient, which you look up through the Messages API. Several Intercom event constraints disappear with the switch. Check each one against your current setup:
  • Intercom caps a workspace at 120 active event names, and each event can drive at most 50 live proactive support messages. Courier templates are addressed by ID, so there is no shared namespace to run out of.
  • Intercom events are flat; its API docs state that nested JSON structures are not supported. Courier data and user profiles both take arbitrary nested JSON, so an order with line items goes through as-is.
  • Intercom de-duplicates events on workspace, contact, event name, and created_at at second granularity, and drops duplicates with a 202. Two legitimate identical sends in the same second collapse into one. Courier treats every send request as its own message.
  • New Intercom event metadata can take up to 24 hours to become available in the message composer and filters. Courier templates reference variables directly, so a new field is usable on the next send.
  • An Intercom outbound message can carry only one event-based rule, and event-triggered messages are not eligible for re-notification.

Transactional Sending

Intercom supports transactional messaging on email, in-product messages, and push, and transactional email can reach unsubscribed contacts. Two things about it usually drive the migration: It is an add-on, not a mode. Transactional and event-triggered messaging require the Proactive Support Plus add-on. In Courier, there is no transactional subsystem to enable. Every send goes through the same pipeline, and you control preference enforcement per topic by marking a preference topic as required. Sending is on shared infrastructure. Intercom’s docs state that dedicated IP addresses aren’t available and that all email is sent over shared IPs, and there is no option to send through your own email provider. It also documents activity-based sending restrictions that, when triggered, limit email to contacts seen, heard from, or engaged within the last 180 days, and notes that event-driven email is usually delivered in seconds but can be delayed up to 30 minutes under load. Courier sends through your own provider accounts. Your SendGrid, SES, Postmark, Twilio, or FCM credentials, your domains, your reputation, your dedicated IP if you have one. Courier adds the orchestration layer on top: channel routing, provider failover, and error handling. If a provider degrades, you swap it in Courier without redeploying.

Contacts, Custom Attributes, and User Profiles

Intercom contacts carry standard fields plus custom attributes defined through data attributes. Courier user profiles are JSON documents keyed by user_id. The translation is direct: the contact’s external_id becomes the Courier user_id, channel addresses (email, phone_number, push tokens) become profile addresses, and custom attributes become profile attributes. Because profiles accept nested JSON, attribute structures you had to flatten for Intercom can keep their shape. Load contacts with the bulk API, or create them inline: sending to an unknown user_id with profile data creates the user. Intercom segments become audiences, which recalculate automatically as profile attributes change. Push tokens are the one item to plan around. Intercom collects device tokens through its mobile SDK, so they live inside Intercom rather than in your data. Register tokens with Courier’s device token API from your app and let the two run in parallel until coverage is high enough to cut over.

Keeping Intercom for Support

Nothing about this migration touches the help desk. Messenger, the Intercom Inbox, tickets, Workflows, Help Center, and Fin all stay where they are. One sync keeps the two in step:
  1. Your application is the source of truth for who the user is and what they did.
  2. Into Courier: upsert profiles with identifiers, channel addresses, and the attributes you segment or personalize on.
  3. Into Intercom: keep sending the contact updates and events your support team relies on for context in the Intercom Inbox.
Events you were firing only to trigger outbound messages can stop. Events your agents read in the contact timeline should keep going.

Subscription Types and Preferences

Intercom Subscription Types support opt-in and opt-out consent, and their content_types field accepts email or sms_message, so consent is tracked for those two channels. Courier preference topics cover every channel, including push and in-app, and Courier enforces them at send time. Each topic can be opt-in or opt-out, required, or channel-specific, so a user can keep receipts on email while turning off push for the same topic. Map each Subscription Type to a preference topic and import the opt-out state before your first send. Note that Intercom’s GET /contacts/{id}/subscriptions only returns subscriptions the contact explicitly set, so contacts sitting on a default are absent from the response. Decide the default for each topic in Courier deliberately rather than inferring it from the export. You get a hosted preference page out of the box, or embeddable components to build the preference center into your product.

Frequency Capping

Intercom controls volume per message: you set how often a message can send and cap total occurrences per contact. Courier has two mechanisms that work across messages. Send limits cap volume globally, per user, per subscription topic, or per tenant over an hour, day, week, month, or billing period, with a THROTTLED status in the logs when a message is blocked. Throttle nodes cap how many times a user or the whole population passes a point in a journey.

In-Product Messages

Intercom’s in-product surfaces (Posts, Banners, Carousels, Tooltips, Checklists, News items) are rendered by the Intercom Messenger, and coverage varies by surface. Banners, for example, run on desktop and mobile web but are not supported inside iOS and Android apps. The closest Courier equivalent is Courier Inbox, a notification feed with read and unread state, tabs, and toasts, available as components for React, JavaScript, and mobile. It is a notification feed rather than a Messenger replacement, so the mapping is not one to one:
  • Posts and News items map cleanly to Courier Inbox messages.
  • Banners are on the Courier roadmap as a first-class in-app surface. Until they ship, either keep banners in Intercom or render one in your own UI over Courier Inbox data. If banners are load-bearing for you, scope them separately from the rest of the migration rather than blocking the cutover on them.
  • Tooltips, Checklists, Product Tours, and Carousels are in-product guidance and onboarding UI. Those stay in Intercom or move to a product-adoption tool. Courier does not replace them.
The billing works differently here too. Intercom meters Posts, Mobile Push, Product Tours, Carousels, and Surveys under a single ā€œMessages Sentā€ metric with an allowance included in the Proactive Support Plus add-on, so in-product messages and push draw down the same pool.

Personalization and Localization

Intercom personalizes with attribute insertion and fallbacks in the composer, and event metadata for event-triggered messages, limited to the first metadata keys on the event. The attribute has to exist on the contact, or the value has to arrive as flat event metadata. Courier templates use variables in single curly brackets, and they resolve from four sources rather than one: Anything not prefixed resolves against data, so {orderId} and {data.orderId} are the same. Nested paths work, so {order.shipping.carrier} renders without flattening the payload first. The tenant source has no Intercom equivalent. If you send on behalf of customer accounts, per-account values like company name, support address, or logo live on the tenant instead of being copied onto every user profile or passed on every send. For localization, Intercom’s documented pattern is to duplicate a message per language and target it with an audience rule on the contact’s language. Courier keeps locales on a single template: set locale on the profile or the send request, and Courier renders the matching version. Translations are managed through Design Studio or the translations API.

Authentication

Intercom authenticates with a workspace access token, rate limited to 10,000 API calls per minute per app and 25,000 per workspace, enforced in ten-second buckets. Courier uses API key authentication: a bearer token per workspace, with separate keys for test and production. Client-side surfaces like Courier Inbox use short-lived JWTs scoped to a single user.

Migration Plan

Do transactional first. Those sends are already API-driven, they carry the most risk if they break, and they are the ones Intercom’s shared sending and 30-minute delay ceiling serve least well. Marketing sends are less urgent and take longer to rebuild.

Phase 1: Inventory

  1. List every live outbound message and Series. Note the trigger, channels, and audience for each. No endpoint returns Series definitions, so take these from the Outbound list filtered to live messages. For per-message volume, POST /export/content/data exports delivery and engagement data for outbound content, Series included, over a date range. One active job per workspace.
  2. Split the list into transactional, marketing, and in-product. Transactional is anything a user action must produce: password resets, receipts, confirmations, alerts. In-product is banners, tours, tooltips, and checklists, which stay in Intercom or move elsewhere.
  3. List the events you fire. Mark which ones exist only to trigger a message and which ones your support team reads in the Intercom Inbox. The first group retires; the second stays.

Phase 2: Transactional

  1. Connect your providers. Add your email, SMS, and push provider credentials in Courier and verify your sending domains. You are moving off shared IPs, so check domain authentication before the first production send.
  2. Set up the profile sync. Upsert user_id, channel addresses, and the attributes your templates need. Start registering push tokens with Courier from your app now, in parallel with the Intercom SDK, so tokens accumulate ahead of the push cutover.
  3. Rebuild the highest-volume transactional templates in Design Studio, with content for each channel the message sends on.
  4. Replace event posts with send calls. Each POST /events that existed only to trigger a message becomes a POST /send naming the template and passing data. This is usually a small diff and it removes an indirection: the call now returns an ID you can trace to delivery status.
  5. Run in parallel and compare. Send to a test audience through both systems, diff the rendered output, then cut over one message type at a time. Watch the logs rather than the calendar.

Phase 3: Preferences

  1. Map Subscription Types to preference topics, decide the default for each, and import opt-outs before any marketing send. Do this before Phase 4, not during it.

Phase 4: Marketing

  1. Rebuild Series as journeys, starting with onboarding. Recreate the trigger, then the nodes. Where a Series precomputed a roll-up in your backend, replace that with a batch or digest node.
  2. Convert segments to audiences. Segment rules become audience filters on profile attributes, and membership updates on its own as profiles change.
  3. Move one-off sends to broadcasts: pick a template, pick an audience, send now or schedule it.
  4. Add frequency caps. Per-message rules in Intercom become send limits that hold across every journey and broadcast.

Phase 5: Decommission

  1. Pause the Intercom message, don’t delete it, once its Courier replacement has run clean for a full cycle.
  2. Drop the Proactive Support Plus add-on when no live message needs it, and stop firing the events that existed only to trigger sends.

Migrating with an AI Agent

Most of this migration is mechanical: read a message definition, create the equivalent template, rewrite the call site. That suits a coding agent well. Three things to set up first:
  • Courier Skills teaches the agent Courier’s real APIs and patterns so it stops guessing at endpoints:
    In Claude Code you can install it as a plugin instead, which self-updates and ships the Courier docs MCP server.
  • Courier’s MCP server gives the agent direct access to your workspace, so it can create templates, build journeys, upsert users, and read send logs as it works. See Build with AI for setup in Claude Code, Cursor, Codex, and VS Code.
  • Docs for agents. Point it at llms-full.txt when it needs API detail beyond this page.
Then start it with a prompt like this one. Fill in the bracketed parts.
Review the classification in step 2 closely. Whether a message counts as transactional decides whether its preference topic is marked required, and getting that backwards means either a receipt users can unsubscribe from or a marketing email they can’t.

FAQ

No, and most teams don’t. Intercom keeps the help desk: Messenger, the Intercom Inbox, tickets, Help Center, Workflows, and Fin. Courier takes over the notifications your product sends. Keep sending Intercom the contact updates and events your agents read for context, and retire only the events that existed to trigger outbound messages.
Journeys. Entry rules become triggers (API invoke, inbound webhook, Segment event, or audience membership), and Series nodes map across: waits to delay, rules branches to branch, messages to send nodes. Journeys add batch, digest, throttle, and fetch data nodes, and they can be built through the API.
Call the send API with the template and recipient. Intercom has no push send endpoint, so if you were triggering push from code you were posting an event and matching it against a message configured in the UI. In Courier the send is explicit and returns an ID you can trace through to delivery history.
Tokens collected by Intercom’s mobile SDK live in Intercom. Start registering tokens with Courier’s device token API from your app while Intercom is still live, let coverage build across a release cycle or two, then cut push over. Plan this early, since it moves at the speed of app adoption rather than your backend deploys.
You improve your control over it. Intercom sends over shared IPs and does not support bringing your own email provider. Courier sends through your own provider accounts, so your domains, reputation, and dedicated IP if you have one carry over. Authenticate your sending domain with your provider before the first production send.
The help desk (Messenger, the Intercom Inbox, tickets, Workflows), the Help Center and Articles, Fin and the AI agent surfaces, and in-product guidance UI such as Tooltips, Product Tours, Checklists, and Carousels. In-app banners are on the Courier roadmap. Courier replaces message delivery and orchestration: transactional sends, campaigns, journeys, templates, preferences, and the in-app notification feed.