2026-09-03 · 原文发布日
自动挽回沉默客户项目的跟进流程
流程每周一早上读Airtable里的客户项目表,算出距上次跟进的天数,超过10天未触达的项目由OpenAI按项目名和阶段写一封简短问候邮件,经Gmail发给客户,随后把外联记录写回Airtable的Touch Log、刷新last_touch,并在Discord发一行摘要;没有沉默项目就发一条平安消息。每周五下午再汇总项目健康指标,让OpenAI写周报经Gmail和Discord发出。
原文要点
原模板说明每周一09:00按工作流时区读取Airtable“Client Projects”,按last_touch算沉默天数,10+天未触达才进入挽回;缺失或畸形last_touch会邮件提醒内部地址。没有沉默项目则在Discord发all clear。对沉默项目用OpenAI生成提到项目名和阶段的简短邮件,经Gmail发给客户,回写Touch Log并更新last_touch,再发一行Discord摘要。每周五16:00汇总健康指标,由OpenAI写周报并发Gmail和Discord。
这次做成什么
做成“周一自动挽回沉默客户+周五健康周报”的双调度练习;不复制原文件,用Airtable两张表、OpenAI邮件提示词、Gmail/Discord输出和一条合成客户数据跑通分支,明确10天阈值与回写链路。
准备什么
- Airtable base含Client Projects与Touch Log,字段至少project_id,status,last_touch,client_email,project_name,stage,log_id
- Airtable personal access token,且base ID与两张表名在读取、追加、更新节点一致
- Gmail OAuth2发件邮箱,内部告警收件人与周五摘要从收件人已确认
- Discord webhook凭据和目标频道,可发all clear、单行摘要、周报
- OpenAI API凭据,模型与温度在节点内选择,邮件风格可按品牌调整
具体怎么做
建Airtable结构
Client Projects建project_id主键、status、project_name、stage、client_email、last_touch日期;Touch Log建log_id、project_id、sent_at、channel、subject、snippet。放两条合成项目,一条last_touch为15天前,一条为3天前。
周一检查与数据告警
Schedule Trigger设周一09:00;读取Client Projects中status=active;Code节点算daysQuiet=floor((now-last_touch)/86400000)。last_touch为空或无法解析的项目进入内部Gmail告警分支,不进入客户外联。
沉默分支写邮件
daysQuiet>=10才调用OpenAI生成subject/body,必须引用project_name和stage;Gmail发给client_email。发送成功才追加Touch Log,log_id用project_id+时间戳,随后更新Client Projects.last_touch为当天。
无沉默与每票摘要
若过滤后数组为空,Discord发all clear;每成功发送一封,Discord发一行含project_id、天数、主题哈希后四位的摘要,避免把客户邮箱全文贴进频道。
周五健康周报
第二个Schedule Trigger设周五16:00;读取活跃项目数、本周Touch Log数、仍>=10天沉默数、畸形日期数,OpenAI压缩成120字内周报,Gmail发内部、Discord发同文。
可直接复制的材料
OpenAI挽回邮件提示词
本站独立编写;{{$json.project}}与天数变量按你的表达式替换,模型名在OpenAI节点核对。
你是客户成功助理。根据输入JSON写一封简短中文 check-in 邮件,字段有project_name,stage,client_first_name,daysQuiet。要求:语气自然不催单;明确提到项目名和当前阶段;承认已约{{daysQuiet}}天未同步;给一个低负担下一步,例如回复1确认照常、回复2需要调整、回复3暂停;不要承诺交付日期,不要提折扣。只输出JSON:{"subject":"...","body":"..."},body不超过180字,可含换行。输入:{{$json.project}}Airtable字段与Touch Log配置
本站示例配置;base/table真实名称、字段类型和权限需在你的Airtable核对。
{"bases":{"appDemoClientOps":{"tables":{"Client Projects":{"fields":{"project_id":"text primary","status":"singleSelect active|paused|done","project_name":"text","stage":"singleSelect discovery|build|review|launch","client_email":"email","last_touch":"date"}},"Touch Log":{"fields":{"log_id":"text primary","project_id":"link to Client Projects","sent_at":"dateTime","channel":"singleSelect gmail|discord|alert","subject":"text","snippet":"longText"}}}}},"n8nMapping":{"read":"status=active","quietIf":"daysQuiet>=10","badDateIf":"!last_touch || isNaN(Date.parse(last_touch))","writeBack":"Touch Log append then Client Projects.last_touch=today"}}合成项目测试数据
练习以2026-09-02为now时,CP-1001约15天应触达,CP-1002约3天不触达,CP-1003走内部告警;邮箱均为虚构。
project_id,status,project_name,stage,client_email,last_touch
CP-1001,active,北岸咖啡会员小程序,review,li@example.test,2026-08-18
CP-1002,active,澄光瑜伽预约页,build,chen@example.test,2026-08-30
CP-1003,active,无日期异常项目,discovery,ops@example.test,输入与输出示例
本站虚构演示,未实际发送邮件或写Airtable;输出用于核对字段对应。
输入
周一读取到CP-1001沉默15天且邮箱有效;CP-1002沉默3天;CP-1003的last_touch为空。对应输出
CP-1001生成主题"北岸咖啡会员小程序 review 阶段小确认",正文提到15天未同步并给回复1/2/3选项;Gmail发出后Touch Log新增TL-CP-1001-202609020900,Client Projects.last_touch更新为2026-09-02,Discord发"check-in CP-1001 15d subj#a91f"。CP-1002不发,CP-1003只发内部数据告警。做完检查这些
- 周一09:00触发后,status非active或last_touch在10天内的项目不进入OpenAI节点
- last_touch为空/畸形的项目只进入内部告警,不会向client_email发信
- 每封客户邮件发送成功后才有Touch Log追加,随后才更新last_touch,顺序不能反
- 安静周Discord只收到all clear,周五16:00另收到含活跃数、本周触达数、仍沉默数的摘要
容易卡住的地方
- 时区不一致会让周一09:00和10天判定漂移,统一用workflow timezone并在Code里显式取当天零点
- 先更新last_touch再发信失败会造成假触达,必须发送成功后才回写
- Discord摘要别放完整邮件正文和客户隐私,只放行级状态
- OpenAI、Gmail、Airtable、Discord均可能有配额或费用,模板免费不代表服务免费
- last_touch若用字符串而非日期字段,解析分支会误报,需统一字段类型
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Revive quiet client projects with OpenAI, Airtable, Gmail and Discord
- 原作者
- Khairul Muhtadin
- 原始发布日期
- 2026-09-03T12:35:19.890Z
- 来源
- https://n8n.io/workflows/19123