2026-10-05 · 原文发布日
宠物寄养预订审核与疫苗到期提醒
宠物寄养店的预订把关流:表单收集主人、宠物和狂犬、DHPP、犬窝咳三项疫苗到期日,程序按退房日期做确定性校验——缺记录或已过期判为拒绝,临期14天内判为有条件,其余批准;模型根据判定结果起草给主人的回复邮件,所有记录进Sheets,未通过的同时通知店内邮箱。另有每天七点扫描30天内疫苗到期的主人提醒,和每周一的店铺摘要。
原文要点
原文是一个免费n8n模板:表单收寄养预订,校验狂犬、DHPP、犬窝咳三项疫苗到期日对退房日期做确定性判定(缺记录或过期=blocked,14天内到期=conditional,其余=approved),由gpt-6-luna按判定起草主人回信;记录写入Google Sheets的Bookings页,未通过的额外提醒店内邮箱;每天07:00扫30天内到期疫苗发主人提醒,周一09:00生成店铺周报。模板未附可下载JSON。
这次做成什么
在n8n里搭一条「预订审核+疫苗到期提醒」工作流:表单触发→规范化并生成预订号→字段完整性校验→代码节点做三项疫苗的确定性判定→模型按判定起草回信→写入Sheets→未通过时通知店内邮箱;另配每日07:00到期扫描和周一09:00摘要两条定时支线。
准备什么
- 一个可自建的n8n实例或n8n Cloud账号,能发布Form Trigger
- 一个Google账号,用于创建Sheets并配置Google Sheets OAuth2与Gmail OAuth2凭据
- 一个聊天模型凭据(原文标注为[OI] chat model、模型名gpt-6-luna,请按你账号实际可用模型核对替换)
- 一张含Bookings页、列名见步骤1的Google表格,以及一个店内收件邮箱
具体怎么做
建表与列结构
在Google Sheets新建文件,工作表命名Bookings,首行依次写入列:booking_id, received_at, owner_name, owner_email, pet_name, species, check_in_date, check_out_date, rabies_expiry, dhpp_expiry, bordetella_expiry, compliance, decision, issues, notes, kennel_email, email_subject, email_body, last_watch_at。记录表格ID备用。
表单触发与规范化
添加n8n Form Trigger,字段含主人姓名、主人邮箱、宠物名、物种、入住/退房日期、三项疫苗到期日、备注。后接Set节点:用表达式生成booking_id(BKG-加当天日期加三位序号,如 ="BKG-" + $now.toFormat('yyyyMMdd') + "-001")、received_at=$now、kennel_email填店内邮箱。
完整性校验与确定性判定
加IF节点检查主人姓名、邮箱、宠物名、入住与退房日期非空;缺件走false分支发邮件给店内邮箱列出缺失字段且不写入表格。通过的分支进Code节点(材料2示例JS):逐项疫苗到期日与退房日期比较,缺失或已过期判blocked/noncompliant,14天内到期判conditional/expiring_soon,其余approved/compliant,同时输出issues文本与最少剩余天数。
模型起草回信并落表发信
AI Agent节点挂聊天模型凭据,使用材料1提示词,把decision、宠物名、日期、issues注入;要求主题不超10词、正文140词内纯文本。随后Google Sheets节点以Append模式写入Bookings页(字段按列名一一映射),Gmail节点把起草的信发给主人邮箱;再加IF判断decision!=approved时向kennel_email发「预订需处理」提醒,含宠物名、住期与疫苗问题。
两条定时支线与上线
新建Schedule Trigger(每天07:00):Read Booking Register读全表,Code节点按主人+宠物只保留最新一行并更新last_watch_at,IF筛选30天内到期者,Gmail逐人发到期提醒。再建Schedule Trigger(cron 0 9 * * 1):读表统计本周三种decision数量与30天内到期宠物数,交给模型用材料4提示词起草周报发店内邮箱。确认时区后激活工作流。
可直接复制的材料
主人回信起草提示词(三种判定共用)
本站独立撰写的示例提示词;{{}}占位符按你n8n表达式实际路径替换。
你是宠物寄养店的前台助理。根据下面的审核结果,给主人写一封纯文本回信。要求:主题不超过10个词,正文不超过140个词,语气友好但直接,不承诺医疗建议。
审核结果:{{$json.decision}}(approved=批准,conditional=有条件,blocked=拒绝)
宠物名:{{$json.pet_name}};入住:{{$json.check_in_date}};退房:{{$json.check_out_date}}
疫苗问题说明:{{$json.issues}}
若approved:确认预订成功,提醒入住携带疫苗记录。
若conditional:说明某项疫苗在住期内临近到期,请主人在入住前提供更新证明,否则可能影响入住。
若blocked:说明缺少或已过期的疫苗记录,请主人提供最新记录后再重新提交预订。
只输出两行:第一行「主题:…」,第二行起为正文。疫苗确定性判定Code节点示例(JavaScript)
本站编写的示例逻辑,阈值14天与原文一致;日期格式假定YYYY-MM-DD,其他格式需先解析。
const item = $json;
const checkout = new Date(item.check_out_date);
const vaccines = [
['狂犬病疫苗', item.rabies_expiry],
['DHPP疫苗', item.dhpp_expiry],
['犬窝咳疫苗', item.bordetella_expiry]
];
let issues = [];
let minDays = Infinity;
for (const [name, exp] of vaccines) {
if (!exp) { issues.push(name + '记录缺失'); continue; }
const days = Math.floor((new Date(exp) - checkout) / 86400000);
minDays = Math.min(minDays, days);
if (days < 0) issues.push(name + '已于' + exp + '过期');
else if (days <= 14) issues.push(name + '在住期后' + days + '天内到期');
}
let decision, compliance;
if (issues.some(t => t.includes('缺失') || t.includes('过期'))) { decision = 'blocked'; compliance = 'noncompliant'; }
else if (issues.length > 0) { decision = 'conditional'; compliance = 'expiring_soon'; }
else { decision = 'approved'; compliance = 'compliant'; }
return [{ json: { ...item, decision, compliance, issues: issues.join(';') || '无', min_days_left: minDays === Infinity ? '' : minDays } }];表单测试数据(合成)
合成练习数据,邮箱为示例域名;日期相对退房日2026-11-15设计为三种结果各覆盖一项。
{
"owner_name": "陈晓",
"owner_email": "chenxiao.demo@example.com",
"pet_name": "豆豆",
"species": "犬",
"check_in_date": "2026-11-10",
"check_out_date": "2026-11-15",
"rabies_expiry": "2027-05-01",
"dhpp_expiry": "2026-11-20",
"bordetella_expiry": "2026-10-01",
"notes": "早晚遛狗各一次"
}周一店铺摘要提示词
本站独立撰写;统计字段需在上游Code节点先聚合好再注入。
你是寄养店运营助理。根据以下统计写一封给店内的周报邮件,纯文本,主题不超过12个词,正文不超过160个词。
本周批准数:{{$json.approved_count}};有条件数:{{$json.conditional_count}};拒绝数:{{$json.blocked_count}}
30天内疫苗到期的宠物:{{$json.expiring_list}}
结构:第一句总结本周预订情况,第二句点出需跟进的有条件与拒绝单,最后列出到期提醒名单。只输出「主题:…」加正文。输入与输出示例
本站虚构演示,未实际运行,回信措辞以你模型实际输出为准。
输入
用上文材料3的测试数据:豆豆,入住2026-11-10、退房2026-11-15,狂犬2027-05-01到期,DHPP 2026-11-20到期(住期后5天),犬窝咳2026-10-01已过期。对应输出
Code节点判定:decision=blocked, compliance=noncompliant, issues=「DHPP疫苗在住期后5天内到期;犬窝咳疫苗已于2026-10-01过期」。模型起草示意:主题:豆豆预订需补疫苗记录;正文:告知预订暂未通过、犬窝咳记录已过期且DHPP临近到期,请提供最新记录后重新提交。Sheets新增一行BKG-20261005-001,店内邮箱收到「预订需处理」提醒。做完检查这些
- 表单提交后Sheets的Bookings页新增一行,19个列全部有值且decision与代码判定一致
- 三项疫苗均远离到期时decision=approved;任一缺失或过期时=blocked;仅临期14天内时=conditional
- blocked或conditional时店内邮箱收到含宠物名、住期、issues的提醒,approved时不发
- 把系统日期模拟到某疫苗到期前30天内,次日07:00支线给对应主人发提醒且last_watch_at被更新
- 周一09:00摘要邮件中的三个计数与表中本周实际行数一致
容易卡住的地方
- 原文模板未提供可下载JSON,本页是独立重建方案,节点命名与按钮位置以你n8n版本为准
- gpt-6-luna是原文所写模型名,你的账号若无此模型需换成可用模型并相应调整
- 日期若含时分或格式不统一,Code节点的天数计算会出错,先在规范化节点统一为YYYY-MM-DD
- 07:00与周一09:00是原文设定时间,实际触发取决于n8n实例时区,需在Settings核对
- 每天扫描若不去重会给同一主人重复发信,务必保留「每主人每宠物只取最新行」的去重步骤
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Approve pet boarding bookings and send vaccine reminders with Gmail, Sheets and OpenAI
- 原作者
- Khairul Muhtadin
- 原始发布日期
- 2026-10-05T10:57:29.494Z
- 来源
- https://n8n.io/workflows/20441