买还是自己写:七个判据与 4,200 行计费代码的账

自建计费通常不是省钱的选择。这一篇把 4,200 行代码、160 小时首版与每年 72 小时维护折算成钱,与供应商 0.5% 的抽成逐项对照,算出 14.04% 的持平阈值和 7,577.4 美元的第一年差额,并指出哪 1,800 行其实可以外包。

自建计费的理由不是省钱,是能力缺口。

一、四千二百行是怎么长出来的

他最初只想收一个月费。订阅表、支付回调、一张收据,两个周末写完,大约 900 行。第十四个月,billing 目录有 4,200 行,全库 62,400 行,占 6.7%。

以下情境为教学假设,人物、引语和数字不代表经核实的真实案例。

多出来的 3,300 行不是一次性写的,是十几次「顺手加一个」攒出来的:加一档按量阶梯,690 行;加发票 PDF,600 行;加三个税务地区的税率分支与税号校验,400 行;加重试与催收,800 行;加对账与沙箱脚本,810 行。每一笔单看都不大,合起来是一个人两个月的全部产出。

真正处理钱的只有 7 张表。 customers、subscriptions、invoices、invoice_lines、payments、refunds、credit_notes 承担了全部账务;剩下的行数在伺候格式、边界与地区差异。

三个月后第一次事故:7 个团队用户在 past_due 状态下重试成功,系统又触发一次续费,重复扣了两个月,合计 420 美元。修的时候他发现,问题不在支付通道,在自己写的那段状态判断里。

代码量不是成本,维护面才是。 4,200 行不会自己变贵,是它每个月要吃掉 6 小时:看对账差异、补一个税号字段、修一次按比例计费的分母。一年 72 小时,按 40 美元/小时算是 2,880 美元。

首版时间最容易被低估。 他记得自己用了 60 小时,翻提交记录才发现是 160 小时;差的 100 小时里有 40 小时在建沙箱与对账脚本,这部分不产生任何用户可见功能。

测试数量会骗人。 billing 目录有 62 个测试,看起来不少;其中迁移测试只有 9 条,正好对应 9 条合法迁移,剩下 16 格非法空间一条都没有,因为写的时候没人相信它会被触发。

二、七个判据,先排除情绪

讨论「买还是写」时,人容易从立场出发:写代码的人想写,被运维折磨过的人想买。先用七条判据把立场压下去。

每条判据只答是或否。 写「复杂度较高」没有用,要写「有几个状态、几条合法迁移、能不能穷举」;能穷举的,供应商的通用模型大概率够用。

判据这一产品的实际情况倾向
计费复杂度5 个状态、9 条合法迁移,可枚举供应商
按量需求12 个客户、129.6 万事件/月,需阶梯与去重自建或混合
税务地区数3 个,一年内不扩张供应商
发票要求需要中文抬头与两个自定义字段混合
迁移成本换供应商约 80 小时供应商
团队规模1 人,没有第二双眼睛供应商
故障后果多收一次就可能永久失去这个客户取决于前六项

判据要按顺序问。 先问复杂度与按量需求,这两条决定「能不能买到」;能买到,后面的税务、发票、迁移才有讨论意义。

团队规模是硬约束。 一个人写计费,等于没有代码评审、没有第二个人能接手事故;这条不是偏好,是风险敞口。

按量这条要追到接口层。 129.6 万条事件摊到每天是 43,200 条;供应商的计量接口得接受补报、迟到与去重,否则账单会在月底对不上。

故障后果决定下限,不决定路线。 多收 420 美元那次事故,用的是自建系统,但换成供应商也一样会出错;区别在于出错后谁陪你查。

三、把两条路线的账算清

把时间折成钱,两条路线的差距会比直觉大得多。

项目自建供应商
首版或集成160 小时 = 6,40040 小时 = 1,600
日常维护6 小时/月 = 240/月8.55/月(0.5% 抽成)
第一年合计6,400 + 2,880 = 9,2801,600 + 102.6 = 1,702.6
之后每年2,880102.6
后续迁移(一次性)80 小时 = 3,20080 小时 = 3,200

第一年差 7,577.4 美元。 按月确认收入 1,710 美元算,相当于 4.4 个月的收入;这个量级足以让一个人重新考虑路线。

按当前量级,差额只会逐年扩大。 自建每年 2,880 美元、供应商每年 102.6 美元,差 2,777.4;只有收入涨到阈值以上,抽成才可能反超维护成本。

维护工时是最难压缩的一项。 它不会因为系统稳定就归零,反而随客户数、税区与发票字段增长;这也是自建成本曲线不会下降的原因。

把维护压到 3 小时/月也翻不了盘。 3 × 12 × 40 = 1,440/年,阈值降到 7.02%,仍然比 0.5% 高出一个数量级。

抽成要算到 14.04% 才持平。 20,520 × x = 2,880,解得 x = 14.04%;供应商收 0.5%,在纯费用上压倒性便宜。任何以「抽成太贵」为由的自建,在这个量级上都不成立。

供应商的 40 小时也不是全部。 那只是把订阅与收款接上;发票模板、税号、对账报表还要各花十几个小时,实际集成往往接近 60 小时。

迁移成本只影响退出,不影响进入。 80 小时是「以后想换走」的价格,两条路线都要付;把它算进第一年,会让供应商显得更贵,但那是一次性且未必发生的支出。

四、真正该自建的三种情形

费用算完,自建仍然可能是对的,但理由必须换成能力,不是省钱。

第一种:按量计费的模型供应商不支持。 12 个客户、每月 129.6 万条事件,要 5 分钟桶聚合、24 小时迟到窗口、三道去重;如果供应商只能按「调用次数」计费,业务模型就会被压扁。

第二种:发票字段不可控。 中文抬头、统一编号、两个内部成本中心字段,如果供应商的模板改不了,财务每个月都要手工补,这笔人力比省下的抽成贵。

第三种:数据主权与迁移风险。 客户合同要求账单数据留在境内,或要求随时能导出全量账本;这一条不是技术偏好,是能不能签下这个客户的前提。

混合路线往往是最优解。 订阅、收款、重试交给供应商,按量聚合自己做,边界写清「谁持有账本」;这样既不用养 4,200 行,也不用把计量模型压扁。

自建还有一笔看不见的成本。 沙箱、演练、季度验收都要额外工时;这些不在每月 6 小时的维护预算里,却是维系这套系统运转的固定开销。

可以外包的部分要先外包。 4,200 行里有 1,800 行是可替换的:重试 800 行、发票 PDF 600 行、税计算 400 行,合计 42.9%。先把这三块换掉,自建的真实成本会立刻降一档。

决定要写下来。 记下日期、当时的月确认收入、选择路线与三条理由;六个月后收入变了、理由可能就不成立,没有记录就只能凭印象复述。

复算:

供应商 1,710 × 0.5% = 8.55/月 = 102.6/年
自建首版 160 × 40 = 6,400;维护 72 × 40 = 2,880/年
第一年 6,400 + 2,880 = 9,280 vs 1,600 + 102.6 = 1,702.6;差 7,577.4
之后每年 2,880 vs 102.6;差 2,777.4
阈值 2,880 ÷ 20,520 = 14.04%
可外包 1,800 ÷ 4,200 = 42.9%

五、行动清单与复算验收

先算账,再决定写不写;算完还写,就要写清理由。

  • 把 billing 目录的行数与全库行数各统计一次,算出占比。
  • 用提交记录核对首版真实工时,不靠记忆。
  • 连续四周记录每月维护工时,取平均后乘 40 美元/小时。
  • 向两家供应商询价,把抽成、最低月费、迁移支持写进同一张表。
  • 按当前 1,710 美元月确认收入算出抽成的年成本。
  • 列出「供应商做不到」的具体三条,写不出就不自建。
  • 标出重试、发票 PDF、税计算三块的行数,评估外包。
  • 把 80 小时迁移成本单独记账,不摊进日常成本。

验收标准:你能用一张表说明两条路线的第一年与之后每年成本,并给出 14.04% 的持平阈值;说不出阈值,说明这笔账还没算完。

使用边界与实操验收

这一篇算的是一人 SaaS 在 1,710 美元月确认收入量级上的账,换量级要重算。

边界一:量级变了,结论会翻转。 月确认收入到 20 万美元时,0.5% 抽成是每年 12,000 美元,自建的 2,880 美元维护就开始划算;阈值公式仍然成立,代入即可。

边界二:机会成本按 40 美元/小时是教学假设。 如果你的时间能卖出更高价格,自建更贵;如果当下没有别的活干,这个价格要下调。

边界三:没有算合规与审计成本。 涉及增值税登记、发票存档年限、拒付举证时,自建还要额外承担这些工作。

边界四:供应商也会迁移。 供应商改价、改 API、被收购都发生过;80 小时只是「你自己主动换走」的价格,不包含被动迁移。

边界五:这不是一篇反对自建的文章。 按量计费、发票字段、数据主权三条成立时,自建是对的;错的只是用「省钱」当理由。

关键参考与核验范围

以上链接于 2026-10-26 实测可公开访问;未核验版本、价格与配额。核验日期:2026-10-26。

系列导航

继续阅读

探索更多技术文章

浏览归档,发现更多关于系统设计、工具链和工程实践的内容。

全部文章 返回首页

「Indie」更多文章

  1. 开源项目验收:十项能力、四维评分与三种不该开源的项目
  2. 治理、fork 与退出:17 位贡献者、82% 的提交与一次改协议的代价
  3. 双许可与企业版:九家询价、两家成交与 4,800 美元