跳转到正文
OmniChannels.ai

如何通过 Webhook 将 CRM 接入全渠道收件箱

通过 Webhook 将 CRM 接入全渠道收件箱的技术指南:应该同步哪些事件、如何做幂等处理与失败重试、如何匹配联系人、如何满足数据隐私合规要求,并附参考架构,帮助出海企业打通客户沟通与客户管理数据,减少人工录入,并附吉达诊所集团的实操案例。

更新于 8 分钟阅读

作者: OmniChannels.ai Editorial Team · 审阅: BroadNet Messaging Solutions Team

集成

简短回答

要把 CRM 接入全渠道收件箱,请订阅收件箱的会话和消息事件 Webhook,用一个小型端点接收,验证签名并按事件 ID 对每个事件只保存一次,然后异步处理:通过规范化后的手机号、电子邮件或社交账号 ID 把发送者匹配到 CRM 联系人,再把活动记录写回去。反方向则使用收件箱 API,让 CRM 工作流发送消息或更新负责人。

本页内容
  1. CRM 与全渠道收件箱之间应该交换什么?
  2. 应该订阅哪些 Webhook 事件?
  3. 如何构建可靠的 Webhook 接收端?
  4. 如何跨渠道匹配联系人?
  5. 如何在 CRM 集成中处理数据隐私?
  6. 参考架构是什么样的?
  7. 实操案例:吉达的一家连锁诊所
  8. 常见错误有哪些?
  9. OmniChannels.ai 如何提供帮助

要点速览

  • Webhook 把事件近实时地从收件箱推送到 CRM;API 则在反方向拉取数据或触发操作。稳健的集成两者都会用到。
  • Webhook 通常是“至少送达一次”,因此接收方必须按事件 ID 去重,并容忍事件乱序到达。
  • 尽快确认 Webhook,把 CRM 的处理放到后台队列中执行,这样缓慢的 CRM 调用就不会引发重试和重复。
  • 按 E.164 手机号和小写电子邮件地址等规范化标识符匹配联系人,切勿仅凭姓名合并记录。
  • 只发送 CRM 所需的数据;摘要足够时不要把消息内容放进 CRM,并遵守适用的隐私法律,例如 GDPR 以及阿联酋和沙特的数据保护法。

本指南面向希望让 CRM 与全渠道收件箱共享同一个客户视图的 CTO、解决方案架构师和 CRM 管理员。内容介绍应该同步哪些事件、如何构建能够应对重试和重复的 Webhook 接收端、如何在 WhatsApp、Instagram 和电子邮件之间匹配联系人,以及哪些隐私规则会影响设计。

CRM 与全渠道收件箱之间应该交换什么?

收件箱应该告诉 CRM:谁联系了你、通过哪个渠道、为了什么事、结果如何。CRM 则应该告诉收件箱:客户是谁、归谁负责,以及坐席需要了解哪些背景信息。

方向 数据 典型用途
收件箱到 CRM 新会话、渠道、联系人标识符 创建或更新联系人,记录活动
收件箱到 CRM 分配和状态变更、解决情况 更新工单或商机时间线,统计处理时长
收件箱到 CRM 外发模板的消息送达状态 跟踪活动或通知的结果
CRM 到收件箱 联系人姓名、语言、客户负责人、等级 路由分配与个性化
CRM 到收件箱 触发发送已审核模板 订单、预约或工单更新
CRM 到收件箱 负责人变更 将回头客分配给其客户经理

从能够支撑一个真实工作流的最小数据集开始。把每条消息正文都同步到 CRM 很少有必要,还会增加隐私风险。

应该订阅哪些 Webhook 事件?

要订阅生命周期事件,而不只是消息。不同平台的具体事件名称各异,请将它们对应到下列类别:

  • 会话已创建 — 客户在任一渠道发来的第一条消息。
  • 收到消息 — 客户发来的消息,附带渠道和发送者标识符。
  • 消息已发送 — 坐席或模板发出的外发消息。
  • 消息状态 — 已发送、已送达、已读或失败(以渠道实际回报的为准)。
  • 会话已分配 — 负责人或队列发生变化。
  • 会话已解决或重新打开 — 状态变更。
  • 联系人已更新 — 收件箱中的标识符或属性发生变化。

对于 WhatsApp,Meta 自己的 Webhook 会把入站消息和外发消息的状态更新推送给平台;随后你的收件箱服务商再把它自己的事件开放给你的系统。

如何构建可靠的 Webhook 接收端?

快速接收、验证、只存一次、稍后处理。大多数送达问题都源于在 Webhook 请求内部处理 CRM 工作。

接收端设计步骤

  1. 每个环境提供一个 HTTPS 端点,例如 /webhooks/inbox。
  2. 验证真实性。 检查签名(通常是按 RFC 2104 定义,用共享密钥对原始请求体计算 HMAC)或发送方文档中说明的令牌。请在解析 JSON 之前,基于原始字节进行计算。
  3. 检查时效性。 如果带有时间戳,就拒绝超出较短容忍范围的事件,以限制重放。
  4. 去重。 把事件 ID 插入带有唯一约束的表。如果因为 ID 已存在而插入失败,就返回成功并停止。
  5. 入队。 把事件放入队列,并立即返回 2xx 响应。
  6. 异步处理。 由工作进程读取队列,匹配联系人,并使用 upsert 写入 CRM。
  7. 退避重试。 如果 CRM 宕机,就从你自己的队列中按指数退避重试;不要依赖发送方的重试。
  8. 死信队列。 多次失败后,把事件移入死信队列并提醒相关人员。
  9. 对账。 运行定期任务,将最近的收件箱会话与 CRM 记录比对,并通过收件箱 API 补齐缺失的数据。

为什么幂等性和顺序很重要

Webhook 发送方在没有及时收到成功响应时通常会重试,这使得送达是“至少一次”。同一个事件可能到达两次,“已解决”事件也可能先于最后一条“收到消息”事件到达。可以这样处理:

  • 把事件 ID 作为去重键。
  • 在 CRM 中使用以会话 ID 或消息 ID 为键的 upsert。
  • 比较事件时间戳或序列号,忽略更旧的状态。

当你的 CRM 工作流调用收件箱 API 发送消息时,如果 API 支持,请传入幂等键;关于 Idempotency-Key HTTP 头的 IETF 草案描述了这种常见模式。

如何跨渠道匹配联系人?

按规范化的标识符匹配,优先使用确定性的匹配,并把有歧义的情况交给人工处理。

标识符 规范化方式 匹配可信度 备注
WhatsApp 或短信手机号 E.164,例如 +9715XXXXXXXX 高 注意带前导零的本地格式
电子邮件地址 转小写并去除空格 高 别名可能是同一个人;不要想当然
Instagram 账号 平台范围内的用户 ID 在该账号内为高 用户名可能变更;请保存 ID,而不是只保存用户名
Telegram 用户 平台用户 ID 在该机器人或账号内为高 可能不会共享手机号
姓名 不单独使用 低 绝不要按姓名合并

决策规则:

  1. 恰好一个精确匹配:关联。
  2. 没有匹配:创建线索或带来源渠道的“未匹配联系人”。
  3. 多个匹配:标记给坐席处理,不要自动合并。
  4. 客户在对话中确认了另一个标识符:关联,并附上证据备注。

如何在 CRM 集成中处理数据隐私?

只传输各系统所需的数据,记录原因,并让删除操作在两个系统中都能生效。

  • 数据最小化。 在 CRM 中存储会话链接、结果和摘要;除非有明确的目的,否则完整记录保留在收件箱中。
  • 合法依据与授权。 按渠道记录营销 opt-in;客户服务对话不等于同意接收营销模板。
  • 保留期限。 让收件箱、CRM、队列和日志的保留期限保持一致;Webhook 负载日志常常被遗忘。
  • 访问控制。 限制谁可以在 CRM 中查看消息内容和附件。
  • 删除与查阅请求。 让一个系统中的请求同步传递到另一个系统。
  • 跨境传输。 核实每个系统把数据存储在哪里。GDPR 适用于欧盟境内个人的个人数据,阿联酋和沙特阿拉伯也有各自的个人数据保护法律;请向相关监管机构和你的法务团队确认当前的义务。

参考架构是什么样的?

用文字描述,流程是:渠道到收件箱,收件箱到接收端,接收端到队列,队列到工作进程,工作进程到 CRM,CRM 工作流再回到收件箱 API。

组件 职责 关键设计选择
渠道(WhatsApp、Instagram、电子邮件、Telegram) 把客户消息送入收件箱 受各平台规则约束
全渠道收件箱 会话、分配、坐席、事件 发出 Webhook;开放 API
Webhook 接收端 验证、去重、入队 无状态,快速返回 2xx
事件存储与队列 持久缓冲、可重放 唯一事件 ID、死信队列
同步工作进程 联系人匹配、CRM upsert 幂等写入、退避重试
CRM 联系人、商机、工单、工作流 调用收件箱 API 时使用幂等键
对账任务 发现并修复缺口 按计划运行
监控 延迟、失败、死信 向负责人告警

实操案例:吉达的一家连锁诊所

“Wahat Clinics”是沙特阿拉伯的一家虚构医疗集团,使用 CRM 管理患者预约,并用收件箱处理 WhatsApp 和电子邮件。

  • 一位患者通过 WhatsApp 发来消息。收件箱发出会话已创建事件;接收端对其验证、存储并入队。
  • 工作进程把号码规范化为 E.164,找到唯一的患者记录,并记录一条活动,其中包含指向会话的链接,而不是消息文本。
  • CRM 显示该患者的首选语言是阿拉伯语,并推送给收件箱,由收件箱将会话路由到阿拉伯语队列。
  • 在 CRM 中预约成功后,工作流调用收件箱 API 发送已审核的实用型(Utility)模板确认消息,并以预约 ID 作为幂等键传入,这样重试就不会发出两条确认。
  • 收件箱的“消息已送达”事件会更新预约记录。

常见错误有哪些?

  • 在 Webhook 请求内部写入 CRM, 导致超时、重试和重复。
  • 没有去重, 产生重复的活动记录和联系人。
  • 用未规范化的手机号匹配, 导致 +971 和以 0 开头的格式永远对不上。
  • 按姓名或部分匹配自动合并。
  • 没有目的或保留规则就把所有消息内容复制到 CRM。
  • 没有对账, 一次丢失的事件就会变成永久性的数据偏差。
  • 把密钥写进源代码, 且没有轮换计划。

OmniChannels.ai 如何提供帮助

由 BroadNet Technologies 提供支持的 OmniChannels.ai,把 WhatsApp、Instagram、Messenger、Telegram 和电子邮件的会话汇集到同一个 Omni Inbox,支持坐席分配和打标签,并通过 Meta Embedded Signup 开通 WhatsApp,提供带变量、媒体和按钮的已审核模板。在 CRM 集成方面,REST API 公开提供文档并附有 OpenAPI 3.1 规范,Webhook 以统一规范化的格式报告送达状态(SENT、DELIVERED、READ、FAILED 等)。带筛选和 CSV 导出功能的送达报告有助于对账。请从开发者页面开始。

常见问题

在 CRM 集成中,Webhook 与 API 有什么区别?

Webhook 是指发生某些事情(例如收到新消息或会话被解决)时,收件箱向你的端点发送的一个 HTTP 请求。API 则是你的系统主动调用的接口,用来读取数据或执行操作,例如发送回复或重新分配会话。Webhook 无需轮询即可让 CRM 保持最新;API 则让 CRM 工作流能够对收件箱执行操作。

Webhook 的幂等性是什么意思?

幂等性是指,将同一个事件处理两次与处理一次的效果相同。由于 Webhook 发送方在没有及时收到成功响应时会重试,你的端点可能收到重复的事件。请保存每个事件的唯一 ID,跳过已经处理过的 ID,并把 CRM 的写入设计成 upsert(存在则更新、不存在则新建),这样重复的事件就不会产生第二条活动记录或联系人。

如何把 WhatsApp 号码匹配到 CRM 联系人?

先把两边都规范化为国际 E.164 格式(包含国家区号,不含空格和前导零),然后用该值在 CRM 中查找。如果恰好匹配一位联系人,就进行关联。如果没有匹配,就创建一条线索或未匹配联系人。如果匹配到多位,不要猜测;把该会话标记出来,由坐席来选择,并记录这一决定供下次使用。

应该把完整的聊天记录存储在 CRM 中吗?

只有在目的明确且有合法依据时才可以。许多团队在 CRM 中只存储会话链接、摘要、结果和时间戳,而完整的聊天记录保留在收件箱中,并采用独立的访问控制和保留期限。这样可以减少个人数据的重复存储,也更便于按 GDPR 等法律履行删除请求。

Webhook 端点应该如何保障安全?

仅通过 HTTPS 提供端点,验证发送方随每个请求附带的签名或共享密钥,拒绝时间戳过旧的请求以限制重放,并把密钥放在密钥管理服务中,而不是写进代码。限制端点所能执行的操作:它只应将事件放入队列,不应暴露 CRM 数据,也不应接受任意命令。

资料来源

  1. Webhooks — WhatsApp Cloud API, Meta for Developers
  2. Idempotency-Key HTTP 头字段 — IETF HTTPAPI 工作组草案
  3. RFC 2104:HMAC——用于消息认证的密钥散列
  4. 欧盟第 2016/679 号条例(GDPR) — EUR-Lex
  5. 数据保护法律 — 阿联酋政府门户网站(u.ae)