Spintax for cold email
Outreach platforms all support spintax, and they all support the same small piece of it: {a|b|c}. This page is about what the rest of the syntax buys you — measured on one real email, with the method in the open — and how to use it when your sending tool only understands braces.
The part they already proved
Cold email breaks on duplicate content. Send one body to a thousand addresses from one domain and the filters see one fingerprint a thousand times. Every outreach vendor now publishes the same answer, and they have argued it better than we would: Mailreach reports inbox placement moving from 59% to 83% after spintax was added to subject lines and openers, and Smartlead cites Backlinko's analysis of 12 million emails for a 30.5% lift in replies on personalised subject lines. Those are their measurements, not ours — we are linking them, not repeating them as findings.
What none of those guides answer is the question underneath: how much variation can their syntax actually produce, and what does it cost the copy?
Where the variation goes
The vendor guides converge on the same five places, and they are the right five: the subject line, the opening line, the value proposition, the proof sentence, and the call to action. The usual advice is three to five spintax groups per email.
Notice what that advice concedes. Three to five groups is a ceiling, not a recommendation — it is where word-swapping stops being safe.
The thesaurus problem
Smartlead's own guide warns against {increase|boost|amplify|skyrocket}, saying it reads like a thesaurus exploded. That is exactly right, and it is the limit of flat spinning: the only way to add variants is to add synonyms, and the fourth synonym is always worse than the first.
Two habits fix most of it, and neither needs new syntax:
- Vary phrases, not words.
{noticed you are hiring|saw the new roles|spotted the job posts}reads as three people writing;{noticed|saw|spotted}reads as one person with a thesaurus. - Fork the smallest span that differs. Never repeat the fixed words inside both branches — the next edit changes one and forgets the other.
But the real escape is not better synonyms. It is varying something other than vocabulary.
Three things your sending tool cannot do
1. Permutations vary order and length, not wording
A permutation shuffles a list and joins it, and it can be told to pick only some of the items:
We help teams [<minsize=2;maxsize=3;sep=", ";lastsep=" and ">like yours|in your space|at your stage|with your stack] ship faster.
→ "We help teams in your space and with your stack ship faster."
→ "We help teams like yours, at your stage and in your space ship faster."
Four items taken two or three at a time, order significant, is 36 distinct outcomes. The same four items in an enumeration would be four. And every one of the 36 is built from fragments the author wrote and approved — nothing was synonym-swapped, so nothing degraded.
2. Conditionals change what the sentence says
A merge tag inserts a value, or a fallback when the value is missing. A conditional decides whether the sentence exists at all:
{?HasCareersPage?I saw you are hiring for %role%.|}
{?RecentFunding?Congratulations on the round.|}
→ the line is there for the prospects it is true about, and absent for everyone else
This is the difference between personalisation and mail-merge. A fallback lets you avoid writing "Hi ," — a conditional lets you avoid claiming something about a company that is not true of it.
3. Plural agreement stops "1 languages"
You are running %n% {plural %n%: campaign|campaigns} right now.
→ "1 campaign" / "4 campaigns"
Every merge-tag sender produces "1 languages" eventually. It is a small thing that reads as carelessness at exactly the moment you are asking a stranger for their attention.
The arithmetic, measured
One realistic five-line cold email, written twice. Version A the way the guides teach it: ten enumerations of three options, plus merge tags. Version B is the same email with two of those enumerations replaced by permutations of four items taken two-to-three. No new copy — the author supplied a fourth list item instead of a third.
| Combinations | Duplicate bodies in 20,000 sends | |
|---|---|---|
| A — flat spinning | 59,049 | ~3,035 |
| B — same email, two permutations | 8,503,056 | ~24 |
A factor of 144, for two edits.
The second column is the one that matters and the one nobody publishes. What affects you is not how many variants could exist but how many recipients receive a body someone else already received — a birthday-collision problem, C · (1 − e−N/C) for C combinations and N sends.
We did not take that on faith either. The model predicts 16,965 distinct bodies for version A at 20,000 sends; rendering 20,000 of them through @spintax/core produced 16,981. For version B: 19,976 predicted, 19,971 measured. You can reproduce it in the playground with the same template.
Render first, then send
Here is the honest part: none of this runs inside Instantly, Smartlead, lemlist or Saleshandy. They parse {a|b|c} and their own merge tags, and nothing else. A permutation pasted into their editor will be sent to your prospect verbatim, brackets and all.
So invert the order. Instead of sending a template and letting the platform spin it, spin it yourself and send finished text:
- Write the template with the full syntax and check it in the playground.
- Render one body per recipient locally —
@spintax/corein a script, or Spintax Studio, which generates a set and exports it straight to XLSX. - Upload the column with your list and reference it as a merge field.
Two things improve as a side effect. You can read the variants before they go out, which you cannot do when the platform spins at send time. And a seed makes the run reproducible, so the same list regenerates identically when you need to explain what a prospect received.
Before you send
- Twenty variants rendered and actually read, not one.
- Every conditional seen in both states — present and absent.
- Counted nouns going through
{plural …}, checked at 1 and at 5. - No synonym group whose fourth option you would not have written by hand.
- Every variable in the template present in the list, or the tag ships verbatim.
- Links on your own domain.
The constructs, in full
Permutations for order and length. Conditionals for value-driven lines. Plural agreement for counted nouns. If a model is writing the first draft of the template, the workflow for that is its own page.