Courier supports sending notifications in multiple languages. You can localize content using:Documentation Index
Fetch the complete documentation index at: https://www.courier.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
- Manual approaches: Create language-specific channels or templates in the designer
- Variable-based: Pass translated content in your send request
- API-driven: Use the localization API directly or integrate with a translation management system (TMS)
Setting a User’s Locale
Include alocale property in the user’s profile or in the send request:
en, en_US, fr, fr_FR, de_DE).
Previewing Localized Content
Include a locale in your test event’s profile to preview the localized version:
API-Driven Localization
API-driven localization is available on Business and Enterprise plans.
Key Concepts
| Concept | Description |
|---|---|
| Blocks | Individual content pieces (text, action, list, etc.) that can have locale-specific versions |
| Channels | Channel-specific content (email subject, push title) that can be localized |
| Checksum | MD5 hash to track content changes and manage translation workflows |
| Locales | Language/region codes (e.g., fr_FR, de_DE) used to store translations |
Supported Block Types
| Block Type | Content Structure |
|---|---|
| Text | Plain string with variables and highlights |
| Quote | Plain string with variables and highlights |
| Markdown | Markdown string with variables |
| Action | Button text string |
| List | Object with parent and children strings |
| Template | HTML string |
Draft vs Published Paths
Every localization endpoint is available at two paths:| Path style | Behavior |
|---|---|
/notifications/{id}/... | Updates the published template directly. Changes are live immediately. |
/notifications/{id}/draft/... | Updates the draft version. Requires a publish step before changes go live. |
API Endpoints
| Method | Published Path | Draft Path | Description |
|---|---|---|---|
GET | /notifications/{id}/content | /notifications/{id}/draft/content | Fetch translatable content (blocks, channels, existing locales) |
PUT | /notifications/{id}/locales | /notifications/{id}/draft/locales | Bulk-update locales for all blocks and channels |
PUT | /notifications/{id}/locales/{locale} | /notifications/{id}/draft/locales/{locale} | Update all blocks/channels for a single locale |
POST | /notifications/{id}/blocks/{blockId}/locales | /notifications/{id}/draft/blocks/{blockId}/locales | Update locales for a specific block |
POST | /notifications/{id}/channels/{channelId}/locales | /notifications/{id}/draft/channels/{channelId}/locales | Update locales for a specific channel |
Authorization: Bearer {api_key} header.
Step 1: Fetch Translatable Content
Start by fetching your template’s content to get the block and channel IDs you’ll need for the update endpoints.Step 2: Update Translations
Choose the approach that fits your workflow.Option A: Update locales for a specific block
Use the block ID from the content response to update translations for a single block.204 No Content on success.
For list blocks, the body uses an object with parent and children keys instead of a plain string:
Option B: Update locales for a specific channel
Use the channel ID from the content response to update channel-level translations (e.g., email subject, push title). The body is a plain string per locale; the backend automatically maps the value tosubject for email channels or title for push channels based on the channel type.
204 No Content on success.
The per-channel endpoint takes a plain string per locale. For email channels, this sets the subject line. For push channels, it sets the title. The bulk update endpoint uses a different format where you specify
{ "subject": "..." } or { "title": "..." } explicitly.Option C: Bulk-update all locales at once
Update translations for all blocks and channels in a single request.204 No Content on success.
Publishing Draft Changes
If you use the/draft/ endpoints, your translations are saved to the draft version and need to be published before they take effect. Two options:
Option 1: Direct publish (simplest)
TMS Integration Workflow
For teams using a translation management system, Courier supports a webhook-driven workflow:- Submit for translation: When a template is submitted in Studio, Courier sends a
notification:submittedwebhook - Fetch content: Your TMS fetches translatable content via
GET /notifications/{id}/draft/content - Update translations: Push translated content back via the
/draft/locale endpoints - Complete the process: Resolve checks via
PUT /notifications/{id}/{submissionId}/checksto auto-publish

Webhooks
Configure webhooks in Settings → Webhooks to receive events for the TMS workflow:notification:submitted— Template submitted for translationnotification:published— Template publishednotification:canceled— Submission canceled
Right-to-Left (RTL) Language Support
Courier automatically detects RTL content in email templates and appliesdirection: rtl CSS styling at the block level. When a text block contains content in an RTL language like Arabic or Hebrew, Courier switches alignment from left to right and sets the text direction. This is content-driven; you don’t need to set a dir attribute or add custom CSS.
RTL detection applies to text, quote, markdown, and list blocks. Text blocks get full treatment (direction and alignment), while other block types receive the direction: rtl style. Action buttons do not include RTL detection.
If you use a custom brand template override, you may need to add
.text-rtl { direction: rtl; } to your brand’s custom head styles. The built-in email templates (line, none, inbox) include this by default.What’s Next
Internationalizing Notifications
Step-by-step tutorial for sending multi-language notifications.
Elemental Locales
Localize Elemental templates programmatically.
Send Conditions
Route to channels based on locale.
Handlebars Formatting
Format dates and numbers for locales.