Warmbly文档

个性化与表达式

合并字段、条件判断、回退值、函数、Spintax 随机文案与自动化表达式:营销活动邮件和自动化流程共用的模板语言。

个性化功能让你只写一封邮件,就能通过 {{.FirstName}} 等合并字段,为每位联系人生成贴合其情况的内容。同一种语言也用于自动化条件和操作文本,无需编程知识。

个性化编写邮件

在营销活动步骤的主题或正文中,输入 {{.FirstName}} 等合并字段。

为可能为空的字段设置回退值:{{.FirstName | default "there"}}。

打开预览,检查渲染结果是否符合预期,且没有残留的 {{...}} 标记。

使用须知

  • 字段名区分大小写:{{.FirstName}} 有效,{{.firstname}} 无效。
  • 未知变量会渲染为空,而不是报错。
  • 每个 {{if}} 都必须用 {{end}} 闭合;格式错误会阻止营销活动启动。
  • {Hi|Hey|Hello} 这样的 Spintax 仅在营销活动的主题和正文中用于变化措辞。
  • 自动化流程使用触发器的小写键,例如 {{.contact_email}},仍必须保留前导点号。

使用 {{.FirstName}} 等合并字段,配合回退值、条件和数学辅助函数,就能让同一封邮件为每位联系人分别生成个性化内容。无需编程知识,按下面的模式书写即可。

目的写法
插入名字{{.FirstName}}
插入发件邮箱的名称{{.Sender.Name}}
插入实际 From 发件地址{{.Sender.Email}}
为字段空值提供替代内容{{.FirstName | default "there"}}
根据条件分支{{if eq .Company "Acme"}}...{{else}}...{{end}}
随机变化措辞(仅营销活动){a|b|c}
按数字筛选自动化流程gtf .confidence 0.8

联系人字段(营销活动)

名称必须准确、大小写正确,并带前导点号:{{.FirstName}}、{{.LastName}}、{{.Email}}、{{.Company}}、{{.Phone}}。

Hi {{.FirstName}}, I noticed {{.Company}} is hiring and wanted to reach out.

字段名区分大小写

{{.FirstName}} 有效。{{.firstname}}、{{.firstName}} 和 {{.FIRSTNAME}} 无效,可能使邮件中对应位置为空,或留下未替换的标记。

自定义字段也使用点号,例如 {{.industry}}、{{.account_owner}}。名称包含空格或连字符的字段也可按原样书写({{if .job title}}...{{end}}),并能在条件和辅助函数等所有位置解析,因为 Warmbly 会自动将其改写为 index 查找。

发件人字段(邮件)

Sender 是结构化邮箱对象。可以在主题、HTML 正文或纯文本正文中,使用 {{.Sender.Name}} 等 Go 模板字段访问方式:

Hi {{.FirstName}}, I'm {{.Sender.Name}} from our team.
You can reach me at {{.Sender.Email}}.

这些值来自实际发送该邮件的邮箱,包括营销活动的发件邮箱轮换和 A/B 版本。营销活动测试邮件、投递位置测试和服务器预览使用各自选中的邮箱;营销活动预览的 From 行也使用相同身份。本地示例预览使用示例数据,不读取真实邮箱。

{{.Sender.Email}} 是收件人看到的 From 地址,包括已配置的发件别名。{{.Sender.MailboxEmail}} 是底层实际连接的邮箱地址。{{.Sender.ReplyTo}} 是明确设置的 Reply-To 邮件头;回复直接发回发件人时,该值为空。

每个字段都区分大小写。使用下表名称时,前面加 .Sender.,例如 {{.Sender.Provider}}:

信息类别字段
身份Name, Email, MailboxEmail, SendAsEmail, ReplyTo, AvatarURL
签名SignaturePlain, SignatureHTML, SignatureSync, SignatureCode
连接Provider, Status, MailHost, AuthMethod, Vendor
发送设置Timezone, CampaignLimit, MinWaitTime, SaveToSent, RelayFolderMoves, Tags
跟踪TrackingDomain, TrackingDomainVerified, TrackingDomainVerifiedAt, TrackDirectMail
域名身份验证AuthState, AuthSPF, AuthDKIM, AuthDMARC, AuthDMARCPolicy, AuthReason, AuthCheckedAt, AuthFailingSince
预热Warmup, WarmupPausedAt, WarmupBase, WarmupMax, WarmupIncrease, WarmupReplyRate, WarmupTag, WarmupPoolType, WarmupStartTime, WarmupEndTime, WarmupDays, WarmupPlacement, WarmupFolder, WarmupRetentionDays
生命周期LastSyncedAt, CreatedAt, UpdatedAt

上限、间隔、数量、回复率、天数和保留时间均为数字。MinWaitTime 的单位为秒,WarmupDays 是已配置发送日的位掩码,WarmupRetentionDays 的单位为天(零表示采用实例默认值)。SignatureSync、SaveToSent 和 AuthSPF 等标志为布尔值,因此可使用 {{if .Sender.SignatureSync}}...{{end}}。AuthDKIM 为 false 表示尚未验证,并不代表缺少 DKIM 记录。Timezone 会回退到工作区时区;时区为空则表示 UTC。预热和跟踪设置取自已保存的邮箱设置,而不是推断出的营销活动覆盖值。

时间戳(包括表示启用预热时间的 Warmup)会渲染为 UTC RFC 3339 字符串,例如 2026-10-05T15:00:00Z;未设置时为空。Tags 是列表,支持原生迭代:

{{range .Sender.Tags}}{{.}} {{end}}
{{.Sender.Name | default "our team"}}

未选择邮箱时,发件人字符串为空,标志为 false,数字为零,标签列表为空。这些字段可用于营销活动邮件和投递位置测试邮件的渲染,但不适用于自动化触发数据、商机名称或收件箱回复模板。未知发件人字段会保留为未解析状态,便于预览标记问题。Sender 是保留名称,不能被联系人自定义字段替代。

仅提供可安全使用的邮箱信息

不会暴露凭据、OAuth 令牌、密码、内部 ID、工作节点路由或同步游标。该对象不提供邮箱方法。如果你手动插入 SignatureHTML 或 SignaturePlain,应关闭该邮箱的自动签名,避免重复落款。

触发器变量(自动化流程)

自动化流程携带触发器的数据,而不是联系人已保存的字段。键名使用小写,引用时必须加前导点号:

New reply from {{.contact_email}} on campaign {{.campaign_id}} ({{.intent}})
触发器变量
收到回复contact_email, contact_id, campaign_id, intent, confidence, subject, snippet;启用收件箱标签时还包括:ai_labels, ai_intent, ai_intent_confidence, ai_kind, ai_relevance, ai_needs_review
创建联系人contact_email, contact_id, first_name, last_name, company, phone, subscribed, source, source_detail, custom_fields(映射,例如 {{.custom_fields.industry}}), campaign_ids, category_ids
提交表单contact_email, contact_id, first_name, last_name, company, phone, form_id, form_name, submission_id, source_url, campaign_id, data(按键提供每项回答,例如 {{.data.team_size}})
会议已预约 / 已改期invitee_name, invitee_email, event_name, scheduled_for, join_url, source, contact_id
会议已取消同上,但不含 join_url
邮件退信、垃圾邮件投诉contact_email, campaign_id, contact_id, event_type, provider, reason
已退订contact_email, contact_id, campaign_id, source
预热健康状态变化email, new_state, previous_state, reason
营销活动操作contact_email, contact_id, campaign_id, campaign_name, first_name, last_name, company, phone

操作文本支持完整模板,而不只是标记替换:条件判断、管道、辅助函数、{{range}} 和嵌套字段({{.lead.company}})都可使用,并且值保留原类型。数字仍是数字,因此可以在消息正文中直接使用 {{if gt .confidence 0.8}}。模板格式错误不会阻塞操作,系统会回退为简单的 {{.key}} 替换。未知键渲染为空。{{range}} 只能遍历数据字段({{range .lead.tags}}),不能遍历数字或函数结果,最多嵌套两层;不支持 {{template}} 和 {{block}},输出上限为 1 MB。超过任何限制时,都会以相同方式回退。

先写字段,再写管道符,然后加 default 和用引号包裹的回退值:

Hi {{.FirstName | default "there"}},
Hope things are going well at {{.Company | default "your company"}}.

{{if}} 仅在条件为真时包含对应文本,{{else}} 处理另一种情况,每个 {{if}} 都必须以 {{end}} 闭合。

{{if .Company}}I see you're at {{.Company}}.{{end}}
{{if eq .Company "Acme"}}Great to connect with the Acme team.{{else}}Great to connect.{{end}}

eq 表示相等,ne 表示不相等。文本值需加引号。

同一组辅助函数可以用于营销活动邮件、自动化条件和操作文本。

数学函数含义字符串函数作用
add sub mul div mod算术运算lower upper title转换大小写
num a强制将值转换为数字trim移除两侧空格
contains判断包含,不区分大小写
hasPrefix hasSuffix判断开头或结尾,区分大小写
has list item判断列表是否包含完整项,不区分大小写
join list sep将列表连接为一行文本

除数或取模的模数为零时返回 0,不会报错,因此这些情况不会破坏邮件。

比较数值

  • 原生比较:gt、lt、ge、le、eq、ne 按原类型比较;值本身已是数字时可直接使用,例如自动化数据中的 confidence。
  • 转换后比较:gtf、ltf、gef、lef 会先将两侧视为数字。值可能是文本时,应使用这些函数,例如联系人自定义字段。

选择原则

比较自动化中的数字时,原生 gt / ge 即可。比较自定义字段或任何可能是文本的值时,使用带 f 的版本,让 "42" 按 42 处理。不确定时,选择带 f 的版本更稳妥。

{{if gtf .deal_size 10000}}Enterprise prospect{{end}}
{{if hasSuffix .Email ".edu"}}As someone in academia, {{end}}I thought this might help.

将选项放在单层花括号中,用竖线分隔,避免一批邮件看起来完全相同:

{Hi|Hey|Hello} {{.FirstName}}, {hope you're well|hope things are good}.

Spintax 规则

仅用于营销活动主题和正文,不在自动化流程中运行。使用单层花括号,不是合并字段的双层花括号。只有包含竖线的分组才会被处理,因此不含竖线的花括号内容(例如 HTML 邮件中的 CSS 或 JSON)保持原样。

用于可视化选择器无法表达的情况。表达式渲染结果为真值时通过;为空、false、0、no、off 或 <no value> 时为假。格式错误的表达式也判为假,不会悄悄放行。

可以直接书写表达式(推荐),也可以在需要 {{else}} 时使用完整模板:

gt .confidence 0.8
{{if gt .confidence 0.8}}yes{{end}}
and (gtf .confidence 0.8) (eq .intent "positive")
or (eq .intent "positive") (eq .intent "neutral")
not (eq .intent "negative")
hasSuffix .contact_email "@acme.com"

and、or 和 not 接受完整判断作为输入,因此组合多组条件时,应为每个判断加括号。

使用位置变量条件判断 / 函数defaultSpintax
营销活动主题与正文联系人字段支持支持支持
自动化条件触发器键支持支持不支持
自动化操作文本触发器键,带点号支持支持不支持
  • 标准字段区分大小写,应写 {{.FirstName}},而不是 {{.firstname}}。
  • {a|b} 是 Spintax(仅限营销活动);{{...}} 则是变量、条件或函数。
  • 每个 {{if}} 都必须用 {{end}} 闭合,并为文本值加引号。
  • 自定义字段比较结果异常时,将 gt/lt 换成 gtf/ltf,或用 num 包裹值。
  • 未知变量渲染为空而不是报错。残留的 {{...}} 通常表示拼写或大小写有误。
  • 操作文本中必须保留前导点号。它采用标准 Go text/template,因此不带点号的 {{contact_email}} 无效。

营销活动:编辑器中的实时预览会针对示例联系人渲染,与实际发送相同,依次处理变量、条件、函数,再处理 Spintax。它会标记格式错误的 {{if}}(这会阻止启动)以及渲染后仍未解析的标记。

自动化流程:保存时会验证高级表达式,无法解析的条件不能保存。参考按钮会在当前界面列出所有变量和函数。

本页目录