2026-09-03 · 原文发布日
用n8n自动分流供应商发票审批
这个n8n模板把发票审批做成自动流水线:外部系统通过webhook提交发票,先校验供应商邮箱、发票号、金额是否齐全,再由OpenAI结合Google Sheets里的供应商主数据和审批策略给出通过或转人工的判断。金额超过50万或供应商不在名单内会强制转人工复核。每条结果写入Sheets存档,并通过Gmail和Telegram通知供应商、财务或指定审批人。
原文要点
n8n模板库中Khairul Muhtadin发布的免费发票审批工作流,2026年9月更新。发票由POST webhook(ap/invoice端点)提交,字段为vendor_name、vendor_email、invoice_number、amount及可选currency/category/due_date;先校验三项必填,缺失走Telegram告警加邮件通知。合法件由OpenAI参照Google Sheets的VendorMaster与ApprovalPolicy两个标签页输出决定、建议审批人、理由与置信度;确定性规则强制金额超50万或供应商不在名单时转人工。每条结果追加到Invoices标签页,经Gmail与Telegram通知供应商、财务或审批人,需配置Sheets/Gmail OAuth2、OpenAI API与Telegram机器人凭据。
这次做成什么
在自有n8n实例上复刻这条“收件→校验→AI分流→确定性兜底→存档→双通道通知”的发票审批流水线。本站设计一套纯合成数据的独立搭建练习:逐节点说明连线与配置,附可直接粘贴的决策提示词、供应商主数据、策略表、测试报文与规则代码,跑通一次自动通过与一次强制转人工。
准备什么
- 一个可登录的n8n实例(云端或自托管),版本支持Webhook、Code、AI Agent节点
- 一个Google账号,已建含VendorMaster、ApprovalPolicy、Invoices三个标签页的表格
- OpenAI计费账户API密钥、Gmail OAuth2凭据与Telegram机器人及目标chat ID
- curl或Postman等POST测试工具,以及本站提供的合成供应商数据
具体怎么做
建表并填入合成主数据
在Google Sheets新建三个标签页。VendorMaster列:vendor_name、vendor_email、contact_person、known;ApprovalPolicy列:rule_name、applies_to、threshold_amount、currency、approver_email;Invoices列:invoice_number、vendor_name、vendor_email、amount、currency、decision、approver、reason、confidence、logged_at。把本站VendorMaster与ApprovalPolicy合成CSV粘贴进去,并记下文档ID。
配置Webhook收件与字段校验
添加Webhook节点,方法POST,路径填ap/invoice,激活后复制生产URL。其后接Code节点校验vendor_email、invoice_number非空且amount为可解析的正数;任一缺失走错误分支:Telegram节点向财务群发“录入字段缺失”告警,Gmail节点向录入负责人发错误通知,该分支到此结束、不写Invoices。
接入AI决策节点
添加AI Agent节点挂OpenAI Chat Model(需OpenAI凭据),先用两个Google Sheets读取节点把VendorMaster与ApprovalPolicy整表读入,作为上下文与发票字段一起套进本站决策提示词,要求模型只输出含decision、approver、reason、confidence的JSON。
加确定性兜底规则
AI节点后接Code节点:try/catch解析模型JSON,解析失败按review处理;随后强制执行两条硬规则——amount大于500000或vendor_email不在VendorMaster名单内时,无论AI说什么都改为review,并计算默认审批截止日期。此步骤不依赖模型自觉,是分流可信度的关键。
存档并分支通知
Sheets追加节点把结果写入Invoices标签页。IF节点按decision分流:auto_approve分支用Gmail向供应商与finance收件箱发确认、Telegram发通过摘要;review分支用Gmail向approver邮箱发复核请求、Telegram向财务告警。更新所有收件人为本站示例之外的实际地址。
可直接复制的材料
OpenAI审批决策提示词
本站独立编写,可直接粘贴到AI Agent的系统提示;双花括号处按你的节点表达式绑定实际字段。
你是应付账款审批助手。根据下面提供的供应商主数据与审批策略,对单张发票给出审批判断,只允许输出一个JSON对象,不要输出任何其他文字。
字段定义:decision只能取"auto_approve"或"review";approver为建议审批人邮箱,自动通过时填finance@example.com;reason用一句中文说明依据;confidence为0到1之间的小数。
判断要求:1) 供应商必须出现在供应商主数据中且known为true,否则输出review;2) 金额或类别命中审批策略中需要复核的规则时输出review;3) 信息矛盾、字段可疑或无法判断时一律输出review。
供应商主数据:{{VendorMaster表内容}}
审批策略:{{ApprovalPolicy表内容}}
待审发票:供应商={{vendor_name}},邮箱={{vendor_email}},发票号={{invoice_number}},金额={{amount}} {{currency}},类别={{category}},到期日={{due_date}}
输出格式示例:{"decision":"review","approver":"ap.manager@example.com","reason":"金额超过类别阈值","confidence":0.86}VendorMaster合成数据
本站虚构供应商数据,仅用于练习;新星广告传媒known=false用于测试强制转人工分支。
vendor_name,vendor_email,contact_person,known
恒锐办公用品,ap@hengrui.example,王磊,true
蓝桥物流服务,billing@lanqiao.example,陈芳,true
明澈清洁服务,invoices@mingche.example,刘洋,true
捷达设备租赁,finance@jieda.example,赵敏,true
新星广告传媒,billing@xinxing.example,孙倩,falseApprovalPolicy合成策略
本站设定的示例策略,阈值与邮箱均为占位值,正式使用需在表格中核定并替换。
rule_name,applies_to,threshold_amount,currency,approver_email
小额自动通过,amount<=100000,100000,CNY,finance@example.com
市场费用人工复核,category=marketing,0,CNY,ap.manager@example.com
设备租赁复核,category=equipment_rental,200000,CNY,ops.lead@example.com
默认人工复核,amount>500000,500000,CNY,ap.manager@example.com确定性规则Code节点参考代码
本站独立编写的参考代码,known_vendors需从VendorMaster读取结果映射进来,字段名请按实际连线调整。
const invoice = $json.invoice ?? $json;
let ai;
try { ai = typeof $json.ai_output === 'string' ? JSON.parse($json.ai_output) : ($json.ai_output || {}); } catch (e) { ai = {}; }
const knownVendors = $json.known_vendors || [];
const amount = Number(invoice.amount) || 0;
let decision = ai.decision === 'auto_approve' ? 'auto_approve' : 'review';
let reason = ai.reason || 'AI未给出有效判断,按安全默认转人工';
if (amount > 500000) { decision = 'review'; reason = '金额超过500000,确定性规则强制人工复核'; }
if (!knownVendors.includes(invoice.vendor_email)) { decision = 'review'; reason = '供应商不在已知名单,确定性规则强制人工复核'; }
const now = new Date();
const deadline = new Date(now.getTime() + 2*24*3600*1000).toISOString().slice(0,10);
return [{ json: { ...invoice, decision, approver: ai.approver || 'finance@example.com', reason, confidence: ai.confidence ?? 0, approval_deadline: deadline, logged_at: now.toISOString() } }];Webhook测试报文与端点配置
本站虚构测试报文;原模板需在n8n模板页复制到自有实例后核对实际节点参数,本站示例非原工作流文件。
POST到 https://你的n8n域名/webhook/ap/invoice
Content-Type: application/json
{
"vendor_name": "蓝桥物流服务",
"vendor_email": "billing@lanqiao.example",
"invoice_number": "INV-2026-0917",
"amount": 86000,
"currency": "CNY",
"category": "logistics",
"due_date": "2026-10-15"
}
需替换项:n8n域名、Gmail通知收件人(供应商/财务/审批人)、Telegram chat ID、Sheets文档ID。输入与输出示例
本站虚构演示,未实际运行,结果格式与阈值均为练习设定。
输入
用上方测试报文POST:蓝桥物流服务(在名单内且known=true)发票INV-2026-0917,金额86000 CNY,类别logistics。对应输出
{"invoice_number":"INV-2026-0917","decision":"auto_approve","approver":"finance@example.com","reason":"供应商在名单内且金额86000未超小额阈值100000","confidence":0.93,"approval_deadline":"2026-09-19"};Invoices追加一行,Gmail向供应商与finance@example.com发出通过确认,Telegram财务群收到摘要。另测一笔金额600000的报文:即使AI返回auto_approve,兜底规则仍强制decision=review,Gmail改发ap.manager@example.com请求复核。做完检查这些
- 提交缺失invoice_number的报文,工作流走错误分支:Telegram收到告警、Invoices无新增行
- 提交金额86000且在名单内的合成发票,Invoices出现decision为auto_approve的完整一行
- 提交金额600000的报文,最终decision为review且reason注明确定性规则强制复核
- 提交known=false的新星广告传媒发票,结果被强制转人工并通知ap.manager@example.com
- 故意停用Sheets凭据后执行,n8n执行日志出现明确报错而不是静默成功
容易卡住的地方
- 模型输出不一定是合法JSON,解析必须带try/catch兜底,否则整张发票在流水线中丢失
- 确定性规则要用代码强制执行,只写进提示词依赖模型遵守会在临界金额上失效
- Sheets标签页列名与映射必须逐字符一致,多余空格或改表头都会导致追加失败
- Webhook测试URL与生产URL不同,正式联调前需激活工作流,否则外部系统收到404
- OpenAI按量计费且Telegram机器人需先与目标会话建立联系,凭据要用测试专用账号
- 示例阈值与邮箱为本站设定,正式上线前须在ApprovalPolicy中核定真实数值
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Route vendor invoice approvals with gpt-5.6-terra, Gmail, Google Sheets and Telegram
- 原作者
- Khairul Muhtadin
- 原始发布日期
- 2026-09-03T12:43:23.358Z
- 来源
- https://n8n.io/workflows/19128