AI PLAY玩法更新持续收录
← 回到更新流

2026-09-29 · 原文发布日

n8n模板:按序列定时发送短信和语音外呼

这个n8n工作流每15分钟从Supabase经RPC认领到期外触达任务(未配置时用内置样例队列),按序列阶梯决定下一条短信或语音触达,渲染短信正文或通话变量,执行候选人所在时区的静默时段、周末规则、每日上限并生成幂等键防重复。发送经Twilio发短信或Retell发起外呼,响应分类为成功、临时失败或永久失败(含运营商退订),据此推进、退避重试或终止序列,并把触达记录、状态和退订写回Supabase,可选发Slack运行摘要。支持预览模式先演练。

原文要点

muhd dahlan在n8n发布的免费模板:每15分钟经Supabase RPC认领到期外触达任务(未配置时用内置样例队列),按序列阶梯决定下一条短信或语音,渲染正文或通话变量,执行候选人所在时区的静默时段、周末规则、每日上限并生成幂等键防重复;发送走Twilio短信或Retell外呼,响应分为成功、临时失败、永久失败(含运营商退订),据此推进、退避或终止,记录写回Supabase,可选Slack摘要,支持预览模式演练。

这次做成什么

复刻这套序列外呼的核心逻辑:定时认领→阶梯决策→合规检查→双渠道发送→结果分类回写,并先在预览模式下用样例队列跑通,不接真实Twilio/Retell也能验证决策正确性。

准备什么

  • 一个n8n实例(Schedule Trigger、Code、HTTP Request节点即可起步)
  • Supabase项目(自建RPC与表,或先用内置样例队列)
  • 可选:Twilio账号(SID、令牌、发送号码)用于真实短信
  • 可选:Retell API密钥、agent ID和主叫号码用于语音外呼

具体怎么做

  1. 配置与定时器

    用Schedule Trigger设每15分钟触发。建一个Config(Code)节点集中放:序列模板(如第1天短信、第3天语音、第7天短信)、静默时段(如当地时间21:00至次日9:00)、周末是否禁发、每日发送上限、永久失败错误码清单、DEMO_MODE开关。

  2. 认领到期任务

    配置了Supabase时,用HTTP Request调用你的RPC函数认领一批到期任务,传入批次大小;未配置时在Code节点返回下方样例队列,保证流程可离线演练。每条任务含候选人ID、姓名、电话、时区、当前阶梯位置和状态。

  3. 阶梯决策与合规检查

    在Code节点对每条任务:按序列确定下一步是SMS还是voice并渲染正文变量(如姓名);将当前UTC时间换算到候选人时区,命中静默时段或禁发周末则推迟到下一允许窗口;超过每日上限则顺延;最后用候选人ID+阶梯序号+日期生成幂等键。

  4. 发送或预览

    DEMO_MODE开启时只输出"将发送什么"的预览对象,不调任何外部API。关闭后:短信走HTTP Request调Twilio消息API(Basic Auth用SID:令牌,Body含From/To/Body);语音走Retell外呼API(Authorization Bearer密钥,含agent_id和变量)。

  5. 结果分类与回写

    解析服务商响应:成功→推进阶梯并记录attempt;临时失败(如限流、5xx)→标记稍后按退避重试;永久失败(配置中的错误码,含运营商退订)→终止序列并把号码写入opt_outs表,后续任务对该号码直接跳过。最后汇总本轮统计,配置了Slack webhook就POST一条摘要。

可直接复制的材料

内置样例队列(练习数据)

本站虚构样例,对应模板所说的内置队列;号码为占位格式,不产生真实外呼。

[
  {"enrollment_id":"ENR-1001","candidate":"陈一鸣","phone":"+8613900000001","timezone":"Asia/Shanghai","step_index":0,"status":"active"},
  {"enrollment_id":"ENR-1002","candidate":"Sarah Lee","phone":"+14150000002","timezone":"America/Los_Angeles","step_index":1,"status":"active"},
  {"enrollment_id":"ENR-1003","candidate":"王梓","phone":"+8613900000003","timezone":"Asia/Shanghai","step_index":2,"status":"active"}
]

序列与合规配置示例

本站整理示例;错误码请对照你所用Twilio文档核对,模板正文也允许自定义永久错误码清单。

{
  "sequence": [
    {"step": 0, "channel": "sms", "day": 1, "template": "{{name}}您好,您申请的职位有新进展,方便聊两句吗?回复N退订"},
    {"step": 1, "channel": "voice", "day": 3, "variables": ["name", "role"]},
    {"step": 2, "channel": "sms", "day": 7, "template": "{{name}}您好,最后一次提醒:岗位本周截止,有意请回复1"}
  ],
  "quietHours": {"start": "21:00", "end": "09:00"},
  "skipWeekends": true,
  "dailyCap": 200,
  "permanentSmsErrorCodes": ["21610", "30007", "30034"],
  "demoMode": true
}

输入与输出示例

本站虚构推演,用于说明静默时段+周末规则的叠加效果,非模板实测输出。

输入

15分钟批次认领3条到期任务(样例队列全部),当前UTC为周六13:00(上海21:00,洛杉矶06:00),DEMO_MODE开启。

对应输出

预览输出:ENR-1001(上海21:00命中静默时段)→推迟到周日09:00;但skipWeekends为true→再顺延到周一09:00,渠道sms,渲染正文"陈一鸣您好,您申请的职位有新进展……",幂等键ENR-1001-step0-20261005。ENR-1002(洛杉矶06:00命中静默)→顺延到周一09:00,渠道voice。ENR-1003同理顺延。本轮实际发送0条,Slack摘要:认领3、推迟3、发送0、失败0。

做完检查这些

  • DEMO_MODE下整轮运行不产生任何Twilio或Retell请求,只输出预览对象
  • 同一任务重复认领时幂等键一致,不会生成第二条发送记录
  • 命中静默时段或周末的任务被推迟而非直接发送,且推迟时间落在允许窗口
  • 把一条号码写入opt_outs后,该号码后续任务被跳过并终止序列

容易卡住的地方

  • Supabase的RPC、队列表和幂等唯一约束需自行按模板说明创建,缺了唯一约束防重复会失效
  • 短信与语音外呼涉及真实通信法规(如退订义务),练习之外上线前需自行确认当地合规要求
  • Twilio和Retell均为付费服务,真实发送会产生费用,费用随用量和地区变化
  • 候选人时区字段缺失或格式错误会导致静默时段判断错误,入队前应先校验

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Send scheduled SMS and voice outreach from Supabase via Twilio and Retell
原作者
muhd dahlan
原始发布日期
2026-09-29T03:26:26.848Z
来源
https://n8n.io/workflows/20112