产品运营

订阅价格变了,如何更新记录而不改写历史

一套实用方法:记录订阅价格、周期和扣费日期的变化,同时保留之前各时期实际适用的条款。

一个订阅可能 1 月是每月 $20,6 月起变成每月 $35,后来换套餐后又变成每年 $300。如果我只保留最新的金额,记录很好改,却很难让人信任。把 $20 改成 $35,会让之前的月份看起来也花了 $35。

更稳妥的做法,是把计费条款当作一条带日期的时间线:服务商的套餐变了,就新增一个阶段;记录本身写错了,就修正已有阶段。

这个区分在电子表格、数据库或专门的成本工具里都适用。它也能避免一次当前的修改,改变之前某次盈利复盘所依据的假设。

先问两个不同的问题

修改订阅之前,先问:

  1. 订阅套餐变了吗?
  2. 还是之前记录的条款写错了?

如果套餐变了,保留之前的阶段,从新条款下的首次预计扣费开始创建一个新阶段。这是套餐变更

如果套餐没有变,只是我输错了金额、周期或日期,就修改受影响的那个阶段。这是记录更正

这两种操作可能用的是同样的表单字段,但结果不应该相同。

套餐变更的意思是:“旧记录在它的期间内是有效的,接下来适用这些条款。”更正的意思是:“这个阶段从来没有代表我本想记录的内容。”

让用户在这两种含义之间做出选择,比让一个通用的“保存”按钮去猜更安全。

按阶段保存条款,而不是只有一行可修改的记录

一个有用的计费阶段至少需要:

字段 作用
成本 ID 让每个阶段都挂在同一条稳定的订阅记录上
生效起始日 定义这个阶段从什么时候开始
金额和币种 描述这个阶段的预计金额
周期 记录按月还是按年重复
首次预计扣费 为这个阶段的时间安排定锚

下一个阶段会隐含地结束上一个阶段。如果阶段 B 从 8 月 15 日开始,阶段 A 只适用于 8 月 15 日之前的预计扣费,阶段 B 适用于这一天及之后的扣费。

假设一个虚构的托管套餐:

生效期间 金额 周期 预计扣费日
1 月 15 日–8 月 14 日 $20 每月 15 日
8 月 15 日起 $100 每月 15 日

8 月 15 日那次扣费按 $100 计算,7 月 15 日仍然是 $20。不需要创建两条都看得见的“托管”成本,也不应该在边界那天出现两次预计扣费。

这是一份记录下来的预期安排,并不能确认银行或供应商实际扣了多少钱。

涨价和降价是同一种操作

涨价往往更受关注,因为它会增加未来支出,但降价在历史记录上有同样的问题。

从 $20 涨到 $100:

从 $100 降到 $20:

方向不同,并不需要不同的数据模型。记录需要一个旧阶段、一个新阶段,以及分隔它们的日期。

它不应该根据金额变化推断出按比例的差额、抵扣、退款或额外收费。这些取决于服务商的实际规则和发票。如果某笔已知的调整对经营记录很重要,就把这笔已知金额单独记录,而不是根据差价去编一个出来。

用新条款下的首次预计扣费作为边界

对大多数已确认的变更来说,下一次预计扣费是最清楚的默认生效日期。

假设服务商在 8 月 3 日宣布涨价,而订阅在 8 月 15 日续费。宣布日期是有用的背景信息,但对时间安排来说,8 月 15 日才是新计费阶段开始的日期。

有两个重要的例外。

第一,新条款可能从更晚的一次预计扣费开始。也许服务商允许你按旧价格再续一个周期。选择新条款下实际的首次预计扣费。

第二,我可能很晚才得知或记录这次变更。如果新价格从 6 月开始,而我在 8 月才更新账目,可以添加一个从 6 月那次扣费开始生效的阶段。6 月及以后可以重新计算,6 月之前的期间保持不变。

把一次真实的套餐变更往前追溯,和更正原来的阶段不是一回事。在追溯的边界之前,旧条款可能仍然是有效的。

只改金额时,保持扣费日不变

如果订阅仍然是每月 15 日扣费,只是价格变了,时间安排就应该继续以 15 日为锚点。

编辑表单很容易把“开始日期”“下次扣费”和“生效日期”合并成一个含义模糊的字段。只改价格的编辑,不应该悄悄移动未来的扣费日期。

确认界面应该同时说明两件事:

这个小小的确认,可以防止一次数据录入变成意外的时间安排修改。

把扣费日期变化当作新条款

当服务商把每月扣费从 5 日改到 15 日时,只记录新的日期可能会改写之前的时间安排。正确做法是添加一个新阶段,以新安排下的首次预计扣费为锚点。

例如:

生效期间 金额 周期 预计扣费日
1 月 5 日–9 月 14 日 $40 每月 5 日
9 月 15 日起 $40 每月 15 日

金额相同,但条款不同。边界之前的预计扣费仍然属于旧安排。

不要推断两个日期之间发生了什么。服务商是缩短、延长、按比例折算还是以其他方式调整了计费周期,需要发票信息,而简单的时间安排并不包含这些。

周期变化需要一个新的锚点

从月付改成年付,不只是把“每月”换成“每年”。新的年度安排需要一个已确认的首次预计扣费日期。

如果一个每月 $25 的套餐在 10 月 20 日变成每年 $240,就创建一个从 10 月 20 日那次预计扣费开始的年付阶段。之前的月付扣费仍然是月付。

反过来也一样。年付变成月付时,记录首次预计的月付扣费,并以此为锚点生成之后的扣费。

在做经营分析时,另外决定年度成本如何呈现。你可能希望在预计扣费月份看到完整的年费,用于现金规划;同时在预测中看到折算后的月度等值。不要让一种报告习惯替换掉底层的时间安排。

一个周期性订阅变成一次性购买时,通常拆成两条记录更清楚:停止这项周期性成本,再添加已知的一次性成本。这样既保留了一项义务的结束,也保留了另一项义务的开始。

更正应该明确且范围有限

现在考虑另一种情况:托管套餐一直是 $20,但我输入成了 $200。

新建一个 $20 的阶段,会保留一段错误的 $200 期间。这时才应该更正已有记录。

一次更正应该只针对一个选定的阶段:

在提交修改之前,界面或表格应该让受影响的范围清楚可见。如果系统能识别出具体的阶段和日期,“将重新计算历史”这样的警告就太笼统了。

如果更正之后两个相邻阶段完全相同,可以把它们合并。

为什么这对产品决策很重要

成本历史会影响其他问题。计算产品贡献时,我是在拿收入和直接成本、分摊的共同成本做比较。如果今天的订阅价格覆盖了之前的六个月,即使业务本身没变,看到的趋势也会变。

独立 App 的贡献利润》中的方法依赖一致的期间边界。《同时经营多个软件产品,真实成本是多少》里更全面的清单,也会在年度续费、共用工具和不断变化的供应商套餐都保留日期时更有用。

历史视图应该回答:“这段期间我记录的是什么条款?”未来视图应该回答:“按当前的安排,接下来会发生什么?”第一次变更之后,一个可随意修改的金额就无法同时回答这两个问题。

成本分摊也需要自己的生效日期。服务商改价,不应该悄悄地在产品之间重新分配这项成本。把计费条款时间线和分摊时间线分开,然后针对要复盘的期间分别确定两者。

把预期扣费和实际扣费分开

计费时间安排是一份规划记录。它可以生成预计的日期和金额,支撑“即将发生的成本”视图,并在续费之前提供一个有用的复查时点。

它无法证明扣费真的发生了。

服务商可能调整税费、给予抵扣、推迟开票、拒绝付款,或者使用时间安排里没有体现的条款。如果需要这种精度,就单独核对实际交易。

提醒也是同样的边界。基于预计扣费的提醒,不会发现订阅、核实付款或取消服务。操作系统的本地通知可以提示你复查,但不应把它的送达当作有保证。

让这些区别保持可见,一份简单的成本账目就会比一份暗示自己掌握了并不掌握的事实的账目更值得信任。

这套流程的电子表格版本

不用专门的软件也能实现这个模型。

建一个 Costs 工作表,每个订阅一行、稳定不变;再建一个 Billing Terms 工作表,每个阶段一行。包含成本 ID、生效日期、金额、币种、周期和首次预计扣费。

套餐变更时:

  1. 保持之前那一行不变。
  2. 新增一行,填入新条款下的首次预计扣费。
  3. 按成本 ID 和生效日期对阶段排序。
  4. 用每个日期当时有效的阶段生成或检查扣费。
  5. 确认边界处没有产生重复的扣费。
  6. 检查历史合计和未来成本。

记录写错时:

  1. 选中错误的阶段。
  2. 确定到下一个阶段为止的期间。
  3. 只更正那一行。
  4. 重新计算受影响的期间。
  5. 保留之后的阶段,除非它们本身也有错。

加一列备注,写上服务商通知、发票编号或更正原因。备注不能代替生效日期,但能解释时间线为什么变了。

我如何在 MarginDeck 中使用这个模型

说明:MarginDeck 是我开发的。本文介绍的是我自己在这个产品上的工作。

我在 1.1.1 版中把这种区分做进了 MarginDeck 的“即将发生的成本”流程从下次预计扣费开始选择变更生效日期修正已记录条款,以及价格与扣费历史。这个版本还加入了根据预计时间安排生成的可选本地提醒。详细的产品边界见更新日志中的 MarginDeck 1.1.1:记录价格变化,提前收到提醒

保存任何订阅修改之前,我习惯做一个简短的检查:

这份清单比工具更重要。电子表格可以照着做,一个围绕带日期阶段设计的数据库也可以。

说明:我是 Junhua,我开发了 MarginDeck。这个产品根据用户记录的计费信息来估算成本安排,不会向银行或订阅服务商核实交易。