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

2026-10-13 · 原文发布日

n8n模板:Vapi语音客服查档期和预约Google日历

免费n8n模板,给Vapi语音助手接上Google日历的查档期与预约能力。流程暴露两个webhook供Vapi工具调用:先校验共享密钥,查档期时读取日历忙闲状态,时段被占则返回最近的备选时间;预约时按营业时间、最短提前量等规则校验,再复查该时段仍空闲才创建日历事件,并把结构化结果回传给通话中的语音助手。配置节点里可改时区、营业时段、时长和事件标题。

原文要点

原模板是免费n8n工作流,但不可据此生成可导入JSON;它面向Vapi语音助手暴露两个生产webhook:check_availability与book_appointment。共同点为先校验请求头共享密钥,再解析Vapi tool调用;查档读取Google Calendar free/busy并在占用时给备选;预约先校验客户资料、营业日/时段、最短提前量,创建事件前再复查精确时段仍空闲,最后回传status ok或错误码。配置项含calendarId、timezone、营业时段、时长、notice period、标题与weekday locale。

这次做成什么

照着做一个可演练的“电话语音预约”闭环:Vapi工具先问可否预约,命中空闲后再落日历;本站用隔离日历和合成客户设计练习,不导入原工作流文件。

准备什么

  • n8n Cloud或自托管实例,且能启用生产webhook
  • Vapi账号与一个assistant,可配置custom tools
  • Google日历OAuth2凭据和一个测试日历ID
  • 用于鉴权的强随机webhookSecret,勿用生产密钥

具体怎么做

  1. 配置与密钥

    在n8n模板标为Configure me/配置节点处只改本站示例值:calendarId填测试日历,timezone填Asia/Shanghai,appointmentMinutes设30,minimumNoticeHours设24,openingDays设1-5,openingHours设09:00-18:00;webhookSecret填32位以上随机串并确认secretHeader为X-Vapi-Secret。

  2. 接Google日历

    把所有读忙闲与Create calendar event步骤的凭据都选为同一测试日历OAuth2;先用 calendar 的free/busy读取验证今天明天有已知忙碌块,避免误连客户真实日历。

  3. 发布两个端点

    激活工作流后复制vapi-check-availability与vapi-book-appointment生产URL;在Vapi建两个custom tools,URL分别对应,header带X-Vapi-Secret,参数按示例schema传dateTime、durationMinutes,预约再加name、phone、email。

  4. 演练两轮通话

    第一轮用已被占的14:00请求,应返回available:false与最近备选;第二轮选备选14:30,预约工具应先通过营业与提前量规则,再复查空闲,创建标题为eventTitle的事件并回传status:ok。

可直接复制的材料

n8n配置区替换样例

本站独立示例配置;请在原模板Configure me节点核对字段名后再替换,secret必须换。

{
  "webhookSecret": "REPLACE_WITH_32_PLUS_RANDOM_TEST_SECRET",
  "secretHeader": "X-Vapi-Secret",
  "calendarId": "REPLACE_WITH_TEST_CALENDAR_ID@group.calendar.google.com",
  "timezone": "Asia/Shanghai",
  "openingDays": [1,2,3,4,5],
  "openingStart": "09:00",
  "openingEnd": "18:00",
  "appointmentMinutes": 30,
  "slotStepMinutes": 30,
  "searchWindowDays": 14,
  "alternativesCount": 3,
  "minimumNoticeHours": 24,
  "locale": "zh-CN",
  "eventTitle": "到店咨询预约"
}

Vapi自定义工具参数样例

合成客户数据;电话邮箱均为占位,实际字段以Vapi工具定义为准。

{
  "check_availability": {
    "headers": {"X-Vapi-Secret": "REPLACE_WITH_32_PLUS_RANDOM_TEST_SECRET"},
    "arguments": {"dateTime": "2026-10-20T14:00:00+08:00", "durationMinutes": 30}
  },
  "book_appointment": {
    "headers": {"X-Vapi-Secret": "REPLACE_WITH_32_PLUS_RANDOM_TEST_SECRET"},
    "arguments": {"dateTime": "2026-10-20T14:30:00+08:00", "durationMinutes": 30, "name": "林练习", "phone": "+8613800000000", "email": "practice@example.com"}
  }
}

输入与输出示例

本站虚构演示,非作者运行结果;eventId格式仅示意。

输入

测试日历已占2026-10-20 14:00-14:30;Vapi先传dateTime=2026-10-20T14:00:00+08:00查档期,再按返回备选传14:30、姓名林练习预约。

对应输出

查档返回{"status":"ok","available":false,"alternatives":["2026-10-20T14:30:00+08:00"]};预约复查空闲后返回{"status":"ok","eventId":"demo_evt_10201430","start":"2026-10-20T14:30:00+08:00"}。

做完检查这些

  • 错误密钥请求被拒绝,且日历不被读取或写入
  • 占用时段不直接预约,先返回可解释的备选时间
  • 预约创建前发生第二次free/busy复查,冲突时不建事件
  • 返回给Vapi的结构含status:ok或清晰错误码

容易卡住的地方

  • 共享密钥或头名不一致会让Vapi工具永远失败
  • 时区与营业日错位会把合法时段判成休息
  • 测试日历若残留真实忙闲,备选结果会变
  • 不要公开暴露无鉴权webhook,勿在描述放敏感信息

原文与作者资料 ↗

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

原文标题
Check and book Google Calendar appointments with Vapi voice agents
原作者
Marcelo Garcés
原始发布日期
2026-10-12T20:04:14.198Z
来源
https://n8n.io/workflows/20820