每天上午九点,定时器触发一次工作流。它去Google Sheets里拉出所有发票行,交给一个代码节点判断,然后决定这封催款邮件到底发不发。听起来简单,但真正决定这套流程能不能用的,是那个判断节点里的逻辑。
![]()
先说清楚整体链路:定时触发 → 读取表格行 → 代码节点决策 → 发送邮件(SMTP)→ 回写表格行,回写时按行号匹配。五个环节,缺一不可。很多人卡在最后一步——只发不记,第二天重复发,客户直接拉黑。
决策逻辑的四道闸门
第一道,状态过滤。状态为已付款、已取消或挂起的行,直接跳过,不进入后续判断。
第二道,算逾期天数。用今天减去到期日,同时接受 YYYY-MM-DD 和 DD/MM/YYYY 两种日期格式。这一步看着不起眼,但格式不兼容是实际部署里最常见的翻车点。
第三道,阶段选择。预设五个节点:到期前3天、到期当天、逾期7天、14天、30天。取偏移量小于等于当前逾期天数的最高阶段。这样设计的好处是,如果工作流停了一周,恢复后不会一次性补发一堆邮件,只会发当前该发的那一封。
第四道,幂等校验。只有当选中阶段的序号大于已记录的 last_stage_sent 序号时才发送。发完回写 last_stage_sent 和 last_sent_date。这一条是整套流程的核心——没有它,前面三步做得再漂亮,也只是个定时骚扰器。
踩过的三个坑
- Send Email 2.1 版本默认会在邮件末尾追加 n8n 的署名页脚。要去 Options 里手动关掉,否则客户收到的催款信底下挂着一行工具广告。
- 用 n8n import:workflow 导入时,如果 JSON 里没有 id 字段会直接失败。导出前记得补上。
- 别拿真实邮箱做测试。先用本地 SMTP 捕获工具,比如 Python 的 aiosmtpd,把邮件拦下来看内容,确认无误再切到生产环境。
澳洲 GST 的措辞差异
如果企业已注册 GST,邮件措辞要用「Tax invoice … Total includes GST of $X」,其中 X 等于总额除以 11,四舍五入到分。如果没注册,则写「Invoice … No GST has been charged」。两种措辞不能混用,这属于合规层面的硬要求,不是文案偏好。
这套流程的作者是 Ledgerline Tools,一家澳大利亚的小型自动化工作室。他们打包了一个版本,包含操作指南、示例表格和五套模板,放在 Gumroad 上。有问题可以发邮件到 ledgerlinetools@proton.me。
回到开头那个问题:催款邮件为什么不能每天发?因为客户不是你的定时任务。阶段化加幂等记录,本质上是在用工程手段模拟一个人类该有的分寸感——该提醒时提醒,提醒过了就等下一个节点,而不是无脑重复。
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.