Spintax (message variations)
Spintax makes every recipient's copy slightly different, which is a deliverability practice: many identical messages look like bulk mail, varied ones don't. It is supported in the subject and the body, on campaigns and follow-ups alike. (Whether to run on reusable copy at all — and when a template is safe versus a framework — is craft, not mechanics: see the playbook's Templates vs frameworks.)
Syntax
Wrap the alternatives in curly braces, separated by pipes:
{|Hi|Hello|Hey|} {{FIRST_NAME}},
One option is chosen per message. Leading and trailing pipes are optional — {|Hi|Hello|} and
{Hi|Hello} behave identically, and an unbalanced pair ({|Hi|Hello}) is accepted too. Prefer the
{|…|} form: it is the form the app's own editor writes, and the outer pipes make the group obvious
next to ordinary prose.
Nesting works, and options may contain anything — including personalization variables:
{|Hi {{FIRST_NAME}}|Hello {{FIRST_NAME}}|}, {|I noticed {{COMPANY}} is {|hiring|growing|}|Quick question about {{COMPANY}}|}
Every group is spun independently. The same group written three times will not produce the same choice three times — repeat a group deliberately only when you want the variation.
The one trap: braces are consumed even without pipes
A brace pair with no pipe is still treated as a spin group with a single option, so the braces are removed and the text inside is kept:
| You write | Recipient sees |
|---|---|
price is {not a spin} today |
price is not a spin today |
{ literal c } |
literal c |
So you cannot write a literal { or } as itself in a subject or body. A backslash does not
help — \{literal\} arrives as \literal\, keeping the backslashes and still losing the braces.
To show a real curly brace, use HTML entities — { for { and } for }. These pass
through untouched and render as braces in the delivered mail:
Use {{FIRST_NAME}} to personalize.
This matters whenever the copy quotes code, JSON, template syntax, or a price format containing braces.
What blocks a send
Content is validated when the campaign starts (campaign/start_by_id), and two spintax-adjacent mistakes fail it there rather than silently mailing something wrong:
{} brackets not matching— an opening brace with no closing one (or vice versa) anywhere in the subject or body. Count your braces; the error does not say which line.Wrong placeholder: {{…}}— double braces are strictly the variable syntax, so{{anything}}must be a real variable name from the closed list in personalization-variables. Use single braces for spin options and{{…}}to display a variable name rather than substitute it.
Both are start-time failures, so a campaign with broken spintax stays in Draft rather than sending malformed copy — fix the content and start again.