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,勿用生产密钥
具体怎么做
配置与密钥
在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。
接Google日历
把所有读忙闲与Create calendar event步骤的凭据都选为同一测试日历OAuth2;先用 calendar 的free/busy读取验证今天明天有已知忙碌块,避免误连客户真实日历。
发布两个端点
激活工作流后复制vapi-check-availability与vapi-book-appointment生产URL;在Vapi建两个custom tools,URL分别对应,header带X-Vapi-Secret,参数按示例schema传dateTime、durationMinutes,预约再加name、phone、email。
演练两轮通话
第一轮用已被占的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