Skip to main content
Courier gives you a sending model that can grow with your product. Start with a single API call for straightforward notifications, then add templates, workflows, and orchestration as your messaging needs become more sophisticated. There are three levels of sending in Courier: Inline Send, Templates, and Journeys. Each level builds on the last, so you can choose the right approach for each part of your product.

Level 1: Inline Send

Send a notification with content defined directly in your API call. No templates, no workflows; just one request. This is ideal for transactional messages where the content is generated by your app: password resets, verification codes, order confirmations, alert payloads.
curl -X POST https://api.courier.com/send \
  -H "Authorization: Bearer $COURIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "message": {
      "to": { "email": "user@example.com" },
      "content": {
        "title": "Your verification code",
        "body": "Your code is {{code}}. It expires in 10 minutes."
      },
      "data": { "code": "847291" },
      "routing": { "method": "single", "channels": ["email"] }
    }
  }'
Use this when: content is dynamic and code-driven, you’re sending simple transactional messages, or you want the fastest possible integration.

Level 2: Templates

Separate content from code by referencing a saved template. Your team designs and updates notifications in Courier’s visual editor; your code just triggers the send with data. This is ideal when non-engineers need to edit copy, when you want consistent branding across channels, or when the same notification is sent from multiple places in your codebase.
curl -X POST https://api.courier.com/send \
  -H "Authorization: Bearer $COURIER_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "message": {
      "template": "order-confirmation",
      "to": { "user_id": "user_123" },
      "data": {
        "order_id": "ORD-7891",
        "total": "$49.99",
        "items": ["Widget Pro", "Cable Kit"]
      }
    }
  }'
Use this when: content is managed by PMs, designers, or ops; you want to update messaging without deploying code; or you send the same notification type from multiple services.
Templates handle routing, channel-specific content, and localization in one place. Your send call stays the same regardless of how many channels or languages you support.

Level 3: Journeys

When messaging involves multiple steps, timing, branching, enrichment, or user behavior, use Journeys. Journeys are visual workflows that run on Courier’s infrastructure and orchestrate customer messaging across channels. This is ideal for onboarding flows, activation nudges, reminder chains, re-engagement campaigns, and any messaging experience that needs more than a single send.
// Invoke a journey via API
{
  "journey_id": "onboarding-sequence",
  "user_id": "user_123",
  "data": {
    "plan": "pro",
    "signup_date": "2026-02-10"
  }
}
A journey can include:
  • Send nodes to deliver messages through email, SMS, push, or inbox
  • Branches to route users down different paths based on data or behavior
  • Delays to pause execution for a duration or until a specific time
  • Fetch Data to enrich the workflow with external data
  • AI Agent to generate, classify, or transform content and data inside the workflow
  • Experiment nodes to test different paths, messages, or strategies
  • Throttle to limit how often users pass through a point in the journey
  • Run inspection to debug what happened for a specific user at every node

Choosing the Right Level

Inline SendTemplatesJourneys
Content ownershipEngineersAnyone on the teamAnyone on the team
ChannelsAllAllAll
Routing & preferencesAutomaticAutomaticAutomatic
Timing controlDelays onlyDelays onlyBuilt-in delays and scheduling
Conditional logicIn your codeIn your codeBuilt-in branching
Multi-step sequencesNot supportedNot supportedBuilt-in
Data contractNoneNoneTyped schema with editor autofill
Data enrichmentIn your codeIn your codeBuilt-in Fetch Data nodes
DebuggingMessage logsMessage logsStep-by-step run inspection
Best forTransactional, code-drivenTeam-managed, multi-channelComplex messaging experiences
You can use all three levels across different parts of your product. A password reset can be an inline send while an onboarding flow uses Journeys; they share the same users, preferences, and delivery infrastructure.

Send a Message

Full Send API reference with examples

Template Designer

Design and manage notification templates

Journeys Overview

Build multi-step customer messaging workflows

How Sending Works

Routing, preferences, and delivery pipeline