Overview
Courier’s content management system handles the creation, storage, and delivery of notification templates. Understanding how content works helps you build effective notification strategies and manage templates efficiently.Content Creation Methods
Template Designer

Template Designer - Drag and Drop Interface
Elemental JSON
Elemental is Courier’s JSON-based content system for defining a notification programmatically. Each Elemental template describes the content hierarchy using a standardized format that works across all channels. This approach provides precise control over content structure and enables conditional logic, dynamic content generation, and multi-language support. This method works well for transactional notifications, multi-language templates, and notifications that require business logic. Elemental templates can be version-controlled through your codebase and can be tested programmatically. Visually built templates go also be exported to Elemental to allow those templates to benefit from this approach. For Elemental documentation including syntax, elements, and advanced features, see the Elemental Documentation.Handlebars Templating
Handlebars is a popular open-source templating language that Courier supports for advanced dynamic content capabilities in email notifications. It allows you to write custom HTML, CSS, and Handlebars code for highly customized email templates with conditional logic, loops, variable transformations, and complex business rules. Handlebars templates can be used in several contexts:- Email Template Overrides: Direct HTML/Handlebars editing for email notifications
- Template Blocks: Reusable Handlebars components within the Template Designer
- Brand Templates: Custom header/footer templates for brand consistency
- Brand Snippets: Reusable Handlebars code snippets across templates
Template Management
Version Control
Courier maintains version history for all templates created in the Template Designer. Each time you save a template, Courier creates a new version that preserves the previous iteration. This allows you to track changes over time, compare different versions, and roll back to previous iterations if needed. The version control system includes change tracking, diff views, and collaborative editing features. For Elemental templates, version control is handled through your existing code management system. Templates stored as code benefit from your team’s established Git workflows, code review processes, and deployment pipelines. For more information about template creation and management, see the Template Designer Documentation.Publishing Workflow
Templates follow a publishing workflow that controls when changes become active. In the Template Designer, you can save drafts for testing and iteration before publishing changes to production. The publishing system includes approval workflows, environment-specific deployments, and rollback capabilities to ensure safe template updates. For API-based templates, publishing is typically handled through your deployment process. New template versions become active when you deploy updated code or update template references in your application. For information about publishing workflows and approval processes, see the Template Settings Documentation.Template Organization
Each template has a unique identifier that your application uses to reference it when sending notifications. Templates can be organized by function (user onboarding, transactional notifications, marketing campaigns), channel type, or custom categories that match your business needs. The organization system supports tagging, search functionality, and bulk operations to help you manage large template libraries efficiently. For information about template organization and management features, see the Asset Manager.Content Features
Content Blocks
Content blocks are pre-built, responsive components that speed up template creation and ensure consistency across channels. Each block represents a specific content type like text, images, buttons, dividers, or custom components. Blocks automatically adapt to different channels and devices, ensuring consistent rendering across email clients, mobile apps, and web interfaces. The content block system includes features like conditional rendering, dynamic data binding, and custom block creation for specialized use cases. For information about all available content blocks and advanced features, see the Content Blocks Documentation.Brand Management

Brand Designer - Customization for Brands
Internationalization
Courier provides internationalization support for global notification strategies. Templates can include multiple language variants that automatically display based on user preferences. The system handles text translation, date formatting, currency formatting, and cultural adaptations for global audiences. The internationalization system supports locale-specific content, fallback languages, and dynamic language detection based on user profiles. For information about multi-language template creation and localization features, see the Internationalization Documentation.Conditional Content
Templates can include conditional logic that shows or hides content based on user data, preferences, or other criteria. This allows you to create dynamic notifications that adapt to user preferences, account status, geographic location, or any custom business rules. Conditional content works in both the Template Designer and Elemental templates. The conditional system supports nested conditions, multiple criteria evaluation, and dynamic content selection based on real-time data. For information about conditional logic and dynamic content features, see the Channel Settings Documentation.Variables and Dynamic Content
Courier supports dynamic content through variables that can be inserted into templates from multiple data sources including user profiles, event data, tenant information, and brand settings. Variables enable personalization and dynamic content generation across all content creation methods. Content Blocks: Insert variables using single curly brackets{variable_name} in text, markdown, and other content blocks. Variables are highlighted in green and automatically replaced with actual data when notifications are sent.
Handlebars Templates: Use double curly brackets with Handlebars helpers for advanced variable handling: {{var "variable_name"}} for data objects or {{var "profile.variable_name"}} for profile data. Handlebars provides additional capabilities for conditional rendering, loops, and variable transformations.
Email Fields: Variables can be used in email subject lines, from addresses, and other email-specific fields to create dynamic, personalized email headers.
The variable system supports JSONPath expressions for accessing nested data structures and provides built-in variables for tracking, unsubscribe links, and system information. For comprehensive variable documentation and usage examples, see the Variables Documentation.