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

2026-09-28 · 原文发布日

Slack收票审批直通Xero应付发票

免费n8n模板:员工在Slack上传收据照片后,AWS Textract提取商家、总额、日期、币种,OpenAI从固定清单归类费用科目;置信度低则请对方重拍清晰照片,够高就在Slack向经理发审批请求并暂停等待。批准则映射科目到Xero账户代码、创建已授权的ACCPAY发票并把原收据作为附件挂上,审批与驳回结果都写进Google Sheets审计表。

原文要点

该免费n8n工作流由Intuz发布:Slack文件上传触发并下载文件,过滤收据图片后送AWS Textract AnalyzeExpense提取商家、总额、日期、币种;OpenAI按固定清单归类科目并校验置信度,低置信在Slack请对方重拍,够高则发Slack审批请求并暂停等待经理决定。批准后把科目映射为Xero账户代码、经两条Xero请求之一创建已授权ACCPAY发票、把原收据作为发票附件挂上,批准与驳回都写入Google Sheets审计表。要求已配置Xero租户ID、OpenAI与AWS凭据、名为ExpenseAudit的表。

这次做成什么

照着搭一条测试通道:收据照片进Slack后自动提取、归类、经理点按钮审批,批准即在Xero生成应付发票并留审计行。先在工作区测试通道与隔离账套演练,再切正式。

准备什么

  • n8n实例(云或自托管)及发布工作流权限
  • Slack工作区可建bot并开file_share事件与交互消息
  • AWS IAM账号具备Textract AnalyzeExpense权限
  • OpenAI API Key有余额
  • Xero组织OAuth2接入与Tenant ID
  • Google账号及一张含ExpenseAudit标签页的测试表

具体怎么做

  1. 接入Slack并设触发

    在Slack API后台建bot,订阅file_share事件,给files:read、chat:write权限;在n8n加Slack Trigger指向#收据-测试频道,确认能拿到file_id并下载为binary数据。原模板含审批交互按钮,需在Slack开启Interactivity并把请求URL指向n8n。

  2. 配置Textract提取

    添加AWS凭据(IAM策略允许textract:AnalyzeExpense),把上一步下载的binary图片直接作为Textract节点的输入文档;运行一次手工测试,检查输出里有VENDOR_NAME、TOTAL、INVOICE_RECEIPT_DATE等字段及置信度分值。

  3. 配置OpenAI归类与置信度分支

    添加OpenAI凭据,把Textract字段和下方固定科目清单一起发给模型,要求只回一个科目名和归一化JSON;在其后设IF分支:任一关键字段置信度低于你设的阈值(练习可用85)就走Slack消息“请重拍更清晰照片”,否则进入审批。

  4. 发起Slack审批并暂停

    用带Approve/Reject按钮的Slack消息节点发给测试经理(先填你自己),该节点会暂停工作流直到点击;在两个回调分支分别接后续动作。

  5. 批准分支写Xero与附件

    添加Xero OAuth2凭据,在请求头确认Xero-tenant-id指向你的组织;用科目映射表把科目转成账户代码,创建Status=AUTHORISED、Type=ACCPAY的发票(练习把联系人设为测试供应商、到期日设发票日后30天,税率按你账套选),再调附件接口把原收据binary挂到该发票。

  6. 驳回分支与审计日志

    驳回分支在Slack通知上传者“已被驳回:原因”;两条分支末尾都向Google Sheets的ExpenseAudit页追加一行(时间、上传人、商家、金额、科目、结果)。全部测试通过后把草稿发布为上线版本。

可直接复制的材料

科目到Xero账户代码映射表(本站示例,需按你账套改)

本站按常见费用科目编的示例;代码必须替换为你Xero账套Chart of Accounts里的真实Code,999仅作兜底人工复核用。

{"Meals":"429","Travel":"493","Office Supplies":"461","Software & Subscriptions":"485","Marketing":"500","Utilities":"445","Other - Requires Review":"999"}

OpenAI归类提示词(可直接粘贴)

配合输出解析使用;{{textract_fields}}在n8n里用表达式引用上一节点JSON。

你是费用会计助手。下面是AWS Textract从一张收据提取的字段JSON:
{{textract_fields}}
任务:
1. 只从以下固定清单中选一个最匹配的科目:Meals, Travel, Office Supplies, Software & Subscriptions, Marketing, Utilities, Other - Requires Review
2. 把金额规范为数字(不含货币符号),日期规范为YYYY-MM-DD,币种用ISO三字母代码。
3. 只输出一个JSON对象,不要任何解释:{"category":"...","vendor":"...","total":0.00,"date":"YYYY-MM-DD","currency":"XXX"}

ExpenseAudit审计表列结构(本站练习用合成示例)

本站虚构练习数据;在Google Sheets新建同名表头即可,勿放入真实员工姓名。

timestamp,slack_user,vendor,total,currency,category,xero_invoice_id,status,note
2026-09-28T10:15:00Z,@testuser,Acme Office Store,128.60,USD,Office Supplies,INV-TEST-0001,approved,manager clicked approve
2026-09-28T10:42:00Z,@testuser,Cab Ride Co,36.00,USD,Travel,,rejected,out of policy

输入与输出示例

本站虚构演示,未实际运行,发票号与返回值均为示意。

输入

测试员在#收据-测试频道上传一张虚构收据照片:Acme Office Store,2026-09-27,合计USD 128.60,Textract各字段置信度均≥92。

对应输出

OpenAI返回{"category":"Office Supplies","vendor":"Acme Office Store","total":128.60,"date":"2026-09-27","currency":"USD"};Slack审批消息发出,点击Approve后Xero出现Status=AUTHORISED、Type=ACCPAY、账户代码461的发票且带收据附件;ExpenseAudit新增一行status=approved。

做完检查这些

  • 上传清晰收据照片后,Slack测试频道出现含Approve/Reject按钮的审批消息,且点击前工作流处于暂停等待状态
  • 点击Approve后Xero测试账套出现已授权ACCPAY发票且附件可打开原收据图
  • ExpenseAudit表按结果各追加approved与rejected至少一行
  • 上传模糊照片时收到要求重拍的Slack回复且不进入审批

容易卡住的地方

  • Slack未开Interactivity或未配回调URL时审批按钮点击无反应
  • Xero请求缺Xero-tenant-id头或连错租户会报401/403
  • 草稿状态的工作流不会响应真实事件,必须发布
  • 科目映射代码与Xero账套不符时发票创建失败或记错科目
  • Textract对手写收据置信度天然偏低,阈值过高会大量走重拍分支

原文与作者资料 ↗

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

原文标题
Approve Slack expense receipts and post invoices to Xero with Textract and OpenAI
原作者
Intuz
原始发布日期
2026-09-28T07:17:52.356Z
来源
https://n8n.io/workflows/20018