257 lines
6.4 KiB
Plaintext
257 lines
6.4 KiB
Plaintext
---
|
|
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": "<h1>Thanks for your order!</h1><p>Order #{{orderNumber}} will arrive by {{deliveryDate}}.</p>",
|
|
"from": "orders@example.com",
|
|
"fromName": "Acme Store",
|
|
"type": "TRANSACTIONAL"
|
|
}'
|
|
```
|
|
|
|
## Using variables
|
|
|
|
Variables let you personalize each email. Use `{{variableName}}` syntax:
|
|
|
|
```html
|
|
<h1>Hello {{firstName}}!</h1>
|
|
<p>Your {{plan}} subscription renews on {{renewalDate}}.</p>
|
|
<p>Total: ${{amount}}</p>
|
|
```
|
|
|
|
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": "<p>Your {{plan}} subscription is active.</p>",
|
|
"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": "<p>Reset code: {{resetCode}}</p><p>Hello {{firstName}}!</p>",
|
|
"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
|
|
<h1>Hello {{firstName ?? 'there'}}!</h1>
|
|
```
|
|
|
|
If `firstName` isn't provided, displays "Hello there!" instead.
|
|
|
|
### Nested data
|
|
|
|
Access nested objects with dot notation:
|
|
|
|
```html
|
|
<p>{{user.email}}</p>
|
|
<p>{{order.items.0.name}}</p>
|
|
<p>{{preferences.newsletter}}</p>
|
|
```
|
|
|
|
## 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": "<p>Your code: {{code}}</p>",
|
|
"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": "<p>Updated content</p>"
|
|
}'
|
|
```
|
|
|
|
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 `<h1>`, `<p>`, `<strong>` instead of styled `<div>` elements.
|
|
|
|
**Provide all variables** — Missing variables display as empty. Use fallbacks: `{{name ?? 'Customer'}}`.
|
|
|
|
**Version your templates** — For critical transactional emails, create new templates rather than editing existing ones.
|
|
|
|
## Next Steps
|
|
|
|
- [Create campaigns](/guides/campaigns) with your templates
|
|
- [Build workflows](/guides/workflows) with automated emails
|
|
- [Track performance](/guides/analytics) of your templates
|