AI 定价迁移:Grandfathering、双轨报价与可逆发布
新价格不应直接覆盖所有订阅。本文负责合同、价格、cohort 与账单 schedule 的迁移,用账单预演、分阶段生效和账后补偿控制风险。
本文要点
- 主题聚焦:AI、DevOps、独立开发
- 适合人群:独立开发者、全栈工程师、AI 应用开发者
- 核心价值:快速理解背景、实践路径、常见误区和工程建议
团队决定提高 Pro 价格时,最危险的实现是直接修改一份套餐配置,让新注册、存量月付、年付、试用和企业合同在下一次请求同时看到新规则。有人会立刻多扣 Credits,有人的账单产生意外 proration,还有长任务按旧报价开始、新权益结束。即使商业决策正确,缺乏迁移控制也会把一次调价变成信任事故。
AI 产品定价模型 负责模式选择;AI SaaS 权益快照 负责生效后的运行时放行。本篇只迁移合同、价格、cohort 和账单 schedule,并设计补偿,不决定价格。示例须经合规审核。
价格、权益和迁移规则全部版本化
价格对象发布后不原地改金额或单位;创建新 priceVersion,保留旧版本供既有订阅和历史重建。套餐版本同时绑定价格、币种、计费周期、包含用量、超额 meter、Credits 规则、权益版本、税务行为和生效区间。支付平台 Price ID 只是映射,不是完整商业合同。
migrationId: pro-v3-to-v4
fromPlan: pro-2025-11
toPlan: pro-2026-09
cohorts:
newSignup: {effectiveAt: 2026-08-01T00:00:00Z}
existingMonthly: {effectiveAt: next_renewal, noticePolicy: notice-v2}
existingAnnual: {mode: grandfather, until: current_term_end}
credits:
conversionPolicy: credits-v3-to-v4
preservePurchasedExpiry: true
rollbackDeadline: before_invoice_finalization
Grandfathering 是显式资格,不是 created_at < 某天 的临时判断。cohort 记录客户、原套餐、保留哪些价格/权益、结束条件、通知版本和例外批准。永久保留、保留到当前合同期、保留若干续期的法律与收入影响不同,不能只写一个 legacy=true。
先双轨报价,不先双轨扣款
对同一订阅、账期、用量、税与折扣生成新旧 invoice preview,比较 recurring、usage、proration、Credits、税和到期日。报告固定 proration_date 与订阅输入 revision/hash,执行时原样复用;影子结果只写报告,不创建可支付 invoice。Stripe Test Clock 可覆盖支持对象的续期、试用和 schedule 边界。
差异门至少检查:没有未知 meter/price、币种不变或已明确转换、数量没有被默认重置、同一用量只计一次、proration 与通知政策一致、Credits 净额守恒、税务字段完整。每个 account 生成可读 diff 与 machine hash,客服看到的预览必须与迁移器使用同一输入版本。
每个 account/phase 只有一条迁移记录,保存 Stripe subscription_item.id、expected old price/quantity、schedule revision 和 preview hash。worker 执行前重读并 CAS,不匹配就停止重算;调用使用稳定 idempotency key,超时先查询再重试。必须带原 item ID 原位换 price,不能省略后新增第二项;完成后断言被迁移组件恰有一个 active item,且 price、数量和 schedule 等于目标版本。
Credits 不能按模型成本变化临时换算。转换政策固定源/目标单位、精度、舍入、余数、购买与促销批次、有效期和退款权利;若无法公平转换,就让旧 Credits 在旧 meter 消耗完或明确补偿。迁移只追加 ledger transaction,不直接改余额。
从新客户到续期 cohort 分阶段发布
先让新注册进入新 plan,观察支付成功、权益、用量、退款和毛利;随后开放自愿迁移,最后按通知与合同处理续期 cohort。每阶段设最小账单样本和完整周期,不因注册转化短期正常就一次迁移所有年付客户。
Feature Flag 可以控制新报价 UI 和迁移 worker 流量,但不能随机决定已签合同价格。AI Feature Flag 的关闭只回滚代码入口,durable cohort assignment、支付 schedule 和 entitlement snapshot 才是商业事实。流量阶段可借鉴 模型服务金丝雀发布,停止门则换成 invoice diff、支付失败、支持联系、退款、用量异常和毛利。
用户通知展示旧/新价格、包含量、超额规则、生效日、Credits 处理、取消或降级路径,不只说“套餐升级”。高风险变化保留确认证据和发送时间。早期访谈可参考 AI 付费意愿访谈,但研究结论不能替代对现有客户的明确通知。
生效前后使用不同撤销方式
未来生效阶段发现问题,停止分配新 cohort,取消错误 subscription schedule phase,恢复旧 price/plan resolver,并使尚未执行的 entitlement snapshot 失效。已在旧条款运行的任务继续使用绑定版本,不能中途混价。重新生成 preview 证明旧路径恢复后再开放。
价格生效但 invoice 尚未 finalized 时,先暂停 auto-advance,把实际 draft 行项目、净额和输入 hash 与批准 preview 重核;不一致则修正后再预览。立即开票或扣款的变更必须走 pending update/payment gate,不能假设事后还有 finalization 窗口。账单已 finalized 或收款后不能删历史或只改 subscription 指针;应使用 credit note、refund、补偿 Credits 或后续 adjustment,并让回滚幂等。
用完整生命周期验收迁移
测试新注册、续期、升级、降级、试用、不同币种、折扣、税、超额、重复 worker、遗漏 item ID、用户并发改套餐、preview/draft 漂移、auto-finalize 和 Webhook 乱序。固定样本从 quote 跑到 entitlement、usage、invoice、payment 和 refund,对每阶段核对版本与净额。
发布看板按 migration/cohort 显示分配数、preview mismatch、迁移成功、账单失败、退款、支持联系、churn 和毛利,原始 account 留在审计而非指标标签。只有完成至少一个真实续期窗口且对账无差异,才关闭旧路径;即使停止新订阅,旧 price 与规则仍保留到最后一个 grandfather 合同结束。可逆定价发布的核心不是永远能假装没调价,而是每个客户都知道适用版本,每个生效阶段都有合法、可对账的退出动作。
延伸阅读
Related