AI PLAY玩法更新持续收录
← 回到更新流

2026-10-11 · 原文发布日

发票自动录入与校验流水线

给还在手工录入供应商发票的记账人员用的n8n模板:通过webhook接收上传的发票PDF,提取文本后交给OpenAI读出供应商、票号、日期、金额和行项目;先查Google Sheets台账防重复,再校验行项目合计与总额是否一致,低置信度或疑似重复就发Gmail请你人工复核,没问题的直接POST到QuickBooks、Xero等记账系统并写入台账。每天早上8点还会汇总所有待复核发票发提醒邮件。模板免费。

原文要点

原模板是一条n8n发票处理工作流:webhook接收上传的发票PDF,校验文件类型并提取文本,用OpenAI结构化读出供应商、票号、日期、总额、币种和行项目;读取Google Sheets的Invoices标签页按供应商名+票号查重,校验行项目合计与总额,需要人工复核时用Gmail发邮件;合格发票通过可配置的HTTP请求POST到记账系统,并把带状态的记录写回Sheets,每天早8点还有一条定时分支汇总仍为review状态的发票发提醒邮件。需要OpenAI API key、Google账号(Sheets+Gmail)和QuickBooks或Xero等记账系统账号。原页面称模板免费,涉及的第三方服务费用以各服务商为准。

这次做成什么

在本站指导下搭建一条「上传发票PDF→AI提取→查重与金额校验→自动入账/人工复核」的练习版流水线,并用合成发票数据走通查重、合计校验和复核分支三种路径。

准备什么

  • 一个可自建的n8n实例(云端或本地部署均可)并具备添加凭据的权限
  • OpenAI API key,以及开通了Sheets和Gmail的Google账号并配置好OAuth2凭据
  • 一个测试用Google Sheets文档,含名为Invoices的标签页,表头至少为date、status、vendor_name、invoice_number、total_amount、currency
  • 一个可接收POST的记账系统测试端点;没有QuickBooks/Xero测试账号时可先用webhook.site之类的临时接收地址代替

具体怎么做

  1. 准备台账表和凭据

    在Google Sheets新建文档,第一个标签页重命名为Invoices,第一行依次填入date、status、vendor_name、invoice_number、total_amount、currency六列;手动写入一行历史数据作为查重基准,例如2026-09-15、posted、恒宇办公用品、INV-2026-0915、1130.00、CNY。在n8n的Credentials里分别添加OpenAI、Google Sheets OAuth2、Gmail OAuth2三个凭据并各自测试连接。

  2. 接入webhook入口并配置CONFIG节点

    从n8n模板库打开20743号工作流副本,找到发票上传的Webhook节点,激活工作流后复制其Production URL;在两个CONFIG节点里把owner_email改成你自己的邮箱、把Google Sheets文档ID填进去(文档ID是表格URL中/d/与/edit之间那段字符串)。先用curl或Postman向该URL以multipart/form-data方式POST一个发票PDF文件,确认能收到received的JSON响应。

  3. 核对提取与校验逻辑

    打开OpenAI提取节点,确认输出schema包含vendor、invoice_number、invoice_date、total、currency、line_items(每项含description、quantity、amount);在Code节点里阅读查重逻辑(按vendor_name+invoice_number匹配已有行)与合计校验逻辑(行项目amount之和与total的差值在容差内则通过)。用三张合成发票分别触发:全新发票、票号与台账已有行重复的重复发票、行项目合计与总额差5元的异常发票,观察各自走向。

  4. 配置入账HTTP节点并测试

    找到名为Post to Accounting - HTTP的节点,把URL改成你的记账系统测试端点或临时接收地址,认证方式按目标系统选Header Auth或OAuth2;发送一条合格发票后,到接收端检查payload里是否带齐vendor、invoice_number、total、currency字段,再到Sheets确认追加了一行status为posted的记录。

  5. 验证复核与每日提醒分支

    发送重复发票和合计异常发票,确认两张都触发了Gmail复核邮件且Sheets里对应行status为review;然后手动把Schedule Trigger(每天8:00)节点临时改成几分钟后触发一次来测试,确认收到的提醒邮件里列出了所有仍为review的发票行,测完改回每天8:00。

可直接复制的材料

OpenAI发票字段提取提示词(本站编写示例)

本站独立编写的练习提示词,{{}}占位符需替换为PDF提取文本;原模板的实际schema和字段名请以模板内节点为准。

你是发票信息提取助手。请从下面的发票文本中提取结构化字段,只输出JSON,不要输出任何解释文字。
输出格式:{"vendor":"供应商全称","invoice_number":"发票号码","invoice_date":"开票日期YYYY-MM-DD","currency":"三字母币种代码","total":含税总额数字,"line_items":[{"description":"项目名称","quantity":数量,"amount":"金额数字"}],"confidence":0到1之间的置信度}
规则:1) 找不到的字段填null;2) total必须与发票上的含税总额一致,不要自己计算;3) line_items逐项列出,金额保留两位小数;4) 文本模糊或字段缺失时降低confidence。
发票文本如下:
{{从PDF提取出的纯文本}}

合成测试发票文本(三份)

本站虚构的练习数据,不包含任何真实公司信息;把三份文本分别做成简易PDF即可用于上传测试。

发票A(合格):供应商:晨光文具;发票号:INV-2026-1001;日期:2026-10-08;项目:A4复印纸10箱×28.00=280.00,签字笔50支×2.40=120.00;含税总额:400.00 CNY。
发票B(重复,票号与台账已有行一致):供应商:恒宇办公用品;发票号:INV-2026-0915;日期:2026-09-15;项目:打印墨盒5个×226.00=1130.00;含税总额:1130.00 CNY。
发票C(合计异常):供应商:蓝海物流;发票号:INV-2026-1002;日期:2026-10-09;项目:市内配送费300.00,仓储费200.00;含税总额:495.00 CNY。

入账HTTP请求体的字段映射示例

本站编写的通用映射示例;接入真实QuickBooks/Xero时字段名和端点必须以对应官方API文档为准,{{}}为n8n表达式占位写法。

{
  "vendor_name": "{{OpenAI提取.vendor}}",
  "invoice_number": "{{OpenAI提取.invoice_number}}",
  "invoice_date": "{{OpenAI提取.invoice_date}}",
  "total_amount": "{{OpenAI提取.total}}",
  "currency": "{{OpenAI提取.currency}}",
  "line_items": "{{OpenAI提取.line_items}}"
}

输入与输出示例

本站虚构演示,未实际运行该模板,邮件措辞以模板实际配置为准。

输入

上传合成发票C(蓝海物流,INV-2026-1002,行项目300.00+200.00=500.00,但票面总额为495.00,差5.00元),台账中无此票号

对应输出

Sheets追加一行:2026-10-09, review, 蓝海物流, INV-2026-1002, 495.00, CNY;Gmail复核邮件正文含「蓝海物流 / INV-2026-1002 / 行项目合计500.00与总额495.00相差5.00,请人工核对」;webhook返回{"status":"received","flag":"review"}

做完检查这些

  • 台账中已有的恒宇办公用品INV-2026-0915被识别为重复,触发Gmail重复提醒邮件且Sheets中该行status为review
  • 发票C因行项目合计与总额差5.00元被标记review,复核邮件中能看到差额提示
  • 全新合格发票A成功POST到测试接收端,payload包含vendor、invoice_number、total、currency,且Sheets追加status为posted的行
  • 定时分支触发后,提醒邮件列出且只列出当前status为review的发票
  • webhook每次上传后都返回含received字样的JSON响应

容易卡住的地方

  • CONFIG节点里的Sheets文档ID填错会导致查重读不到台账,所有发票都会被当作新票直接入账,务必先用一条已知重复数据验证查重分支
  • 工作流未激活时webhook只有Test URL可用,测试URL只在手动监听时响应一次,正式联调必须激活后用Production URL
  • Gmail和Sheets是两个独立的OAuth2凭据,漏配任何一个会在对应节点报401而不是给出中文提示
  • 合计校验的容差写在Code节点里,原模板未在页面说明具体数值,接入前应打开节点确认并按业务需要调整
  • 模板让记账端点可自由配置,但未附带任何具体记账系统的字段映射,QuickBooks/Xero的真实字段名需查官方文档
  • PDF为纯扫描图片时文本提取可能为空导致低置信度,这类票会走人工复核分支,属于预期行为而非故障

原文与作者资料 ↗

本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。

原文标题
Extract and validate invoice data with OpenAI, Google Sheets, and Gmail
原作者
AI Automation Playbook
原始发布日期
2026-10-10T16:26:03.343Z
来源
https://n8n.io/workflows/20743