给一个人发一个模板,不必打开收件箱。像跟同事说话一样,在与 Octo 的聊天里打出你的 请求,Octo 就会找到模板并填好变量。它不会马上发送:它会把即将发出的内容原样 给你看,只有你点击 确认 之后才会发出。这次发送走的是和收件箱、API 相同的路径, 所以会经过同样的检查,也会落在同一个对话里。
这是给一次一位收件人用的。要发给整个列表,请用 营销活动。WhatsApp 为什么 需要模板,见 什么时候 WhatsApp 消息必须是模板。
一个请求示例
潮汐洗衣店有一个已批准的实用类模板 pickup_confirmation,正文是
{{1}}您好,您的取件已确认在{{2}}。如需更改,请直接回复。
安娜上周来问过洗被子的事,说回头再联系,之后就再也没来消息。你输入:
给林安娜发取件确认,时间是周二上午 9–11 点。
Octo 被设定为按这个顺序处理:
- 找到安娜。 名字会在你的联系人里查找;电话号码可以直接使用。无论哪种,最后都
必须是国际格式(
+14255550123)—— 其他格式都会被发送拒绝。 - 查看她上次联系的时间。 安娜上次在 WhatsApp 上发消息的时间,告诉 Octo 24 小时 窗口是否打开,以及今天是否已经有人给她发过消息。
- 找到模板。 Octo 按名称和显示名称搜索你的模板,只看已批准的。
- 填写变量 ——
{{1}}=安娜,{{2}}=周二上午 9–11 点—— 并准备好这次 发送。Octo 会说它已经准备好、等你确认;它不会说“已发送”。 - 等你。 聊天里会出现一张卡片 —— 见下文。在你点击 确认 之前,安娜什么都 收不到。
每一步 Octo 都会用自己的话来描述。本篇其余部分讲的检查,每次都由发送本身来执行。
说清楚用哪个模板,以及每一个值
你的请求说得越具体,Octo 需要替你选的就越少:
给 +14255550123 发
pickup_confirmation模板。名字:安娜。时段:周二上午 9–11 点。
如果你只描述消息内容,Octo 会挑最合适的已批准模板,并告诉你它选了哪个。如果你的 请求里缺了某个变量,要么补上,要么等它来问 —— 模板永远不会带着空位发出去(见下文)。
带按钮的模板也可以。潮汐洗衣店那个带 复制验证码 按钮的营销类模板,会把优惠码当作 一个值:
给王浩发
duvet_promo模板,优惠码是 FRESH20。
发送前先确认
在控制台的聊天里,准备好的发送会显示为一张卡片,标题是 发送这个 WhatsApp 模板?:
| 行 | 显示内容 |
|---|---|
| 收件人 | 要发往的号码 —— +14255550123 |
| 模板 | 模板及其语言 —— pickup_confirmation(zh_CN) |
| 变量值 | 每个值和它填入的位置,按顺序:先页眉,再正文,再按钮 —— 正文 1 → 安娜、正文 2 → 周二上午 9–11 点 |
| … 过期 | 这个请求什么时候失效:Octo 准备好之后 24 小时 |
然后是 确认 或 取消。
- 确认 就会发送。卡片变成 已发送,聊天里会出现一条备注:Done ✅ — Template “pickup_confirmation” sent to +14255550123 via WhatsApp. 如果 WhatsApp 或下面某项 检查拒绝了它,卡片会显示 未发送 并附上原因。
- 取消 不会发送任何东西。卡片显示 已取消 — 未发送任何内容。
- 什么都不做 也不会发送任何东西。24 小时后卡片显示 已过期 — 未发送任何内容。
几个要紧的细节:
- 看值,不要只看号码。 卡片是发现填错位置或打错字的最后机会。要改什么,就取消后 重新提出请求。
- 按钮会等 Octo。 Octo 还在写回复时,卡片会显示 请等 Octo 回复完毕后再确认。
- 几个模板,就有几张卡片。 在一个聊天里请求两次发送,你会得到两张卡片;每张都 单独确认或取消。
- 之后再回来也是安全的。 刷新页面,卡片会显示实际发生了什么。已经发送、已取消 或已过期的请求,再也不会显示可用的按钮,连点两次 确认 也不会发两次。
- 谁能确认。 只有向 Octo 提出请求的人,或者工作区的所有者或管理员,才能确认或 取消它。
通过邮件、WhatsApp 或 Slack 与 Octo 对话时
Octo 在那里也会先问。消息会说明它要做什么,并附一个短代码。通过邮件时,你回复这个 代码;在 WhatsApp 和 Slack 上,还有 Confirm 和 Cancel 按钮。你批准的那一行会 写明模板、号码和各个值:
Send WhatsApp template "pickup_confirmation" (en_US) to +14255550123 — body 1: "Ana", body 2: "Tuesday, 9–11am"
名称看起来像验证码的位置 —— otp、pin、token —— 它的值在这一行里会显示为
••••。无人回应的请求在 24 小时后过期,不会发送任何东西。
Octo 会拒绝什么
所有拒绝都发生在联系 WhatsApp 之前,而且 Octo 会被告知原因。
| 情况 | 结果 |
|---|---|
| 模板处于待审核、已拒绝、已暂停或已停用状态 | 拒绝:只有已批准的模板才能发送。 |
| 缺少某个变量,或者给了空值 | 拒绝,并指出是哪个位置 —— 比如 body is missing variable “customer_name”,或者正文需要 2 个值却只收到 1 个。 |
| 某个值太长 | 拒绝。复制码最多 15 个字符。 |
| 模板带图片、视频或文件页眉 | Octo 无法提供文件,所以发送会被拒绝。请从你自己的系统发送,它接受 Meta 完整的模板 payload。 |
| 模板所属的 WhatsApp 号码已不再启用 | 拒绝。 |
| 工作区还没有设置计费 | 以 Billing setup required 拒绝。 |
| 号码发送得太快,或已达到每日上限 | 拒绝,并给出需要等待的时间。Octo 会拿到这个等待时间,告诉你什么时候再试;它并不会自己去重试。见一个号码能发多快。 |
下面这些拒绝会在对话里留下一条没发出去的消息,作为这次尝试的记录:
- 顾客已退订 WhatsApp 消息。 记录为已拦截。Octo 无法绕过退订。
- WhatsApp 号码仍在等待验证。
- 工作区已被暂停,或者目标地区没有为它开通。 记录为失败。
- Meta 拒绝了这条消息。 记录为失败;Octo 会拿到 Meta 的错误,可以换别的值重试。
用自由格式文本代替模板
如果窗口是打开的,Octo 可以原样发送你的话。说一句 “WhatsApp 告诉安娜:司机还有十分钟 到”,如果安娜在过去 24 小时内在这个号码上发过消息,这段文字就会作为普通消息发出。
如果没有,自由格式文本的发送会以窗口已关闭为理由被拒绝。Octo 不会蒙混过关:它必须 改用已批准的模板,没有合适的模板时,它会直接告诉你。它可以帮你创建一个,但新模板也 要先经过 Meta 批准,才能有人收到。 把 WhatsApp 模板导入 Omni Octo 讲了这部分。
消息落在哪里
- 由哪个号码发出。 模板属于某一个 WhatsApp 号码,所以模板决定了发件号码。如果 你有两个号码,请点名同步在你想用的那个号码上的模板。
- 落在哪个对话。 顾客的消息原本所在的同一个对话,和 从你自己的系统发送 完全一样。安娜回复时,她的回复会进入这个对话。
- 谁来回答回复。 Octo 不会接管对话。如果原来是 AI 智能体在处理,现在仍然是它; 如果你已经接管了,对话仍在你手里。这一点和 在对话中发送 不同,那里你要先接管。
- 显示什么。 对话里的这条消息显示填入了值的正文,记录为由你发送。它一开始是已发送 状态;已送达、已读或失败会在之后由 Meta 回报。
Octo 回复里的“已发送”表示 Meta 接受了这条消息,不代表安娜已经收到 —— 而且营销类 模板可能永远不会送达。
请求两次就会发两次
每个请求都是一张新卡片,每张确认过的卡片都是一次新的发送。跨请求之间没有“已经发过” 的检查:如果你再请求一次,或者在一次其实已经发出的发送之后让 Octo“再试一次”,并且 两张都确认了,安娜就会收到两次模板 —— 每一次都计入这个号码的上限。确认重发之前,先 看看上一张卡片的状态。
Octo 做不到的事
- 发给一个列表。 一个请求对应一位收件人;请用 营销活动。
- 发送带媒体页眉的模板。 它没有办法提供文件。
- 绕过退订,或者发送未批准的模板。
- 在窗口关闭时把自由格式文本混过去。
聊天之外的 Octo
当和 Octo 对话的是程序而不是人时,发送仍然要等一个人:
| 程序连接的位置 | 结果 |
|---|---|
/mcp —— 用 send_message 把任务交给 Octo | 挂起。结果里带一个含代码的 pending_action。在有人于同一对话中回复 YES <code> 之前,不会发送任何东西。 |
/mcp/tools —— 直接调用 Octo 的工具 | 以 confirmation_required 拒绝。 |
/v1,会保存的对话 | 同样挂起,等待 YES <code> 回复。 |
/v1,不保存任何内容的请求 | 根本不提供。 |
如果你自己的软件需要在不经人工逐条批准的情况下发送模板,请直接调用模板发送端点 —— 从你自己的系统发送模板。