Dashboard
Templates
Reusable subject/HTML/text with declared variables, drafts and immutable published versions.
Templates are per organization. Apps send them by slug (or id) from POST /emails. See the template field in Emails. Broadcasts and automations select a published version.
Creating
Go to Templates → New template. The console opens an Untitled draft (slug untitled, empty version 1). Set the slug, name and optional description before the first Publish. After the first published version, the slug cannot change.
The slug uses lowercase letters, digits and single dashes (example: welcome-email). Each slug is unique in the organization. A second Untitled draft uses untitled-2.
Placeholders
| Syntax | Effect |
|---|---|
{{ path.to.value }} |
Inserts the value; HTML-escaped in the HTML part. |
{{{ path.to.value }}} |
Inserts the value raw (trusted HTML only). |
A path is a dotted identifier (user.first_name). In the subject and text parts, both forms insert the plain value. The platform leaves anything else that looks like braces as literal text.
Variables schema
You must declare every placeholder in the Variables JSON of the version:
{
"user.first_name": { "type": "string", "required": true, "example": "Jane" },
"count": { "type": "number", "example": "3" },
"trial": { "type": "boolean" }
}
type is string, number or boolean. required defaults to false. A missing optional variable renders as empty. example feeds the live preview and test sends. A version can have up to 100 variables.
At send time, the platform checks the data against this schema. It refuses missing required, undeclared or mistyped values (422 template_variables on the API). The platform never sends a half-rendered message.
Drafts and versions
A template has at most one draft at a time. Save it as often as you like. Preview renders the subject, HTML and text with the example values.
Publish turns the draft into version n, which is immutable from then on. The platform refuses to publish if the subject is empty, there is no body, or a placeholder has no declaration.
Discard deletes the draft. Duplicate to new draft copies any published version into a fresh draft (v n+1).
API sends resolve
"version": "latest"(or omitted) to the highest published version. A specific number pins that version. Drafts never resolve.Archive hides the template from senders. API sends by that slug get
422 template_not_founduntil you restore it. Existing published versions stay.
Test send
Test send renders the draft, or without a draft the latest published version, with the example values. It sends the result to you (the signed-in user) from no-reply@ the first verified domain of the organization. It uses the same path as the API. The message appears in Emails with kind: template.test and the tags template=<slug> and template_version=<n> (suffixed -draft for a draft). It is a live message: it counts toward the warm-up allowance of the domain and the metrics of the organization like any other send.