2026-10-10 · 原文发布日
n8n模板:webhook与邮件PDF统一入库Airtable和HubSpot
该n8n流程统一接收两类业务数据:带鉴权的webhook POST,或轮询Gmail中'Intake'标签下的PDF附件并用OpenAI抽成结构化记录。按external_id去重、校验字段、算内容哈希跳过未变化记录后同步到Airtable与HubSpot(先查退订),每条结果写Google Sheets审计日志,异常经Telegram报警,另有每日对账扫描。
原文要点
来源是n8n公开模板页(作者Mashrur Rahman),描述一条统一入库流程:触发来源有三——带Header Auth鉴权的POST webhook、轮询Gmail中'Intake'标签并下载PDF附件、手动测试。PDF文本经OpenAI(LangChain Information Extractor)抽成结构化记录批次;随后拆分单条记录、按external_id去重、规范化字段,无效记录隔离而非写入;为每条记录算SHA-256内容哈希,按external_id查Airtable,哈希未变则跳过;新增或变更记录upsert进Airtable,查HubSpot是否邮件退订,未抑制才upsert联系人;每条记录写一行Google Sheets'Audit Log'审计日志,非成功状态发Telegram告警,每轮写'Reconcile Report'摘要;另有每日定时扫描统计Airtable记录数与前100个HubSpot联系人并写表、发Telegram对账消息(一致时静默)。需较新n8n版本(Information Extractor v1.2、Merge v3.2、Remove Duplicates v2)。
这次做成什么
在n8n中按'双入口→去重校验→哈希比对→双库同步→审计告警→每日对账'的结构自建一条演练流程(本站独立设计,非原工作流文件)。练习输入为webhook推送的两条合成记录,目标是验证去重、哈希跳过、审计日志三条核心链路;PDF入口用一条伪造的提取结果模拟,不实际训练抽取。
准备什么
- 较新版本的n8n(需支持Information Extractor v1.2、Merge v3.2、Remove Duplicates v2节点)
- Header Auth凭据用于webhook鉴权(键值自定义,如X-Intake-Key)
- Airtable个人访问令牌,表内含external_id、name、email、company、amount、content_hash六个字段
- HubSpot私有应用token,Gmail OAuth、OpenAI API key、Google Sheets OAuth凭据
- Telegram bot token与chat ID,Google Sheets含'Audit Log'和'Reconcile Report'两个页签
- Gmail中已建好'Intake'标签并应用到带PDF附件的邮件
具体怎么做
准备Airtable表与审计表
在Airtable建表,字段依次为external_id(文本主键)、name、email、company、amount(数字)、content_hash。在Google Sheets建'Audit Log'页签,列头为external_id、status、reason、processed_at;建'Reconcile Report'页签,列头为run_at、airtable_count、hubspot_count、in_sync。把两处ID记下来,替换节点中的占位符(原模板说明中要求替换YOUR-AIRTABLE-BASE-ID和YOUR-AIRTABLE-TABLE-ID)。
搭建webhook入口并自测
加Webhook节点,方法POST,认证选Header Auth并填入自定义键值。接一个Code节点统一请求体形:若body是数组直接用,若body含records键则取body.records。用下方artifact的测试payload通过curl或Postman发送,缺header应被拒,带正确header应进入后续节点。
搭建Gmail PDF入口
加Gmail Trigger轮询'Intake'标签的邮件,下载PDF附件后用提取文本的节点读出内容,再接Information Extractor节点(OpenAI模型),提示词用下方artifact,输出为一个记录批次。演练阶段可先用一个Set节点手工填入两条伪造的提取结果代替真实PDF,验证管道后再换真附件。
实现拆分、去重与校验
两路汇合后用Split Out节点把批次拆成单条记录,接Remove Duplicates节点按external_id去重。然后Code节点校验:external_id、email为必填,amount必须为数字,email需含@;不合格记录不进主流程,直接以status=quarantined写入Audit Log并触发Telegram告警。
实现哈希比对与双库同步
Code节点对规范化后的记录字段(name+email+company+amount)计算SHA-256得到content_hash。HTTP Request节点按external_id查Airtable匹配记录:存在且哈希相同则status=skipped直接进审计;不存在或哈希变化则upsert进Airtable。随后HubSpot节点按email查询联系人是否退订,退订则标记suppressed跳过写入,否则upsert联系人。
审计、告警与每日对账
每条记录汇到Google Sheets Append写Audit Log一行(external_id、status、reason、processed_at)。IF节点判断status非created/updated/skipped时发Telegram消息,消息里的execution_url链接记得把YOUR-N8N-HOST换成你的实例域名。另建Schedule Trigger每日执行,分别统计Airtable记录数和HubSpot前100个联系人,写入Reconcile Report,不一致时发Telegram,一致则静默。
可直接复制的材料
webhook测试payload
本站虚构测试数据。发送时Header带自定义鉴权键值(如X-Intake-Key: 你的练习密钥),重复发送同一payload第二次应全部被判为skipped(哈希未变)。
{
"records": [
{
"external_id": "DEMO-001",
"name": "陈晨",
"email": "chenchen@demo-supplier.cn",
"company": "示例供应链",
"amount": 4200
},
{
"external_id": "DEMO-002",
"name": "赵磊",
"email": "zhaolei@demo-supplier.cn",
"company": "示例供应链",
"amount": 15800
}
]
}PDF结构化提取提示词(Information Extractor用)
本站独立编写的提取提示词,{{ $json.pdf_text }}需替换为你工作流中PDF文本所在字段的表达式;输出schema需与Information Extractor节点的字段定义保持一致。
你是数据抽取助手。从下面的文档文本中抽取所有业务记录,只输出JSON数组,每个元素包含字段:external_id(文档中的单据/编号)、name(联系人姓名)、email(邮箱)、company(公司名)、amount(金额,纯数字,无货币符号)。找不到的字段填空字符串,amount找不到填0。不要输出任何解释文字。
文档文本:
{{ $json.pdf_text }}字段映射与哈希输入配置
本站设计的映射约定:哈希输入只用四个业务字段,不含external_id与时间戳,保证同内容重复推送时哈希稳定;若你增加字段,需同步改映射与哈希输入两处。
normalized_fields:
external_id: body.external_id
name: body.name
email: body.email (trim并转小写)
company: body.company
amount: body.amount (转Number,失败置为null并判quarantine)
hash_input: "${name}|${email}|${company}|${amount}" (UTF-8拼接后SHA-256,hex输出)
airtable_upsert_match_on: external_id
hubspot_lookup_key: email输入与输出示例
本站虚构演示,哈希值与计数为示意,并非真实运行结果;每日对账的HubSpot侧只统计前100个联系人,本示例规模下恰好一致。
输入
向webhook发送上方payload:DEMO-001(陈晨,amount=4200)与DEMO-002(赵磊,amount=15800)两条记录,鉴权header正确。对应输出
第一轮执行:Audit Log写入两行——DEMO-001 | created | new record | 2026-10-10T10:00:00;DEMO-002 | created | new record | 2026-10-10T10:00:00。Airtable新增2行,content_hash分别为64位十六进制串。HubSpot两人均未退订故各upsert一个联系人。Reconcile Report追加一行:2026-10-10T10:00:05, 2, 2, true,Telegram静默。第二轮原样重发:两行状态均为skipped(hash unchanged),Airtable与HubSpot记录数不变。做完检查这些
- 带正确Header Auth的payload能进入流程,缺失或错误header的请求被webhook拒绝
- 重复发送同一payload,第二轮Audit Log中所有记录status为skipped,Airtable记录数不增加
- 把DEMO-001的amount改为5000再发一次,该条被判updated且Airtable对应行的content_hash发生变化
- 故意发送一条缺email的记录,它不出现在Airtable中,而是以quarantined写入Audit Log并收到Telegram告警
- Reconcile Report每日新增一行,in_sync列的值与两个系统的实际计数一致
容易卡住的地方
- 每日对账只统计前100个HubSpot联系人,门户数据量大时该数字无代表性,原作者也建议先收窄到本同步创建的联系人范围
- webhook请求体既不是数组也不含records键时,需在统一节点判为格式错误,否则下游拆分会报莫名错误
- 金额字段带货币符号或千分位逗号会导致转Number失败,应在规范化时清洗而不是直接判隔离
- OpenAI提取的external_id可能带空格或大小写不一致,去重前应统一trim,否则同一单据被当两条
- Gmail标签名'Intake'大小写或拼写不一致时触发器静默无数据,排障时先查标签
本站借助AI整理来源事实,独立编写中文操作指南与示例。示例不代表实际运行结果;来源效果尚未由本站独立复现。付费模板与模型、服务费用分别计算。
- 原文标题
- Sync webhook and emailed records with Airtable, HubSpot, Gmail, OpenAI and Telegram
- 原作者
- Mashrur Rahman
- 原始发布日期
- 2026-10-10T00:44:45.647Z
- 来源
- https://n8n.io/workflows/20717