← 回到舞台
BillFlow“预防税务问题”的电子发票软件
全部作品

图版 III · BillFlow · 2026

骨白颜料 · 沿航迹掠过的侧光

面向欧盟跨境 Shopify 商家的订单发票网关:发出前完成税号校验,未通过的发票进入待修正队列。

合规流程 / 业务规则 / 异常恢复

案例摘要

公司
公司名称因合同条款匿名
团队规模
1–10 人
我的角色
负责订单到发票的数据流转、校验规则与异常恢复体系。
技术栈
Shopify / Hono / SQLite / React
问题
B2B 买方因格式或税号瑕疵拒收了 7.9% 的发票,买家还常把税号随手填在订单备注里。
用户
欧盟跨境 Shopify 商家,其中 3 位德国商户接受了访谈;另有发票售后工单。
关键决定
发出前校验,未通过的发票进入待修正队列;抽取税号用正则、校验位算法和 VIES 核验,不用大语言模型。
结果
6 周后买方拒收率从 7.9%(63/797)降到 1.2%(11/914);代价:上线后头两周,询问发票为何停在待修正队列的工单上升 35%。
订单到发票的流程
STAGE 01订单接入✓ 已接收
STAGE 02税号与规则校验✓ 校验位 + VIES
STAGE 03待修正队列字段未通过时
STAGE 04生成发票✓ EN 16931
STAGE 05发送✓ 已发送

一个决定

合规场景里,AI 在哪一步停手

BillFlow 从订单备注里抽取税号这一步,用规则完成,不交给模型。在 80 条脱敏备注上,正则初筛、校验位算法加 VIES 接口核验共抽出 44 条,44 条全部正确;没能识别的 8 条转给商户人工确认。发票改为先校验再发出,运行 6 周后,B2B 发票被买方拒收的比例从 7.9%(63/797)降到 1.2%(11/914)。

买家常把税号随手填进订单备注,一位德国商户说,要靠人工反复猜哪些买家属于企业客户。通用大语言模型能从自由文本里找出号码;规则只认得出符合已知格式的那部分。运营同事另有顾虑:前置拦截会让商户恐慌,他们主张“先出具发票,后续出问题再修改”。

模型抽出 52 条,其中 47 条正确;错的 5 条里,有 3 条被模型自作主张“纠正”了一位校验数字。合规场景里这类错误最危险:号码看上去有效,却并非买家的税号,一旦开票,就会印进具有法律效力的单据。规则抽出的少,但没有犯这类错。同样的考虑也定下了超时的处理:批处理中 VIES 两次超时,系统标为“待核验”,外部服务暂时不可用,推不出税号无效。

拦截要付出时间。上线后头两周,询问“发票为何停在待修正队列”的客服工单增加了 35%,直到第 4 周商户熟悉规则后才恢复正常。我们上线前没有向商户推送操作指引和规则变更提示,这部分沟通成本本来可以避免。

模型在错误会变成法律事实的地方停手,只用在反正有人复核输出的环节。“没能核验”单独作为一种状态,和“错误”分开。规则改动先告诉会被它拦下的人,再开始拦。

  1. 订单备注
  2. 正则初筛
    • 未匹配:转给商户确认
  3. 校验位
    • 校验失败:进入待修正队列
  4. VIES 核验
    • 超时:标为“待核验”
  5. 发出发票
税号由规则读取,这条路径上没有模型。

系统如何分工

  1. 01订单与税号
  2. 02规则校验:校验位 + VIES
  3. 03待修正队列
  4. 04生成与发送发票

数据错误进入待修正队列并标出缺失字段;VIES 超时标记为待核验,不判为税号无效。

品牌卡 · 图版 III

BillFlow

账本停在它无法担保的那一栏。

作品标记:影片里这件物体的笔画,缩成一枚

色彩

  • 象牙黑 #0E0D0C账本
  • 骨白 #EDE6D8已核验的数值
  • 灰 7 #B9B2A6被拦下的字段,加一道外框
  • 灰 5 #8E887F待核验

字体

  • Geist账本与表单
  • 等宽字体税号与校验位

动效

  • 印240 ms税号随核验逐位印出
  • 光1200 ms被拦下的字段一直亮着,直到改好

问题与背景

BillFlow 属于面向欧洲跨境 Shopify 商家的订单合规发票网关,技术栈采用 Shopify 集成代码、Hono、SQLite 与 React。业务对接欧盟 EN 16931 电子发票标准与 VIES 增值税号核验接口,同时响应德国 2025 年起企业须具备接收 B2B 电子发票能力的法规要求。我负责订单到发票的数据流转、校验规则与异常恢复。

用户验证:工单分析与商户访谈

抽取 1 个月内的 15 笔发票售后工单,由 2 人独立进行类别编码,评定者一致性 κ = 0.71。

故障类别 工单数
采购方系统因格式标准拒收 6 笔
增值税号缺失或校验格式不符 3 笔
订单退款与红字发票冲销 2 笔
其余杂项 4 笔

我还访谈了 3 位德国商户。一位咖啡器材商户说:“从电商订单难以区分哪些买家属于企业客户。买家常常把税号随手填在订单备注栏,需要人工反复猜测辨认。”

评测:从订单备注抽取税号

测试集:80 条脱敏处理后的真实订单备注。

方案 抽取出税号 完全正确 错误
A:通用大语言模型直接抽取 52 条 47 条 5 条(其中 3 条被模型自动“纠正”了一位校验数字)
B:正则初筛 + 校验位算法 + VIES 接口核验 44 条 44 条 0 条

方案 B 没能直接识别的 8 条备注,统一转入商户人工确认。批处理评测中遇到 2 次 VIES 临时超时,系统把这些税号标记为“待核验”,不把外部服务暂时不可用判定为“税号无效”。

抽取规则采用方案 B。模型悄悄改掉一位校验数字,会产生一个看起来正确的错误税号,这比请商户确认一次更糟。

团队决策:前置拦截,并为此付出代价

运营同事担心前置拦截发票会引发商户恐慌,主张“先出具发票,后续出问题再修改”。改动前 6 周,B2B 发票因格式或税号瑕疵被买方拒收 63/797 笔,拒收率 7.9%。

我们上线了前置校验拦截:校验失败的发票进入“待修正队列”,商户补充税号或修正地址后再发出。运行 6 周后,拒收率从 7.9% 降到 1.2%(11/914)。

代价同样真实。上线后头两周,关于“发票为何停在待修正队列”的客服咨询增加 35%,到第 4 周商户熟悉规则后才恢复正常水位。上线前我们没有向商户推送操作指引和规则变更提示,造成了本可避免的沟通成本。

异常处理规范

故障类别 典型诱因 系统处理 商户端展示
临时性外部故障 VIES 接口超时、网络通信异常 有限指数退避重试,上限 3 次 标注“验证中”
数据格式错误 税号校验位不符、法定地址缺项 中止流程,转入待修正队列 标出缺失字段名称
跨境规则待确认 跨国交易涉及新兴特定税则 转入人工复核 标注“需确认”

修正工作台必须直接定位错误字段并支持原地保存;商户处理单张受阻发票的中位耗时目标不超过 2 分钟。

局限

工单分析只覆盖 1 个月内的 15 笔工单;访谈只有 3 位商户,都在德国。

复盘

如果重来,我会在开启拦截之前,先给商户发一份简短指引和规则变更通知。复盘把那部分本可避免的咨询,归因到这项缺失的通知上。

60 秒宣传片