在 Marketing Automation 里增加一个短信节点,很多人会把它当作“多一种触达渠道”。但 enterprise/marketing_automation_sms/models/marketing_activity.py、marketing_trace.py 和 sms_tracker.py 说明,短信一旦进入自动化,它就不再只是消息发送,而是完整 trace 图的一部分。
一、SMS 活动会改变 activity 和 trigger 的分类体系
_compute_mass_mailing_id_mailing_type() 在 activity_type == 'sms' 时把 mailing type 设成 sms;_compute_trigger_category() 则把 sms_click、sms_not_click、sms_bounce 归到短信类别。也就是说,短信节点并不是沿用邮件自动化的旧模型,而是拥有自己的一套触发语义。
这很重要,因为自动化引擎要区分“短信未点击”和“邮件未打开”,两者不是同一类业务事件。
二、未点击短信可以触发重排,不是一次性结束
_get_reschedule_trigger_types() 把 sms_not_click 加进了可重排 trigger 集。也就是说,短信活动不是发完就结束;如果客户没点击,系统允许把后续动作重新安排在未来某个时间点继续尝试。
这正是自动化与群发的分水岭。群发只关心有没有发出去,自动化则关心“接下来该不该继续追”。
三、执行短信前先校验权限,失败后要把 trace 写成 error
_execute_sms() 一开始就检查用户是否是管理员或营销自动化组成员,然后才通过 mass_mailing_id.sudo().action_send_sms(res_ids) 发送。如果过程中异常,源码会记录 warning,并把 traces 写成 state = error。
这说明短信自动化不是一个“后台偷偷发”的黑盒:谁有权启动、失败后 trace 进入什么状态,都被纳入了正式流程控制。
四、点击和退信会反向改写子 trace 的命运
marketing_trace.py 里的 process_event() 在收到 sms_click 时,会取消那些等待 sms_not_click 的子 trace;收到 sms_bounce 时,则会取消其他不该继续跑的子 trace。sms_tracker.py 里 _update_sms_traces() 也会在 bounce 时主动把事件传播到 marketing trace。
这表示自动化树并不是“每个节点各跑各的”,而是一个有因果关系的状态图:父短信点击了,等待“未点击”的分支就该关掉;父短信退信了,其他依赖正常送达的后续也要停。
实战注意事项
- 把短信节点放进完整自动化图里设计:不要只看发送动作。
- 认真定义 click / not click / bounce 分支:这直接决定后续客户旅程。
- 监控 error traces:发送异常不会自动消失,它们是流程质量的重要信号。
- 限制操作权限:源码先验权再 sudo,说明短信自动化是高影响动作。
新手误区
- 误以为短信节点只是邮件节点的轻量版。
- 误以为短信发出后流程就结束。
- 误以为 bounce 只影响发送报表,不影响自动化分支。
- 误以为失败 trace 不需要运营关注。
主要源码参考
enterprise/marketing_automation_sms/models/marketing_activity.pyenterprise/marketing_automation_sms/models/marketing_trace.pyenterprise/marketing_automation_sms/models/sms_tracker.py
DISCUSSION
评论区