Spintax 用于冷邮件:你实际能得到多少种变体
外发平台都支持 spintax——而且支持的都是同一小块:{a|b|c}。本文讲其余语法能带来什么——在一封真实邮件上实测,方法公开——以及当你的发送工具只认花括号时,怎么把它们用起来。
别人已经证明过的部分
冷邮件(外贸圈叫开发信)栽在重复内容上。同一个正文从一个域名发给一千个地址,过滤器就会把同一个指纹看到一千次。如今每家外发厂商给出的答案都一样,而且论证得比我们更好:Mailreach 报告在主题行和开场白加入 spintax 后,进收件箱率从 59% 升到 83%;Smartlead 则引用 Backlinko 对 1200 万封邮件的分析——个性化主题行让回复率提升 30.5%。这些是他们的测量,不是我们的——我们在引用它们,不是把它们当成自己的结论。
但这些指南都没有回答再往下一层的问题:他们那套语法到底能产生多少变化,文案又为此付出什么代价。
变化该放在哪里
各家指南收敛在同样五个位置,而且选得没错:主题行、开场白、价值主张、证据句和行动号召。常见建议是每封邮件三到五个变体组。
注意这条建议承认了什么。三到五组是天花板,不是推荐值——再往上,换词就不再安全。
同义词词典问题
Smartlead 自家的指南就警告不要写 {increase|boost|amplify|skyrocket},说它读起来像同义词词典爆炸了。说得完全对,而这正是扁平换词的极限:增加变体的唯一办法是堆同义词,而第四个同义词永远比第一个差。
两个习惯能解决大部分问题,都不需要新语法:
- 变化短语,而不是单词。
{noticed you are hiring|saw the new roles|spotted the job posts}读起来像三个不同的人在写;{noticed|saw|spotted}读起来像一个人抱着词典。 - 只分叉真正不同的最小片段。不要把固定的词重复进两个分支——下次修改会改了一个、忘了另一个。
但真正的出路不是更好的同义词,而是去变化词汇之外的东西。
你的发送工具做不到的三件事
1. 排列改变顺序和长度,而不是措辞
排列会打乱一个列表再拼接,还可以指定只取其中几项:
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."
四个条目取两到三个、顺序有意义,就是 36 种不同结果。同样四个条目放进普通枚举只有四种。而这 36 种全部由作者亲手写、亲手认可的片段拼成——没有任何东西被同义词替换,所以没有任何东西被写坏。
2. 条件改变句子说什么
合并标签插入一个值,缺值时给个兜底。条件则决定这句话是否存在:
{?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
这就是个性化和邮件合并的区别。兜底值帮你避免写出 "Hi ,"——条件则帮你避免对一家公司声称对它并不成立的事。
3. 数量一致杜绝 "1 languages"
You are running %n% {plural %n%: campaign|campaigns} right now.
→ "1 campaign" / "4 campaigns"
只有合并标签的发送工具迟早都会产出 "1 languages"。这是件小事,但恰恰在你向陌生人讨要注意力的那一刻,读起来就是粗心。
算术,实测
一封真实的五行冷邮件,写了两遍。版本 A 按指南教的写:十个三选一的枚举,加上合并标签。版本 B 是同一封邮件,把其中两个枚举换成四项取二到三的排列。没写任何新文案——作者只是在第三个列表项之外补了第四个。
| 组合数 | 20,000 封中的重复正文 | |
|---|---|---|
| A——扁平换词 | 59,049 | ~3,035 |
| B——同一封邮件,两个排列 | 8,503,056 | ~24 |
144 倍,只改了两处。
第二列才是关键,也是没人公布的那一列。影响你的不是可能存在多少变体,而是有多少收件人收到了别人已经收到过的正文——一个生日碰撞问题:组合数为 C、发送量为 N 时,是 C · (1 − e−N/C)。
这一点我们也没有凭空相信。模型预测版本 A 在 20,000 封时有 16,965 个不同正文;用 @spintax/core 实际渲染 20,000 封,得到 16,981。版本 B:预测 19,976,实测 19,971。你可以在演练场EN里用同一个模板复现。
先渲染,再发送
诚实的部分来了:以上这些没有一样能在 Instantly、Smartlead、lemlist 或 Saleshandy 里面运行。它们只解析 {a|b|c} 和自家的合并标签,仅此而已。把排列贴进它们的编辑器,会连同方括号一起原样发给你的潜在客户。
所以把顺序倒过来。别把模板交给平台去转,自己先转好、发送成品文本:
- 用完整语法写模板,在演练场EN里检查。
- 在本地为每个收件人渲染一份正文——脚本里用
@spintax/core,或者用 Spintax Studio,它能批量生成并直接导出 XLSX。 - 把这一列和名单一起上传,当作合并字段引用。
顺带改善两件事。变体可以在发出前读到——平台在发送时才转的话做不到。seed 让整次运行可复现:需要说明某个潜在客户到底收到了什么时,同一份名单能一字不差地重新生成。
或者,把这座桥自动化
上面三步也是一个可以不再手工做的工作流。n8n 社区节点在 n8n 里运行同一个引擎:线索来源进,按行渲染好的主题和正文出,最后接你发送工具自己的 n8n 节点——按线索的 seed 保证每个客户的文案在重跑时保持稳定。现成的可导入工作流把这一切连好了;在发送平台原生支持完整语法之前,这个节点就是通往它的无代码路径。
发送之前
- 渲染并真正读过二十个变体,而不是一个。
- 每个条件的两种状态都亲眼见过——句子在,与句子不在。
- 可数名词都走
{plural …},在 1 和 5 上各验一次。 - 没有任何一个同义词组,其第四个选项是你不会亲手写出来的。
- 模板里的每个变量都在名单里,否则标签会原样发出。
- 链接在你自己的域名上。
完整语法构件
排列 管顺序和长度。条件 管随数据变化的句子。数量一致 管可数名词。如果模板初稿由模型来写,那套工作流有自己的页面。