Email Templates
Read and update the automated emails EquipDash sends to customers and staff — booking confirmations, reminders, receipts, and more. These are the same templates managed in Settings → Email templates in the web UI, including the visual block layout and per-item versions.
A template's content can be plain wording (intro_text / outro_text) or a block layout
(email_blocks). When you write email_blocks, the API renders and stores the same
intro_html / outro_html the web editor would, so both surfaces always stay in sync.
Endpoints
| Method | Endpoint | Description | Scope |
|---|---|---|---|
GET | /v1/settings/email-templates | List all templates | settings:read |
GET | /v1/settings/email-templates/{type} | Get one template with its versions | settings:read |
PATCH | /v1/settings/email-templates/{type} | Update a template | settings:write |
POST | /v1/settings/email-templates/{type}/versions | Add a per-item version | settings:write |
PATCH | /v1/settings/email-templates/{type}/versions/{id} | Update a version | settings:write |
DELETE | /v1/settings/email-templates/{type}/versions/{id} | Delete a version | settings:write |
{type} is the template key, e.g. booking_confirmation, booking_reminder, payment_receipt,
pre_arrival. The list endpoint returns every valid key.
GET /v1/settings/email-templates
Example Request
curl "https://app.equipdash.com/api/v1/settings/email-templates" \
-H "Authorization: Bearer YOUR_API_KEY"
Response (200 OK)
{
"data": [
{
"type": "booking_confirmation",
"label": "Booking Confirmation",
"description": "Sent when a customer completes a booking",
"group": "bookings",
"category": "customer",
"subject": "Your booking is confirmed - {booking_reference}",
"enabled": true,
"has_custom_layout": false,
"supports_item_versions": true,
"wording_editable": true
}
]
}
group matches the groups in the web UI rail: bookings, arrival_returns, payments_money,
waivers_forms, reviews_surveys, customers, your_team.
Some automatic emails have fixed wording and only an on/off switch: refund_processed,
security_deposit_notice, balance_due_reminder, condition_report_customer and
service_ready. They are listed with wording_editable: false, and PATCH accepts only enabled
for them.
GET /v1/settings/email-templates/{type}
Returns the full template: wording, block layout, background color, available merge-tag placeholders, and (for booking-related templates) its per-item versions.
curl "https://app.equipdash.com/api/v1/settings/email-templates/booking_confirmation" \
-H "Authorization: Bearer YOUR_API_KEY"
PATCH /v1/settings/email-templates/{type}
All fields are optional — send only what you want to change.
| Field | Type | Description |
|---|---|---|
subject | string | Subject line (merge tags like {customer_name} allowed) |
enabled | boolean | Whether this email sends at all |
intro_text | string | null | Plain wording before the automatic content block |
outro_text | string | null | Plain wording after it |
email_blocks | array | null | Block layout (see below); null clears the layout |
background_color | string | null | Hex color, e.g. #f5f7f9 |
Block layout
email_blocks is an ordered list of {id, type, data} objects. Types: heading (data.text),
text (data.html), button (data.text, data.url), image (data.url, data.alt),
divider, spacer, and exactly one details — the marker where EquipDash inserts the automatic
content (booking details, payment amounts, and so on). Blocks above details become the intro,
blocks below it the outro. A missing details marker is appended automatically.
curl -X PATCH "https://app.equipdash.com/api/v1/settings/email-templates/booking_confirmation" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"subject": "See you soon, {customer_name}!",
"email_blocks": [
{"id": "blk1", "type": "text", "data": {"html": "<p>Thanks for booking with us.</p>"}},
{"id": "blk2", "type": "details", "data": {}},
{"id": "blk3", "type": "button", "data": {"text": "View my booking", "url": "https://example.com"}}
]
}'
Per-item versions
Booking-related templates (supports_item_versions: true) can carry versions — different
wording for some products or experiences. At send time the most specific version wins:
specific item → category → all products / all experiences → the base template. Versions inherit
the base template's enabled switch and timing settings.
POST /v1/settings/email-templates/{type}/versions
| Field | Type | Description |
|---|---|---|
name | string, required | Owner-facing label, e.g. "Guided sessions" |
subject | string | Defaults to the base template's subject |
apply_to_all_products | boolean | Version applies to every product booking |
apply_to_all_experiences | boolean | Version applies to every experience booking |
apply_to_all_store_products | boolean | Version applies to every store-product booking |
apply_to_all_services | boolean | Version applies to every service booking |
product_ids | int[] | Specific products |
product_category_ids | int[] | Product categories |
experience_ids | int[] | Specific experiences |
experience_category_ids | int[] | Experience categories |
store_product_ids | int[] | Specific store products |
store_category_ids | int[] | Store categories |
At least one targeting field is required. Content starts as a copy of the base template; update it
afterwards with PATCH .../versions/{id} (same content fields as the template PATCH, plus name
and the targeting fields).
curl -X POST "https://app.equipdash.com/api/v1/settings/email-templates/booking_confirmation/versions" \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{"name": "Guided sessions", "experience_category_ids": [12]}'
Response (201 Created)
{
"data": {
"id": 4,
"name": "Guided sessions",
"subject": "Your booking is confirmed - {booking_reference}",
"apply_to_all_products": false,
"apply_to_all_experiences": false,
"product_ids": [],
"product_category_ids": [],
"experience_ids": [],
"experience_category_ids": [12],
"background_color": null,
"created_at": "2026-07-30T12:00:00+00:00"
}
}
Errors
| Status | Code | Meaning |
|---|---|---|
404 | NOT_FOUND | Unknown template type, or versions requested on a template that doesn't support them |
422 | INVALID_TARGETING | No targeting supplied, or a targeted id doesn't belong to your account |
422 | TEMPLATE_USES_BLOCKS | intro_text/outro_text sent for a row with a block layout — send email_blocks instead (or email_blocks: null to clear it) |
422 | WORDING_NOT_EDITABLE | Anything other than enabled sent for an email with fixed wording |
422 | VALIDATION_ERROR | Field-level validation failed |