Skip to main content
This guide maps OneSignal concepts to Courier and gives you a step-by-step migration plan.

Map OneSignal concepts to Courier

Apps and workspaces

OneSignal apps map to Courier . Each workspace has its own integrations, templates, and user profiles, plus separate Test and Production .

Segments and audiences

OneSignal segments filter on user attributes, activity, and tags to build dynamic groups. Courier work the same way. Define filter rules on profile attributes and Courier keeps membership current as profiles change. For static groups like mailing lists or beta testers, use .

Templates

OneSignal templates are reusable message blueprints for push, email, and SMS. One Courier holds content for every channel: email, SMS, push, chat, and inbox. uses drag-and-drop content blocks. JSON is the code-first path. Both support Handlebars personalization, channel-specific overrides, and . OneSignal uses Liquid syntax. Courier uses Handlebars. Both have conditionals, loops, and variable interpolation, with different syntax.

Journeys

OneSignal Journeys are automated multi-step message flows. Courier do the same, with , , , , and . A journey starts from a : an API invoke, an inbound webhook, a Segment event, or a user joining an audience. Build journeys visually or define them through the .

Users, subscriptions, and profiles

OneSignal separates users (identified by aliases) from subscriptions (individual devices, email addresses, phone numbers). One Courier per user holds all of it: email, phone, push tokens, and custom properties. Profiles accept nested JSON, so account tiers, team roles, or feature flags fit as they are. Create profiles ahead of time through the API, or identify users inline at send time.

Tags and preferences

OneSignal tags are key-value pairs used for both targeting and preference management. Courier splits these in two:
  • Custom profile properties: any attribute on a user profile, for targeting and personalization
  • : opt-in and opt-out by channel, category, or topic, enforced at send time

In-app messages and Inbox

OneSignal’s in-app messages are modal overlays triggered by user activity. Courier is a persistent in-app notification center with drop-in components for , , , and . Inbox runs on the same delivery pipeline as email, push, and SMS, with no separate provider to configure. You get read/unread state, archiving, per-user history, , and .

Outcomes and analytics

OneSignal Outcomes track conversion events tied to notifications. Courier gives you (per-message timeline from API request to provider delivery) and (aggregate delivery and engagement metrics). To pipe events into your own analytics, configure .

Why Courier

  • Multi-channel. Courier treats email, SMS, push, chat, webhooks, and in-app as equal channels with one orchestration layer. You’re not bolting non-push channels onto a push-first platform.
  • Content and logic stay separate. Templates and journeys are independent resources. Your product team updates copy in Design Studio while engineers tune journey timing. Neither blocks the other.
  • 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.
  • Automatic failover. Configure multiple providers per channel and Courier fails over automatically. If your primary email provider goes down, traffic shifts to the backup without code changes.
  • Built-in in-app channel. Courier Inbox works without a third-party provider. Drop in a React, iOS, or Android component and deliver in-app notifications on the same pipeline as email and push.
  • Hosted preferences. Ship a user-facing preference center with a single 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.
  • Full delivery observability. track every message from API request to provider delivery with a detailed timeline, error details, and rendered content inspection.

Migrate step by step

1

Create your Courier workspace

and create a workspace. The Test and Production have independent API keys, so you can migrate without touching live traffic.
2

Configure integrations

Go to Integrations in your Courier dashboard and connect a provider for each channel you use in OneSignal. If you send push via FCM and APNs, configure both. Connect your email and SMS providers (SendGrid, Twilio, etc.). Multiple providers on one channel gives you .For in-app notifications, enable . No external provider needed.
3

Recreate templates

OneSignal templates are per-channel. In Courier, a single holds content for all channels:
  1. Create a new template for each notification type
  2. Add content blocks for each channel (email body, SMS text, push title/body, etc.)
  3. Convert Liquid variables to Handlebars ({{variable}}). The data comes from the send request’s data field
  4. Publish the template so you can send it
4

Migrate user data

Create Courier profiles that consolidate your OneSignal user and subscription data. Use the , or identify users inline at send time.
5

Set up preferences

If you use OneSignal tags for opt-in and opt-out, rebuild that structure with Courier :
  1. Define for each notification category
  2. Configure default channel routing per topic
  3. Migrate user preference selections via the
Courier ships a you can deploy immediately, or to embed preferences in your app.
6

Update your send calls

Replace OneSignal’s Create Notification API calls with Courier’s :
Courier applies routing, preferences, and failover from your template and workspace configuration. For multi-channel sends, set the routing field:
This tries push first, then email, then SMS. The first successful delivery wins.
7

Recreate journeys

If you use OneSignal Journeys, recreate them in Courier , visually or through the .For notifications that need no orchestration, skip journeys and send directly via the Send API.
8

Test and cut over

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

Migrate with an AI agent

Most of this migration is mechanical: read a template definition, create the equivalent Courier template, rewrite the call site. That suits a coding agent well. Three things to set up first:
  • 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.
  • gives the agent direct access to your workspace, so it can create templates, build journeys, upsert users, and read send logs. See 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.
Step 6 deserves a careful pass. OneSignal data tags cover both segmentation and opt-out, and only the opt-out tags should become subscription topics. Anything that gates whether a user may be contacted belongs in Preferences, where Courier enforces it at send time.

Map the API