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

2026-09-08 · 原文发布日

WhatsApp预约自动管理:OpenAI识别意图+Google日历落单

这是一个付费模板。客户通过WhatsApp Business发消息触发流程,OpenAI先判断意图是预订、改期、取消还是普通咨询,并提取时间;预订时读取Google日历在营业时间内找最近的空档,写入前再复查一次防止撞单,还用Data Table做幂等键避免同一消息重复建事件;无法识别或核实的情况自动转到Slack交人工处理。

原文要点

这是Jessy Mariau的付费模板:客户给WhatsApp Business号码发消息触发流程,裁减负载只留电话、姓名、消息文本;OpenAI判断意图为预订/改期/取消/普通咨询/无法识别并提取日期时间;预订时读Google日历在营业时间内找最近空档,写入前对目标时段再复查一次;写入前在Data Table查幂等键防同一条消息重复建事件,建事件后立即读回验证;改期/取消按手机号找该客户最近一次预订并操作真实事件ID;无法分类、纯咨询、验证失败或无预订可改的情况转Slack人工;提醒功能默认关闭。原模板需购买,OpenAI等模型服务可能另收费。

这次做成什么

在不购买原模板的前提下,用本站方案在n8n里复刻一条“意图识别→查空档→复查→幂等写入→确认或转人工”的预约链路,理解二次复查与幂等键这两个关键设计,并用合成消息自测全部分支。

准备什么

  • n8n实例且已启用Data Tables功能
  • WhatsApp Business Cloud号码及凭据;练习阶段可用Manual Trigger加合成负载代替真实触发
  • 可写入的Google日历及凭据
  • OpenAI聊天模型凭据(费用由OpenAI收取)
  • Slack凭据和一个有人盯的升级频道

具体怎么做

  1. 建Data Table和设置节点

    按原文要求创建名为whatsapp_bookings的Data Table,字符串列:idempotencyKey、customerPhone、customerName、slotStartIso、slotEndIso、eventId。加一个Settings(Set)节点集中放calendarId、phoneNumberId、营业时间(如09:00-18:00)、营业日、时长大(如30分钟)、向前搜索天数和时区,后续节点统一引用。

  2. 裁剪负载并识别意图

    触发后先用Set节点只保留phone、name、messageText三字段,避免把多余个人信息送进模型。接OpenAI节点,用下方材料里的提示词让模型输出JSON:intent取book/reschedule/cancel/question/unknown之一,外加dateTimeMentioned字段。解析失败或intent为unknown/question的直接进Slack分支。

  3. 查空档并二次复查

    intent为book时,用Google Calendar节点按客户提到的时间窗和营业时间枚举空档,取最近一个;创建事件前再对这一个精确时段执行一次查询,仍空才写。原文明确这是复查不是锁,真正同时并发的预订需要你另加预留机制,本站练习串行执行即可。

  4. 幂等写入并回读验证

    写事件前用消息ID作为幂等键查Data Table,已存在则跳过创建直接发确认;不存在才创建日历事件,随后立刻按事件ID读回,读回成功才把幂等键、客户信息和eventId写入Data Table。读回失败转Slack人工,不向客户谎称成功。

  5. 改期取消与确认

    intent为reschedule/cancel时,按customerPhone在Data Table查该客户最新一条记录的eventId,对真实事件执行改期或删除,再经WhatsApp发确认;查不到记录的转Slack。提醒功能保持关闭,如需开启先按你自己的WhatsApp消息政策测试发送时机。

可直接复制的材料

意图识别提示词(本站编写,可粘贴到OpenAI节点)

本站独立编写的替代提示词,非原付费模板内容;五个枚举值与原文描述一致

你是预约助手。客户通过WhatsApp发来一条消息,请判断意图并提取时间。只输出JSON,不要输出其他文字。格式:{"intent":"book|reschedule|cancel|question|unknown","dateTimeMentioned":"客户提到的日期时间描述,没有则为null","confidence":0到1}。规则:想订新时间是book;要移动已有预约是reschedule;要取消是cancel;只是询问价格、地址等是question;无法判断是unknown。不要编造客户没说的日期。

合成测试消息负载

本站虚构数据,用Manual Trigger粘贴模拟WhatsApp Cloud触发负载;messages[0].id用作幂等键,更换该值可测重复消息分支

{"entry":[{"changes":[{"value":{"messages":[{"id":"wamid.TEST0001","from":"8613900000000","timestamp":"1788854400"}],"contacts":[{"profile":{"name":"测试客户A"}}],"metadata":{"phone_number_id":"TEST_PHONE_ID"}}}]}]}

Settings节点字段示例配置

本站示例配置;字段名与原文Settings节点描述对应(营业时间、时长、搜索窗口、时区、提醒开关集中一处),calendarId和phoneNumberId必须替换

{"calendarId":"your-test-calendar@group.calendar.google.com","phoneNumberId":"替换为你的号码ID","businessHours":{"start":"09:00","end":"18:00"},"businessDays":[1,2,3,4,5],"slotLengthMinutes":30,"searchAheadDays":14,"timezone":"Asia/Shanghai","slackEscalationChannel":"#booking-escalations","sendRemindersAutomatically":false}

输入与输出示例

本站虚构演示,未实际运行;时间为相对描述,字段对应关系按本站方案

输入

测试客户A(手机号8613900000000)发消息:‘你好,我想约下周三下午理发,三点左右可以吗’;当日历显示下周三14:30-15:00已占用、15:00-15:30空闲;同一消息ID wamid.TEST0001随后被Meta重复推送一次。

对应输出

意图识别返回{"intent":"book","dateTimeMentioned":"下周三下午三点左右","confidence":0.9};流程选中15:00-15:30空档,写入前复查该时段仍为空,创建事件后读回验证成功,Data Table新增一行idempotencyKey=wamid.TEST0001、slotStartIso=下周三T15:00、eventId=新建事件ID,并向客户发确认‘已为您预约下周三15:00-15:30’;重复推送的第二条消息因幂等键命中直接重发确认、不产生第二个事件。

做完检查这些

  • 同一消息ID触发两次,日历里只有一个事件,Data Table里只有一行
  • 把营业时间改为10:00开始,九点档的请求不会被选中,流程应顺延到10:00后的空档
  • 写入前复查时人为在日历里抢占目标时段,流程应放弃写入并转Slack而不是覆盖
  • 发送‘你们周六营业吗’应识别为question并转Slack,不创建任何事件
  • 改期请求来自无历史记录的手机号时走Slack分支,不报错中断

容易卡住的地方

  • 原模板需购买,本页是本站按原文公开描述独立设计的替代方案,界面与参数请以原模板为准,本站未实测原文件
  • 二次复查是复查不是锁,高并发同时预订会撞单,原文作者也建议另加预留步骤
  • Data Table按手机号存了客户姓名和预约信息,注意访问权限与数据保留周期
  • 提醒功能默认关闭是有意的,WhatsApp对主动消息有政策限制,开启前先确认模板消息合规
  • 模型提取的模糊时间(如‘下午三点左右’)需要流程里有明确的取整/就近规则,否则同一句话结果不稳定

原文与作者资料 ↗

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

原文标题
Book and manage WhatsApp appointments with OpenAI and Google Calendar
原作者
Jessy Mariau
原始发布日期
2026-09-07T16:26:20.982Z
来源
https://n8n.io/workflows/19324