1|# 子系统 04 — 多渠道触达引擎 (`outreach`) v1.0 2| 3|## 子系统概述 4| 5|| 维度 | 说明 | 6|| --- | --- | 7|| 代号 | `outreach` | 8|| 核心职责 | 渠道路由决策、渠道去重、IM/EDM/APP Push/TEL 渠道调度执行、触达历史管理 | 9|| 数据所有权 | `channel_route_decisions`, `channel_dedup_records`, `im_interaction_records`, `im_flow_tags`, `edm_message_events`, `edm_user_behavior_profiles`, `app_touch_events`, `tel_call_records` | 10|| 启动依赖 | identity / planning / quota(均为软依赖) | 11|| 外部系统依赖 | JOYHUB(IM 通道)、ESP(EDM)、FCM/APNs(APP Push)、电话系统(TEL) | 12| 13|--- 14| 15|## 1. 模块划分 16| 17|``` 18|┌─────────────────────────────────────────────────────────────┐ 19|│ outreach 子系统 │ 20|│ │ 21|│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 22|│ │ M1: 渠道路由 │ │ M2: 渠道去重 │ │ M3: IM 执行 │ │ 23|│ │ + 优先级 │→│ │→│ 引擎 │ │ 24|│ └──────────────┘ └──────────────┘ └──────┬───────┘ │ 25|│ │ │ 26|│ ┌──────────────┐ ┌──────────────┐ ┌──────┴───────┐ │ 27|│ │ M4: EDM 执行 │ │ M5: APP Push │ │ M6: TEL 执行 │ │ 28|│ │ 引擎 │ │ 引擎 │ │ 引擎 │ │ 29|│ └──────────────┘ └──────────────┘ └──────────────┘ │ 30|│ │ 31|│ ┌──────────────┐ ┌──────────────┐ │ 32|│ │ M7: 触达历史 │ │ M8: 对外 API │ │ 33|│ │ 服务 │ │ Gateway │ │ 34|│ └──────────────┘ └──────────────┘ │ 35|│ │ 36|└─────────────────────────────────────────────────────────────┘ 37|``` 38| 39|| # | 模块 | 职责 | 40|| --- | --- | --- | 41|| M1 | 渠道路由+优先级 | 按用户状态路由到最优渠道(APP活跃→IM优先 / 未注册→EDM优先 / 高价值无响应→TEL / C类→IM免评卡片) | 42|| M2 | 渠道去重 | 同一计划同一用户不重复走多渠道路由;工单中暂停自动触达;已提交待核验暂停催评 | 43|| M3 | IM 执行引擎 | IM 推送、用户分层(A未参与/B参与过/C长期测评人)、回评/测评/免评卡片推送、催评、提交核验、返款通知 | 44|| M4 | EDM 执行引擎 | EDM 发送、送达/打开/点击追踪、行为画像、节奏控制、退订/硬退信处理 | 45|| M5 | APP Push 引擎 | APP 推送、触发源管理(绑定玩具/不活跃/计划到期/Listing紧急/活动)、响应追踪 | 46|| M6 | TEL 执行引擎 | 电话任务生成、拨打前准备(用户画像+风险检查+历史沟通)、通话记录、重试策略 | 47|| M7 | 触达历史服务 | 统一触达历史查询(跨渠道聚合)、供 quota(频控)、identity(上下文卡)调用 | 48|| M8 | 对外 API Gateway | 统一对外 API | 49| 50|--- 51| 52|## 2. 各模块内外说明 53| 54|### 2.1 M1: 渠道路由+优先级 55| 56|| 维度 | 说明 | 57|| --- | --- | 58|| **对内** | 接收 planning 的已批准计划,按用户状态矩阵决定渠道:APP活跃+已绑定→IM首选;APP低活跃→EDM补充+APP Push召回;未注册→EDM首选→引导注册后转IM;高价值+多次无响应→TEL;C类(累计≥12)→IM免评卡片+KOC/KOL协同 | 59|| **对外接口** | `POST /api/outreach/route` — 输入计划+用户,返回路由决策 | 60|| **数据写入** | `channel_route_decisions` | 61|| **依赖** | `GET /api/identity/context/{person_id}` — 用户状态 | 62| 63|### 2.2 M2: 渠道去重 64| 65|| 维度 | 说明 | 66|| --- | --- | 67|| **对内** | 执行去重规则(同一计划同一用户首选渠道、工单中暂停、已提交评价暂停、退订某渠道永久排除、强关联风险全暂停、弱关联降频+提示) | 68|| **对外接口** | `GET /api/outreach/dedup-check?person_id=&plan_id=` | 69|| **数据写入** | `channel_dedup_records` | 70|| **依赖** | `GET /api/tickets?person_id=&status=open`(support);`GET /api/risk/check/{person_id}`(risk) | 71| 72|### 2.3 M3: IM 执行引擎 73| 74|| 维度 | 说明 | 75|| --- | --- | 76|| **对内** | 用户分层逻辑(A未参与/B参与过但<12/C≥12长期测评人);分层推送策略(A推回评卡片/B先催评再二次转化/C仅免评);提交后的核验与流转(订单号核实→登记→补全信息→返款→二次转化);标签管理(9 种核心标签如「xx产品已回评用户」「xx产品测评待返款用户」等) | 77|| **对外接口** | `POST /api/outreach/im/send` — 发送 IM 消息 | 78|| **数据写入** | `im_interaction_records`, `im_flow_tags` | 79|| **依赖** | JOYHUB(IM 通道);`GET /api/quota/check/{person_id}` | 80|| **待确认** | IM 是 WhatsApp 还是自研 IM?通道对接方式? | 81| 82|### 2.4 M4: EDM 执行引擎 83| 84|| 维度 | 说明 | 85|| --- | --- | 86|| **对内** | 推送前检查(身份→风险→退订→资格→国家);行为筛选(打开/点击/回复/频率);节奏判断(适合触达/需降频/不适合);发送后追踪(送达→打开→点击→回复→退订);转化路径(下载注册APP→转IM / 直接回复邮件→生成客服工单 / 未响应→再触达队列) | 87|| **对外接口** | `POST /api/outreach/edm/send` — 发送 EDM | 88|| **数据写入** | `edm_message_events`, `edm_user_behavior_profiles` | 89|| **依赖** | ESP 邮件服务 | 90|| **待确认** | EDM 模板在哪里管理?模板变量(用户名/产品名/链接)如何填充? | 91| 92|### 2.5 M5: APP Push 引擎 93| 94|| 维度 | 说明 | 95|| --- | --- | 96|| **对内** | 5 种触发源(绑定新玩具/不活跃/计划到期/Listing紧急/活动);推送前过滤(身份+风险+频控+标签);响应追踪(点击打开→落地页 / 忽略→短期不重复推 / 卸载→转EDM候选池);APP 内动作分流(提交回评/测评→IM核验 / 联系客服→工单 / 浏览→更新活跃标签) | 97|| **对外接口** | `POST /api/outreach/app/push` — 发送 APP Push | 98|| **数据写入** | `app_touch_events` | 99|| **依赖** | FCM/APNs | 100|| **待确认** | 是否复用 JOYHUB 现有 Push 通道? | 101| 102|### 2.6 M6: TEL 执行引擎 103| 104|| 维度 | 说明 | 105|| --- | --- | 106|| **对内** | 7 种触发场景(答应配合超时/高价值跟进/复杂售后/多次无响应/紧急Listing/Amazon来电/外呼任务);拨打前准备 5 步(查用户完整画像→查风险→查历史沟通→准备话术→生成电话工单);通话结果 5 种(售后问题解决→引导回评 / 直接配合→登记答应配合 / 拒绝→记录 / 疑似诈骗→转风险 / 未接通→重试);重试策略(<3次重拨 / ≥3次降级EDM或关闭) | 107|| **对外接口** | `POST /api/outreach/tel/task` — 创建 TEL 任务 | 108|| **数据写入** | `tel_call_records` | 109|| **依赖** | 电话系统(外呼/来电) | 110| 111|### 2.7 M7: 触达历史服务 112| 113|| 维度 | 说明 | 114|| --- | --- | 115|| **对内** | 跨渠道聚合触达历史(IM/EDM/APP/TEL);提供统一查询接口供 quota(频控)和 identity(上下文卡)消费 | 116|| **对外接口** | `GET /api/outreach/history/{person_id}` | 117|| **数据写入** | 只读聚合 | 118| 119|--- 120| 121|## 3. 对外 API 契约(草案) 122| 123|| 接口 | 方法 | 输入 | 输出 | 消费者 | 124|| --- | --- | --- | --- | --- | 125|| 触达历史 | `GET /api/outreach/history/{person_id}` | person_id | `{im[], edm[], app[], tel[]}` | quota(频控), identity(上下文卡) | 126|| 执行触达 | `POST /api/outreach/send` | `{plan_id, person_ids[], channel, content}` | `{task_id, status}` | planning | 127|| 渠道路由决策 | `POST /api/outreach/route` | `{person_id, plan_id}` | `{recommended_channel, alternatives[]}` | planning | 128|| IM 消息发送 | `POST /api/outreach/im/send` | `{person_id, msg_type, content}` | `{message_id}` | 内部 | 129| 130|--- 131| 132|## 4. 数据对象 133| 134|| 对象 | 核心字段 | 说明 | 135|| --- | --- | --- | 136|| `channel_route_decisions` | decision_id, person_id, plan_id, selected_channel, reason, decided_at | 渠道路由决策 | 137|| `channel_dedup_records` | dedup_id, person_id, plan_id, channel, status(BLOCKED/ALLOWED), block_reason | 渠道去重记录 | 138|| `im_interaction_records` | interaction_id, person_id, msg_type(PUSH_CARD/REVIEW_CARD/EXEMPTION_CARD/REMINDER/REFUND_NOTICE), direction(OUTBOUND/INBOUND), content, status, created_at | IM 交互记录 | 139|| `im_flow_tags` | tag_id, person_id, tag_type, tag_value, tagged_at | IM 流程标签(如 xx产品待返款等) | 140|| `edm_message_events` | event_id, person_id, email, event_type(SENT/DELIVERED/OPENED/CLICKED/REPLIED/UNSUBSCRIBED/HARD_BOUNCED), occurred_at | EDM 事件 | 141|| `edm_user_behavior_profiles` | profile_id, person_id, email, last_opened_at, total_opens, consecutive_no_open, last_replied_at, monthly_received, status | EDM 用户行为画像 | 142|| `app_touch_events` | event_id, person_id, trigger_type, push_status, response, occurred_at | APP Push 事件 | 143|| `tel_call_records` | call_id, person_id, ticket_id, direction(OUTBOUND/INBOUND), call_status, duration, outcome, retry_count, recorded_at | TEL 通话记录 | 144| 145|--- 146| 147|## 5. 业务澄清问题清单 — outreach 148| 149|### 5.1 渠道优先级路由(4 项) 150| 151|| # | 问题 | 优先级 | 152|| --- | --- | --- | 153|| O-01 | 路由规则是否可配置?(例如针对某个站点用户调整 IM > EDM 的优先级)配置界面在 outreach 内还是在独立配置管理? | **P0** | 154|| O-02 | 「APP 低活跃」的判定标准是什么?(N 天未打开?N 天未点击推送?)阈值是否可配置? | P1 | 155|| O-03 | 高优先级渠道发送失败(退信/未送达)后,是否自动降级到下一渠道?降级是否有冷却时间? | P1 | 156|| O-04 | C 类用户(累计≥12)只推免评——如果免评计划也没有,是完全不推还是推品牌/活动内容? | P2 | 157| 158|### 5.2 IM 通道(4 项) 159| 160|| # | 问题 | 优先级 | 161|| --- | --- | --- | 162|| O-05 | IM 使用的具体平台是什么?(WhatsApp Business API / 自研 JOYHUB IM / Messenger?)不同平台的 API 能力和限制? | **P0** | 163|| O-06 | IM 的「分层」是系统自动判断还是人工可干预?(一个 B 类用户会不会被错误标记为 C 类?如何修正?) | **P0** | 164|| O-07 | IM 推送中「测评卡片」的具体形式是什么?(带按钮的消息模板?需要用户填表单?)模板在哪里管理? | P1 | 165|| O-08 | IM 中的「订单号核实」——核实的数据源是什么?(比对内部订单表?Amazon 订单 API?)核实失败的转人工流程? | P1 | 166| 167|### 5.3 EDM 通道(4 项) 168| 169|| # | 问题 | 优先级 | 170|| --- | --- | --- | 171|| O-09 | 当前使用的邮件服务是什么?(SendGrid/Mailchimp/SES/自建?)有没有现成 API 和 Webhook 追踪? | **P0** | 172|| O-10 | EDM 模板(邮件内容、样式、多语言)在哪里管理?属于 outreach 还是独立内容管理子系统? | P1 | 173|| O-11 | 「EDM 行为画像」中的「最近 3/5 次 0 打开」——3 次和 5 次是两个独立指标还是二选一?各自对应什么策略? | P1 | 174|| O-12 | EDM 发送量和频控——单日最大发送量有限制吗?(ESP 的每日限额?) | P1 | 175| 176|### 5.4 APP Push(3 项) 177| 178|| # | 问题 | 优先级 | 179|| --- | --- | --- | 180|| O-13 | APP Push 是否复用 JOYHUB 的现有推送通道?还是需要独立接入 FCM(Android)和 APNs(iOS)? | **P0** | 181|| O-14 | APP Push 和 IM 消息的分工——文档第 11.2 节给了对照表,但边界是否绝对?(例如"计划到期提醒"是否可能同时走 APP Push 和 IM?) | P1 | 182|| O-15 | APP 落地页——推送点击后跳转到哪个页面?(APP 内的测评页?IM 对话页?)落地页由哪个团队/子系统负责? | P2 | 183| 184|### 5.5 TEL 通道(3 项) 185| 186|| # | 问题 | 优先级 | 187|| --- | --- | --- | 188|| O-16 | 电话系统使用什么方案?(自建 SIP PBX / Twilio / 其他云呼叫中心?)是否已有通话记录? | **P0** | 189|| O-17 | 「拨打前准备」第 2 步「查风险:强关联命中→暂停拨打→先复核」——复核由谁来做?(风险人员?客服组长?)复核时长预期? | P1 | 190|| O-18 | 电话中「尽量确认」的字段(购买平台、订单号、产品型号、购买时间、问题类型、凭证)如果用户不愿意/无法提供——哪些是必须确认的?哪些可以跳过? | P1 | 191| ### 5.6 消息内容与合规(4 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-19 | 消息内容是否需要审核?(IM 推送文案、EDM 邮件内容、APP Push——上线前是否需要审核?审核流程?) | P1 | | O-20 | EDM 合规要求——是否遵守 CAN-SPAM Act(美国)、GDPR(欧洲)、CASL(加拿大)?退订机制是否满足法律要求? | P1 | | O-21 | IM 平台的合规限制——WhatsApp 等平台禁止垃圾消息和特定类型内容(如测评引导)——是否有合规风险? | P1 | | O-22 | 消息发送的时区感知——美国用户、英国用户、德国用户的推送时间是否需要本地化?(用户当地时间的白天而非半夜) | P1 | ### 5.7 消息策略与实验(3 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-23 | 是否需要 A/B 测试能力?(同一计划的两组用户收到不同文案/不同发送时间——对比转化率?) | P2 | | O-24 | 消息打开率/点击率/转化率的追踪和报表?是否需要自动优化发送策略(高打开率的文案模板优先使用)? | P2 | | O-25 | 用户反馈「消息太频繁/内容不相关」——是否有投诉/退订统计和预警?(投诉率超过 X% 暂停该类型推送?) | P1 | ### 5.8 IM 通道补充(3 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-26 | IM 消息的「已读」状态是否能获取?(WhatsApp 的蓝色双勾——能否用于判断用户是否看到消息?) | P1 | | O-27 | IM 用户提交的「评论截图/链接」——如何自动验证截图的真实性?(防止用户 PS 假截图?是否需要 OCR 识别截图内容?) | P1 | | O-28 | IM 中的返款通知——返款是系统自动触发还是人工触发?返款状态如何回写到 outreach? | P1 | ### 5.9 EDM 通道补充(3 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-29 | EDM 的「硬退信」和「投诉」是否自动同步到 identity 的风险标记?(硬退信用户是否需要进入风险观察?) | P1 | | O-30 | EDM 引导用户下载 APP——是否在邮件中嵌入归因链接(deferred deep link)以追踪转化来源? | P2 | | O-31 | EDM 的发送域名和 IP 预热策略?(新域名/IP 直接大批量发送会被 ESP 判定为垃圾邮件——需要渐进式预热?) | P2 | ### 5.10 TEL 通道补充(3 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-32 | 电话录音是否需要存储?存储多久?谁有权调取录音?(涉及合规和隐私) | P1 | | O-33 | 不同国家的电话合规要求——美国需提前告知录音、德国的 GDPR 限制——如何处理? | P1 | | O-34 | TEL 任务的优先级和分配——多个外呼任务同时存在时,客服按什么顺序拨打?(先打高价值用户?先打答应配合超时的?) | P1 | ### 5.11 实施层面(4 项) | # | 问题 | 优先级 | | --- | --- | --- | | O-35 | 各外部通道的 rate limit 和计费模式?(WhatsApp 按消息数计费?EDM 按发送量计费?)是否需要成本控制? | P1 | | O-36 | 消息发送是同步还是异步?(用户点「发送」后立即返回还是后台队列处理?失败重试策略?) | P1 | | O-37 | 多渠道消息的发送顺序保证?(「先发 IM 提醒→24h 后无回复再发 EDM」——这种时序依赖如何实现?定时任务?延迟队列?) | P2 | | O-38 | 异常场景——如果某渠道 100% 发送失败(ESP 宕机/WhatsApp API 限流)——是否自动切换备用渠道? | P2 |