--- title: Templates description: Create reusable email templates --- ## Why use templates Templates let you design emails once and reuse them across: - Transactional API sends (`/v1/send`) - Automated workflows Benefits: - Update design in one place, applies everywhere - Maintain consistent branding - Separate content from code ## Template types ### Marketing templates **Use for:** Newsletters, promotions, announcements - Only sends to subscribed contacts - Automatically includes unsubscribe link - Respects subscription preferences ### Transactional templates **Use for:** Order confirmations, password resets, receipts - Sends to all contacts, even if unsubscribed - No unsubscribe link required - Critical business communications Choose the right type based on content, not delivery method. You can use both types in campaigns, workflows, and API calls. The type determines subscription enforcement. ## Creating templates ### In the dashboard 1. Go to **Templates** 2. Click **Create Template** 3. Choose type (Marketing or Transactional) 4. Set subject, from address, and body 5. Add variables using `{{variableName}}` 6. Save ### Via API ```bash curl -X POST {{API_URL}}/templates \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "name": "order-confirmation", "subject": "Order #{{orderNumber}} confirmed", "body": "
Order #{{orderNumber}} will arrive by {{deliveryDate}}.
", "from": "orders@example.com", "fromName": "Acme Store", "type": "TRANSACTIONAL" }' ``` ## Using variables Variables let you personalize each email. Use `{{variableName}}` syntax: ```htmlYour {{plan}} subscription renews on {{renewalDate}}.
Total: ${{amount}}
``` When sending, provide values in the `data` object: ```json { "template": "subscription-renewal", "data": { "firstName": "Sarah", "plan": "Pro", "renewalDate": "April 15, 2024", "amount": "29.00" } } ``` ## Persistent vs. Temporary Data Template variables can come from **persistent contact data** or **temporary non-persistent data**: **Persistent data** — Saved to contact profile: ```json { "to": "user@example.com", "subject": "Welcome {{firstName}}!", "body": "Your {{plan}} subscription is active.
", "data": { "firstName": "John", // Saved to contact "plan": "Pro" // Saved to contact } } ``` **Non-persistent data** — Used only for this email: ```json { "to": "user@example.com", "subject": "Password Reset", "body": "Reset code: {{resetCode}}
Hello {{firstName}}!
", "data": { "firstName": "John", // Saved to contact "resetCode": {value: "ABC123", persistent: false} // NOT saved to contact } } ``` **When to use non-persistent data:** - One-time verification codes or tokens - Temporary URLs (password reset, magic links) - Session-specific information - Data that shouldn't pollute contact profiles **In workflows:** Non-persistent data from events is available throughout the entire workflow execution via the execution context, allowing you to use tokens/URLs across multiple workflow steps. ### Fallback values Provide defaults for missing data: ```html{{user.email}}
{{order.items.0.name}}
{{preferences.newsletter}}
``` ## Sending with templates ### Transactional emails ```bash curl -X POST {{API_URL}}/v1/send \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "to": "user@example.com", "template": "order-confirmation", "data": { "orderNumber": "12345", "deliveryDate": "March 20" } }' ``` ### In workflows When creating a **Send Email** workflow step, select the template from the dropdown. Variables are automatically filled from contact data and workflow context. ### In campaigns When creating a campaign, choose a template instead of composing inline. All campaign recipients get the same template with personalized variables. ## When to use inline vs templates **Use templates when:** - Sending the same email repeatedly - Multiple workflows/campaigns use same design - Design may change over time - Want to centralize branding **Use inline content when:** - One-off transactional emails - Unique per-user content - Testing or prototyping - Content is generated dynamically Example inline send: ```bash curl -X POST {{API_URL}}/v1/send \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "to": "user@example.com", "subject": "Your verification code", "body": "Your code: {{code}}
", "data": {"code": "ABC123"} }' ``` ## Managing templates ### List templates ```bash curl -X GET {{API_URL}}/templates \ -H "Authorization: Bearer sk_your_secret_key" ``` Filter by type: ```bash curl -X GET "{{API_URL}}/templates?type=MARKETING" \ -H "Authorization: Bearer sk_your_secret_key" ``` ### Update template ```bash curl -X PATCH {{API_URL}}/templates/template_id \ -H "Authorization: Bearer sk_your_secret_key" \ -H "Content-Type: application/json" \ -d '{ "subject": "New subject line", "body": "Updated content
" }' ``` Changes apply to all future sends using this template. ### Delete template ```bash curl -X DELETE {{API_URL}}/templates/template_id \ -H "Authorization: Bearer sk_your_secret_key" ``` Templates used in active workflows are not deleted—you'll need to update workflows first. ## Best practices **Keep templates simple** — Focus on content, avoid complex layouts that break in email clients. **Test across clients** — Email rendering varies. Preview in Gmail, Outlook, Apple Mail, and mobile devices. **Use semantic HTML** — Use ``, `` instead of styled `