2026-09-15 · 原文发布日
收据照片自动记账进Notion
免费n8n模板,双入口收收据:Gmail里匹配条件的新邮件附件(PDF会先抽取文本),或Telegram里发给机器人的照片(取最高分辨率转base64),都交给gpt-4o-mini提取商家、日期、金额、币种、类别和摘要的JSON,规范化后在Notion费用数据库新建条目,并用Telegram回执确认;工作流出错时还会往Slack和Telegram发告警。需要在Notion建对应属性的数据库并配置各平台凭据。
原文要点
来源是n8n.io上Rahul Joshi发布的免费工作流模板(19619)。双入口:Gmail触发器匹配收据搜索条件的新邮件,取第一个附件,PDF先抽取文本;Telegram触发器收到带照片的消息才继续,下载最高分辨率照片转base64数据URL。两路都交给gpt-4o-mini返回JSON(vendor、date、amount、currency、category、summary),规范化后在Notion费用数据库新建条目(属性含Vendor、Amount、Currency、Date、Category、Source、Notes),Telegram发确认回执;工作流出错时向Slack和Telegram告警。需替换数据库ID和两个Telegram聊天ID占位符。
这次做成什么
搭一条双入口收据记账流水线:Gmail收据附件和Telegram收据照片都自动提取商家、日期、金额、币种、类别、摘要,写入Notion费用数据库并回执确认。本站不下载原工作流,按原文描述的节点顺序自建等价练习,提示词与字段映射为本站独立示例。
准备什么
- n8n实例及Gmail OAuth2、Telegram Bot、OpenAI、Notion、Slack五套凭据
- Notion中一个费用数据库,并已建好Vendor、Amount、Currency、Date、Category、Source、Notes属性
- 用BotFather创建的Telegram机器人,且已先与它开启对话
- 一张虚构收据图片或一段合成收据文本用于测试
具体怎么做
建Notion费用数据库
在Notion新建数据库,属性依次为:Vendor(标题)、Amount(数字)、Currency(单选或文本)、Date(日期)、Category(单选)、Source(文本)、Notes(文本)。在集成设置中把数据库授权给n8n所用的Notion集成,复制数据库ID,替换工作流里的REPLACE_WITH_YOUR_NOTION_EXPENSES_DATABASE_ID占位符。
配置Gmail入口
添加Gmail Trigger节点,设置收据搜索过滤(例如主题含发票/收据类关键词且带附件,具体过滤串以你的邮箱情况为准)。后接附件处理:取第一个附件,用IF节点判断是否PDF,是则用PDF文本抽取节点取出文本内容交给OpenAI;否则把图片附件直接交给OpenAI做视觉识别。
配置Telegram入口
添加Telegram Trigger节点监听新消息,用IF节点过滤仅含照片的消息。Telegram节点下载最高分辨率的那张照片,用Code节点转成base64数据URL,连同下文提取提示词一起发给gpt-4o-mini,让模型从图片中读收据。
提取JSON并规范化
两条支路汇合到同一OpenAI调用:提示词要求只返回vendor、date、amount、currency、category、summary六个字段的JSON。后接Code节点做规范化:日期转ISO格式(YYYY-MM-DD)、amount转数字、currency统一大写、category映射到Notion单选已有选项,解析失败时抛错进入错误分支。
写Notion、回执与告警
Notion节点选Create Page,把规范化字段逐一映射到对应属性,Source字段写Gmail或Telegram标识来源。Telegram节点向REPLACE_WITH_YOUR_TELEGRAM_CHAT_ID发送确认,内容含商家、金额、日期。最后给整个工作流配置Error Trigger:出错时向指定Slack频道和YOUR_ADMIN_TELEGRAM_CHAT_ID各发一条含错误消息的告警。
可直接复制的材料
收据字段提取提示词
本站独立编写,{收据文本或图片}处接上游节点输出;原模板内部提示词未公开。
你是收据记账助手。下面是收据内容(可能是PDF提取的文本,也可能是收据照片)。\n请提取以下信息并只输出一个JSON对象,不要输出其他文字:\n{\"vendor\":\"商家名称\",\"date\":\"消费日期,YYYY-MM-DD\",\"amount\":数字金额,\"currency\":\"三字母币种代码如CNY、USD\",\"category\":\"从[餐饮,交通,办公,住宿,软件订阅,其他]中选一个\",\"summary\":\"不超过30字的消费摘要\"}\n若某字段无法识别,用null表示,不要编造。\n收据内容:\n{收据文本或图片}字段规范化Code节点示例
本站示例,Amount/Date缺失时主动报错走告警分支,避免脏数据进Notion。
const raw = JSON.parse($json.output);\nconst cats = ["餐饮","交通","办公","住宿","软件订阅","其他"];\nconst item = {\n Vendor: raw.vendor || "未知商家",\n Amount: Number(raw.amount),\n Currency: (raw.currency||"CNY").toUpperCase(),\n Date: raw.date,\n Category: cats.includes(raw.category) ? raw.category : "其他",\n Source: $json.source || "Telegram",\n Notes: raw.summary || ""\n};\nif (!raw.amount || !raw.date) throw new Error("收据金额或日期缺失,需人工核对");\nreturn [{ json: item }];合成测试收据数据
本站合成的虚构测试输入,代替真实收据,避免上传真实票据信息。
{\"receipt_text\":\"云启咖啡(虚构)\\n2026-03-14 14:22\\n拿铁 x2 32.00\\n三明治 x1 18.00\\n合计 CNY 50.00\\n谢谢惠顾\"}输入与输出示例
本站虚构演示,非原作者运行结果;gpt-4o-mini对真实小票照片的识别效果需自行验证。
输入
向Telegram机器人发送一张收据照片,内容为上面合成数据:云启咖啡(虚构),2026-03-14,拿铁两杯32元、三明治一份18元,合计50元人民币。对应输出
提取JSON:{"vendor":"云启咖啡","date":"2026-03-14","amount":50,"currency":"CNY","category":"餐饮","summary":"咖啡与三明治工作餐"}。Notion新增条目:Vendor=云启咖啡、Amount=50、Currency=CNY、Date=2026-03-14、Category=餐饮、Source=Telegram、Notes=咖啡与三明治工作餐。Telegram回执:已记账 云启咖啡 50 CNY(2026-03-14)。做完检查这些
- Notion数据库七个属性名称与原模板占位符要求的拼写完全一致,写入不报错
- 合成收据测试后,Notion新条目的Amount为数字50、Date为2026-03-14且Source标注正确入口
- Telegram收到含商家、金额、日期的确认回执
- 人为让金额缺失触发错误时,Slack频道和管理员Telegram都收到告警
容易卡住的地方
- Telegram触发器必须先在BotFather建机器人并主动开启对话,否则收不到照片也无法回执
- REPLACE_WITH_YOUR_NOTION_EXPENSES_DATABASE_ID等占位符必须全部替换,漏一处就运行失败
- Notion集成未授权数据库时Create Page会报权限错误
- Gmail过滤条件过宽会把普通邮件附件送进流程产生额外OpenAI调用费用
- gpt-4o-mini为付费模型,提取失败返回非JSON时规范化节点会抛错,需要错误分支兜底
- 照片模糊或币种符号歧义时模型可能读错金额,关键账目仍需人工抽查
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Log receipt expenses in Notion with Gmail, Telegram, and OpenAI
- 原作者
- Rahul Joshi
- 原始发布日期
- 2026-09-15T08:24:11.519Z
- 来源
- https://n8n.io/workflows/19619