Why templates
- Reuse — One source of truth; update HTML in one place
- Consistency — Every send uses the same layout, tokens, and defaults
- Versioning — Every edit creates a new version; roll back if something breaks
- Separation of concerns — Designers own the HTML, engineers just pass variables
- Analytics — Track open and click rates per template
Create a template
Write the HTML
Use the built-in editor or paste in HTML from your design tool (MJML, Maizzle, Unlayer, etc.). The editor renders a live preview.
Declare variables
Add each variable the template uses, with a name, type, and whether it is required. See Variables below.
Variables
Variables use{{double-brace}} syntax and support dot notation for nested values:
| Type | Example | Notes |
|---|---|---|
string | "Alice" | Default; supports HTML-escaped rendering |
number | 42 | Formatted per locale |
boolean | true | Useful for conditionals |
date | "2026-04-17" | Formatted to the recipient’s locale |
variables payload on every send — passing a missing required variable fails with 422 Unprocessable Entity before the email is ever queued.
Template-specific defaults
Set these per template so callers do not have to pass them every time:- Default
from— e.g.,"Acme Orders <orders@mail.acme.com>" - Default
reply_to— e.g.,"support@acme.com" - Default subject — Can still be overridden at send time
Version control
Every save creates a new version. You can:- View a diff between any two versions
- Preview any version with sample variables
- Roll back to a previous version with one click
- Send from a specific version (pin legacy flows to an older version if needed)
Send with a template
subject, from, tags, etc.) at send time — the template’s defaults fill in anything you omit. See Sending Emails for the full parameter list.
Tracking template usage
Each template has a stats view showing:- Total sends (today, 7 days, 30 days)
- Delivery rate
- Open and click rates
- Bounce and complaint counts
- Version breakdown (which version delivered which sends)