很多独立开发者开 Stripe Tax,是因为想少一点税务配置。这个方向没错,但别把它理解成「打开开关就完事」。税务判断最怕资料断层:Checkout 收到一个国家,Customer 里是另一个国家,发票又没有税号,最后你自己也说不清。
我更愿意把 Stripe Tax 当成一套记录系统。它能帮你计算和收税,但前提是你喂进去的客户信息靠谱。
开通前先检查哪些字段
把客户资料分成五类:
| 字段 | 对 SaaS 的作用 | 我会怎么处理 |
|---|---|---|
| 账单地址 | 判断客户所在地 | Checkout 强制收集或在注册后补齐 |
| 付款方式国家 | 辅助地区证据 | 和账单地址冲突时标记复核 |
| IP 地址 | 辅助判断和风控 | 只存必要日志,别把它当唯一依据 |
| 税号 | B2B 发票和税务处理 | 用 Stripe Tax ID 机制收集和验证 |
| 客户类型 | B2B / B2C | 影响发票字段、税号和售后流程 |
如果你的 SaaS 只卖月订阅,最小配置也应该有:客户邮箱、账单国家或地区、账单邮编、公司名(可选)、税号(B2B 可选但推荐)。
Stripe 文档里有 Customer locations 和 Customer tax IDs 两块,建议一起看。只看 Tax 首页很容易漏掉客户资料这层。
Checkout 里怎么收地区证据
用 Stripe Checkout 时,我会优先让 Checkout 收集账单地址,而不是自己做一个半成品表单。
常见设置思路:
const session = await stripe.checkout.sessions.create({
mode: "subscription",
line_items: [{ price: priceId, quantity: 1 }],
automatic_tax: { enabled: true },
billing_address_collection: "required",
customer_update: {
address: "auto",
name: "auto",
},
tax_id_collection: { enabled: true },
success_url: `${origin}/billing/success?session_id={CHECKOUT_SESSION_ID}`,
cancel_url: `${origin}/pricing`,
});
我不喜欢在定价页只放一个邮箱输入框,然后跳支付。短期转化看着顺,后面补资料会很麻烦。尤其是 B2B 客户,发票抬头、税号、地址最好在第一次付款时就拿到。
如果你已经上线了,可以先做两件事:
- 新客户强制收集账单地址。
- 老客户在下次进入 Billing Portal 或升级套餐时补齐地址。
不要一次性弹窗打扰所有老客户。让资料补齐发生在账单相关动作里,用户更容易理解。
税务与账单对账
每月关账时,我会抽一张表:
| 订单 | Customer 地址 | 付款方式国家 | 税号 | 税额 | 状态 |
|---|---|---|---|---|---|
| sub_001 | DE | DE | 有 | 已收 VAT | 正常 |
| sub_002 | US | CA | 无 | 未收 | 复核 |
| sub_003 | FR | FR | 有 | B2B 规则 | 正常 |
重点看冲突项:
- 账单地址和付款方式国家不同。
- 客户声称 B2B,但没有公司名或税号。
- 发票国家为空,但订单已经收款。
- 客户频繁改地址后立即要求退税或重开发票。
这些不一定是坏单,但要留记录。Stripe Dashboard 可以查客户、发票和税务计算结果;你自己的后台也要保存当时的客户资料快照。客户后来改地址,不应该覆盖历史发票依据。
SaaS 税务设置的常见坑
第一个坑是把产品税码随便选。不同数字产品、软件访问权、专业服务在不同税区处理可能不同。Stripe Tax 有产品税码体系,但你仍要根据自己的产品形态选。
第二个坑是 B2B 和 B2C 混在一起。个人订阅、公司订阅、代理商订阅最好在账单资料上区分出来。否则客服看到一个邮箱,很难判断该不该要税号。
第三个坑是忘了测试不同国家或地区。至少用 Stripe test mode 跑几组:
- 美国个人用户。
- 欧盟个人用户。
- 欧盟公司用户,填写税号。
- 地址缺失用户。
- 地址和付款方式不一致用户。
测试时保存截图和 session id。等到税务顾问问你「系统怎么收集地区证据」时,你有东西能拿出来。
跨地区团队后台管理
Stripe Dashboard 本身也属于关键后台。公司创始人、财务、客服如果在不同城市登录,最好固定设备、固定账号权限、固定访问流程。不要今天用个人电脑,明天用临时网络,后天让兼职客服直接进主账号。
我会把 Stripe 权限拆成三层:
| 角色 | 权限 |
|---|---|
| founder | 税务、支付、开发者设置 |
| finance | 发票、报表、税务导出 |
| support | 客户订阅和退款申请,不给开发者 key |
如果团队确实需要长期处理 Stripe、银行和 AI API 账单后台,可以准备一条统一的工作线路,比如 Stripe Dashboard 稳定访问。这不是替代权限管理,而是减少后台登录环境飘来飘去。
上线前检查清单
- Checkout 已开启 automatic_tax。
- 新客户会收集账单地址。
- B2B 客户可以填写 tax ID。
- Customer 资料会从 Checkout 回写。
- 发票记录保留当时地址和税号。
- 后台能导出订单、税额、国家或地区、税号状态。
- 客服知道哪些情况要升级给 founder 或财务。
- 税务顾问知道你的产品类型、客户分布和收款路径。
Stripe Tax 能减少重复配置,但它不会替你判断商业模式。独立开发者最该做的,是把证据链留完整。以后收入上来,补课成本会低很多。