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.
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āsPOST /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.
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:
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
dataand 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_atat second granularity, and drops duplicates with a202. 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 byuser_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:- Your application is the source of truth for who the user is and what they did.
- Into Courier: upsert profiles with identifiers, channel addresses, and the attributes you segment or personalize on.
- Into Intercom: keep sending the contact updates and events your support team relies on for context in the Intercom Inbox.
Subscription Types and Preferences
Intercom Subscription Types support opt-in and opt-out consent, and theircontent_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 aTHROTTLED 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.
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
- 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/dataexports delivery and engagement data for outbound content, Series included, over a date range. One active job per workspace. - 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.
- 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
- 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.
- 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. - Rebuild the highest-volume transactional templates in Design Studio, with content for each channel the message sends on.
- Replace event posts with send calls. Each
POST /eventsthat existed only to trigger a message becomes aPOST /sendnaming the template and passingdata. This is usually a small diff and it removes an indirection: the call now returns an ID you can trace to delivery status. - 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
- 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
- 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.
- Convert segments to audiences. Segment rules become audience filters on profile attributes, and membership updates on its own as profiles change.
- Move one-off sends to broadcasts: pick a template, pick an audience, send now or schedule it.
- Add frequency caps. Per-message rules in Intercom become send limits that hold across every journey and broadcast.
Phase 5: Decommission
- Pause the Intercom message, donāt delete it, once its Courier replacement has run clean for a full cycle.
- 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.
FAQ
Do I have to stop using Intercom?
Do I have to stop using Intercom?
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.
What replaces Series in Courier?
What replaces Series in Courier?
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.
How do I send a push notification from my backend?
How do I send a push notification from my backend?
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.
What happens to my Intercom push tokens?
What happens to my Intercom push tokens?
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.
Can I keep my email deliverability during the move?
Can I keep my email deliverability during the move?
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.
What parts of Intercom does Courier not replace?
What parts of Intercom does Courier not replace?
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.