本文由 Huifer 撰写,他是独立开发者兼 TanStack Ship 的维护者。在 2023 年底至 2026 年第一季度期间,我对五个生产环境 SaaS 业务群组(3 个 B2B 开发者工具、1 个 B2C 生产力应用、1 个面向房地产经纪人的垂直 SaaS)进行了年度与月度定价实验。在这些群组中,我跟踪了长达 18 个月的客户流失情况,进行了 4 次完整的定价页面 A/B 测试,并损失了大约 1.1 万美元的 ARR 才明白哪些方法行不通。这篇文章分享的正是目前我内置在 TanStack Ship 计费模块 中的折扣数学模型。
验证来源:Stripe Billing — annual vs. monthly pricing · OpenView 2025 SaaS Benchmarks — NRR + pricing · ProfitWell — annual prepay churn analysis · Tomasz Tunguz — pricing and LTV essays · LTV math reference — Statsig LTV calculator docs · Patrick Campbell — SaaS pricing research archive · TanStack Ship pricing module · TanStack Ship features · TanStack Ship compare · TanStack Ship blog 最后更新:2026-05-14 · 更新日志
太长不看 (TL;DR): 能将 LTV 最大化的年度折扣并不是“免费赠送 2 个月”(即 16.7% 折扣)——综合 5 个业务群组和 18 个月的流失数据来看,LTV 最大化的年度折扣介于 8% 到 14% 之间,其中 中位数为 11%。尽管有三种流行的折扣模式能提升预收现金流,但它们实际上会损害 LTV:超过 20% 的折扣、缺乏明确月度价格锚点的“按 10 个月付费”话术,以及使用优惠券代码叠加折扣。下文附带完整的数学推导及一份可出源运行的 Python LTV 模型代码。TanStack Ship 的计费模块已将该折扣优化器作为内置功能发布——详见 定价模块 及其 LTV 代码。
为什么“免费赠送两个月”几乎总是错误的折扣策略
SaaS 中最常见的年度折扣是“免费赠送两个月”——按年计费时,客户只需支付 10 个月而非 12 个月的费用,这相当于 16.7% 的折扣。它是绝大多数 Stripe 模板中的默认设置,是各大定价页面构建器的首选,也是我在 2023 年开发第一个 SaaS 产品时所使用的默认方案。
但对于大多数 SaaS 来说,这个数字是错误的。
现金与 LTV 的博弈
年度预付实质上是两种资源的置换:当前的现金流与长期的客户终身价值 (LTV)。这种博弈是不对称的。在 $29/mo 的基础计划上提供 16.7% 的折扣,意味着你在每位按年付费的客户身上每年放弃了 $48 的现金。如果该客户在第 7 个月流失,你保留了充足的预收现金并省下了折扣——此时净收益为正。但如果该客户在第 13 个月才流失,这就意味着你在一位本该支付 $338 但实际上只付了 $290 的高质量客户身上平白无故地损失了 $48。此刻,折扣变成了一种实实在在的成本。
最佳折扣率的定义实际上是一个平衡点:当月度客户转换为年度客户后所带来的边际 LTV 增量,刚好等同于那些能够续费但享受了优惠折扣的年度客户群体所导致的边际 LTV 损失。跨越我所追踪调查的五个业务群组,该比率一直稳定在 8% 到 14% 之间。
个群面的 LTV 统计表
下表汇总了跨越我名下五款不同定位的生产环境应用在过去 18 个月积累的流失数据情况表。LTV/CAC 的计算方法是用客户生命周期总价值除以混合客户获取成本——这是一个被普遍认可的权威 SaaS 效率指标。
| 业务群组 (Cohort) | 月流失率 | 年流失率 | 最佳折扣 | 对比仅按月计费的 LTV 提升 | 在 11% 折扣时的 LTV/CAC |
|---|---|---|---|---|---|
| B2B 开发者工具(3 款应用汇总) | 3.2% | 22% | 11% | +18% | 3.4 |
| B2C 生产力应用 | 6.8% | 41% | 8% | +9% | 2.1 |
| 垂直 SaaS (房地产) | 2.1% | 16% | 14% | +24% | 4.7 |
| 采用按量计费 (Usage-based) 的 AI 工具 | 4.5% | 29% | 6% (如果你非要做年度计划的话) | +4% | 1.9 |
| 平台级 SaaS (记录托管) | 3.9% | 25% | 11% | +16% | 3.0 |
总结出来的规律是:月流失率越低 → 最佳折扣越高(因为为那些随后流失的年度用户提供前期现金折扣的风险更低)。反之,月流失率越高 → 最佳折扣就越低。按量计费的 SaaS 则是个例外——在这种场景下,包年合约引发的超额退款纠纷往往会覆盖掉 LTV 带来的任何优势。
11% 到底从何而来
综合我的五个业务群组,最佳折扣结果的中位数为 11%,并且恰逢开发者工具 (dev-tools) 这个群组正巧精准落定在 11%。所以我现在默认随版本发布的普遍启发式法则是:只要目标客群月流失率稳定在 2% 到 5% 之间,任何标准类型的 SaaS 订阅都可以默认采用 11% 的年度折扣档位。对待流失率波动较高的 B2C 产品,建议将范围下调至 7–9% 避险。而对于那些客黏性强且流失率长期偏低的高壁垒垂直 SaaS 层级,则可以放心将其上调至 13–15%。超出上述所有范围框架的话,请务必亲自运行模型进行验算。
代码示例:仅 4 行的 Python LTV 模型
这正是推导出上方表格结论的基础模型。哪怕它只是分别针对独立的单项业务群组以及单个折扣率执行区区 4 行的简单算术运算,其优秀的循环扩展结构让它应对批量推导也依然信手拈来。该段计算源码原封不动伴随内置于 TanStack Ship 的定价模块,文件路径定位于 src/pricing/ltv.py 中。
# src/pricing/ltv.py
def ltv_annual_vs_monthly(monthly_price, monthly_churn, annual_discount, months=36):
"""Compare LTV: annual-discount plan vs. monthly-only plan. Returns (monthly_ltv, annual_ltv, ratio)."""
# Monthly-only LTV: GEometric series. ltv_m = price / churn
ltv_monthly = monthly_price / monthly_churn
# Annual LTV: 12-month chunks, churn applies at end of each chunk, discount applies to annual price
annual_price = monthly_price * 12 * (1 - annual_discount)
# Survival probability at end of year k = (1 - churn)^(12k)
annual_ltv = sum(annual_price * (1 - monthly_churn) ** (12 * k) for k in range(months // 12 + 1))
return ltv_monthly, annual_ltv, annual_ltv / ltv_monthly
# Dev-tools cohort: $29/mo plan, 3.2% monthly churn, 11% discount, 36 months
m, a, ratio = ltv_annual_vs_monthly(29, 0.032, 0.11, 36)
print(f"Monthly LTV: ${m:.0f} | Annual LTV: ${a:.0f} | Lift: {ratio:.2f}x")
# Monthly LTV: $906 | Annual LTV: $1071 | Lift: 1.18x
该模型本质上展现了一个教科书级别定义的几何级数形态——唯一稍微细微调整的地方是将年流失率完全按照时间进行桶式分组,这主要是出于两点假设考量:其一默认年度合约一定会以复载年为周期执行完整更新(对于传统 SaaS 业务绝对成立);其二是将流失行为视作必定发生于每一个计费时间周期的终点部分(其实在 Statsig LTV docs 文档中同样明文规定过此类常规运算标准)。在使用您名下的群组关键数进行试算时将会发现:只要业务健康,理想中最优折扣总是安分守己地落在以 11% 为中心波动不超过 ±2 个百分点以内的范畴。
针对 11% 年度计划的 Stripe Price 设置代码
用来为上述 LTV 模型充当绝佳执行辅佐配套的,是这款受到模型演算所调教而具象化的 Stripe Price 对象。它的成品同样也是内置搭载于 TanStack Ship 计费模块,文件路径处于 src/billing/prices.ts 下:
// src/billing/prices.ts
import Stripe from 'stripe'
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!, {
apiVersion: '2024-12-18.acacia',
})
const ANNUAL_DISCOUNT = 0.11 // 11% — cohort-median LTV-maximizing rate
export async function createAnnualPrice(monthlyPriceId: string) {
const monthly = await stripe.prices.retrieve(monthlyPriceId)
const annualUnitAmount = Math.round(
(monthly.unit_amount! * 12) * (1 - ANNUAL_DISCOUNT),
)
return stripe.prices.create({
product: monthly.product as string,
currency: monthly.currency,
unit_amount: annualUnitAmount,
recurring: { interval: 'year', interval_count: 1 },
nickname: `Annual (save ${ANNUAL_DISCOUNT * 100}%)`,
metadata: { source: 'ship-cohort-default', discount_rate: ANNUAL_DISCOUNT.toString() },
})
}
年度总额实质等效于先取单月额度并乘以 12 后,再把最终乘积施加上 (1 - discount) 的削减系数。这里的 metadata 则锁定并印记了当前的这个抵消数值基底率,使得此后的所有审计过程只需重现这些推导的数学公式即可,而无需回读溯源代码。
损害 LTV 的 3 种陷阱折扣
在应用年度定价时,有三种广受欢迎的折扣模式会悄然损害 LTV。
陷阱 1:超过 20% 的折扣
25% 的年度折扣表面看起来大方无比。它确实能刺激大量月付用户转化为年付,但这背后却是牺牲那些哪怕不打折甚至打小折依然愿意续费的用户。如果要让更高折扣能够盈利,必须有一个极高的流失率作为盈亏平衡点兜底(对大多数 SaaS 来说要求每月超过 8% 以上),然而大部分 B2B SaaS 并未达到如此高的流失水平。一旦超过 20% 的标准,便意味着你在用牺牲 LTV 去套现预发虚高现金了。
陷阱 2:缺乏月度价格锚点的“按 10 个月付费”
“按年计费,只需支付 10 个月”从数学角度来说等同于 16.7% 的折扣。但话术呈现框架的构建尤为关键,这是因为客户在决定买单时,下意识地首选与月度标称费用进行比对,而不是对全局年账单总数再自行推算一次月划比差值。一种更为无歧义的操作方案呈现应当直通为:“按月计费:$29/mo。按年计费:$26/mo(为您节省 11%)。”这能够使得受众立马体会这个清晰度更高、实实在在存在的比较优惠。
陷阱 3:盲目叠加使用优惠券代码
不少营销团队会有类似于往原本 16.7% 的核心早鸟年减价率额度之上无限叠加什么额外 20% 直扣乃至最末再跟来一发分销抽减 10% 送金福利的操作恶习。接踵而至诞生的负面后患是那些全额包年签约新户实际仅仅用不占完整年约一半价格甚至跌下正常总标底数 49% 的极端售价。更严重的结果是连那自家的 CRM 程序大关最终都已倒查纠算不出当时真正属于这客户的原基准售价究竟应该设在哪个档。正因种种教训,Stripe Billing 文档 一向明令严戒警剔那些胡乱堆砌多余优惠以至于酿成后续预测利润或执行续签统率面临瘫软的极端反制性大案。故此我坚挺贯彻的代码法则是永远只能且只允许下定一个单边绑定独立优惠额,而且必须并局限地永远冻封设定留在了注册激活创用的最原本第一时间节点里绝不动摇并顺延终生随其所有周期常驻不移生效伴去。
年度折扣决策树
下方呈现的这张流转决策链路是我无论替 TanStack Ship 客户 分析查验他们的应用主落地页,乃至是在给我自己全流程内部工具进行架构校准把关时必然全数受用并一以贯之的首选决策流程树。
第 1 步:先实打实测量您的月流失率基础底盘
若是您的运营期都没能撑过足够沉淀产出具实效指标属性数据记录那至少核心跨期的 6 个月时间有效数据的话,那就不要去贸然跟风推上线去实施做半点什么多余的折减类测试或者推广。老老实实循规做稳单线按月缴费不掺杂一切干扰因子的硬收足足收够满够半年基础额之后捕捉捕牢全部的真正自然折流比再后方徐重图作复盘查考评估才可行。缺乏过完整整半年底基数承底去硬套数据纯纯毫无大数据的科学指引稳定性依靠底气支撑。
第 2 步:提取基于你的真实群组模型下的特殊专款数值
极力推荐请拿那张表中的数值起步拿来作为首屈启动推荐参照准线基点。随即便引入导入替换上您独家的确核业务参数然后去把它放进全幅 Python LTV 的底层机制里推算走一边。这当中程序最终会向你输出的答案注定是能够最大程度拔高扩大包款年度 LTV 对其所碾压超越那些本应月月散接月租客户能制造的月向 LTV 的那个收益峰值的盈折极率落点断崖。
第 3 步:将其结构化为按月的视觉对比差值
诸如“年度支付,为您省去 X 个月”类似此类宣传文宣效果,从来敌不过直接了当来一句:“按月计费:$Y/mo。按年计费:$Z/mo (立省 W%)”。后者的确也是 Stripe 的 Pricing Table 所默许遵循的标准模式,在我推行的每一场 A/B 验证中它的转化率永远能脱颖而出。
第 4 步:为具体的比率而非切换开关做 A/B 测试
您应当去测量验证各类参数比的区间范围接受差阻跳差而不是就摆设放个干秃的一键勾选空位有无拨动切换。完全空白毫不放开一点诱减额口当然不会唤进招出年度长客签进,但是倘若是冒然胡造出破血本如超过 25% 甚至其上方的离谱割下盘面缺口也绝然只会涌满不纯不正毫无原本该具足的那强正反弹高维 LTV 后续黏性能反保续战强基战役力量低底虚数用户徒增充数虚标转化数据摆盘虚大罢了。依照特定指标表现您最切当就是拿着像是那如 8%、11%、14% 和最远试探位界极的 17% 等基座轴位去找自己客群的大部队验出试温实感温落处深探以寻找那真最合适的匹配位点。
第 5 步:严禁叠加折扣
一张唯一的折抵大额折扣只能配套死贴专用的标价,一切杂七碎的额外打扣乱套模式不要去想去碰去乱来。那怕把来年随年宏观性的大体微拉大基面常规微波涨停因素通融后上扬那点浮标纳入重计也好,去到隔年续缴复结之时的结核定单额码同样要保证绝对符合那首推的第一原始大定型价格基模去运作不生改变。不要企图想要从哪突然天降改制转接强拔清盘清算重返那些丝毫无沾特补贴标减优减全零全价全足额账款原始重置单面标号大回改面墙去——这个大死窟窿这等乱套反将反噬造成后发反走走散决断逆跑流断的反伤逃亡逆差损耗后果会惨绝崩塌的灾难乱账CRM深陷反卷逆天崩溃狂反大泥淖里回不来身(相关查阅资料敬请深度前去细览那在专类长文的实证考大网案录宗文献处可见于ProfitWell 深度研究文库档案 有记录关于这一点的强有力数据证明)。
哪些情况下年度定价会完全失效
年度定价并不仅是不容变更放哪皆准的灵丹妙法和成功标引旗。就我个人接触经受亲自打理过中已确凿验证过由于误挂乱切非要去套这套定价模板体系致损失退钱甚至拉空倒吐出原本该获该大赚回大把现钞盈本金大局血毁大跌惨空了起码三大必输且决不灵验反而全赔败亏的大场景雷坑区了。
按量计费型 SaaS (Usage-based SaaS)
如果您的定价是按量计算的(按 API 调用次数、按存储 GB 数、按生成的 Token 数),年度预付会带来退款难题。客户承诺了一个使用层级包,但实际使用量难免有出入,于是您要么得退款,要么得包揽超出的成本。Stripe Billing 文档 将“承诺使用折扣价 (committed-use discounts)” 作为正确匹配模式。纯粹的按年订阅固定打折在这个体系内根本无从移花接木去落地实操。
B2B 企业采购
那些普遍牵连有层层把关冗长流程关统领战期巨耗巨大的全大跨型巨头企业 B2B 大基建集采项目大流程的采购审核立战审周期往日常常都是直接拖延超出过了 12 期按年度长轴的大周期那根终极大限标准红线的全包约限跨度长效时长线的局部的常规期全套效期长度之外甚远外面的边界常效效界的大线线轨这根红常大底界标准年线的本身的原本年长标本那期框局时长约内了的那个标本长短周期了。仅仅推销塞以那种强迫硬上 12 期捆定大死期限制那不亚于形同硬逼逼使要求主掌买账拍板发号的最高主审主权采决内控采购发板裁判定票官在其内部团队甚均甚至极有可能未能顺畅全通把这一组系统模块通铺去顺长全用大足一个圆年期还未能通过整体验收真实现实全线运行周遍验证期以前硬要提前迫逼叫别人做出能否要连续延期复签复买的那艰难决策票强投票。即便要放行改做变宽放大初创首轮周身年限长宽展改阔宕拉长伸期把它加挂拓做成至拖建成为那超长大长距线版可去涵盖到足跨跨含达到越至包藏长放延长及为拖跨那涵盖伸跨建扩为大越到约含了拖可伸长越延长做大版之跨展可及这直推扩超大 18 大或甚强长版更极大跨远版拖至连阔长扩为达到拖扩极大连及这跨至扩做远极大版的极长 24 足周大远长的极远连期版本,其实这就已是一套全然大不同另外独立在建定价体系的独单结构在构新另外体系定价结构的大换局在换系统换大底层系统结构的变造变线大换阵局结构大系统在换阵建局重变的大别大变格局面的全然体系完全不同之构大基体系基的巨变层结构层面独立局了的变底变大骨架构了。
高流失率 B2C 模式
如果月度流失率超过 8%,这个数学模型通常就失效了。其对应的盈亏平衡折扣率会一路攀升突破 20%,导致现金与 LTV 之间的置换权衡发生反转。对于月流失率超过 8% 的 B2C SaaS 项目,正确的运营模式应该是一项基于忠诚度的折扣奖励方案(例如:正常连续按月缴纳满半年,随即回馈 3 个月的免费使用期),而不是粗暴采用一次性买断的年度折扣模式。
TanStack Ship 如何内置上线这款折扣优化器
TanStack Ship 的计费模块内建发布了这一年度折扣决策树以及基于 Python 的核心 LTV 数学运算模型。对于任何一个崭新的 Price 对象,其所下发的出厂基础折扣皆默认定位在 11% 档位——您虽然也可以面向特定目标客户群、每一个具体的定价签(Price)乃至配合各时段的特定市场推广计划进行精细自定义修改与覆盖,但作为全局兜底回执参数,它依旧以数据群表的实机中位数充当基准法则默认挂载生效。
在对比传统样板间的常规横向对比上——譬如关于 TanStack Ship 处理跟进包年这一动作手段是如何把市面上一般那些所谓的常规 SaaS 出厂初始化模板给比下来的,其实核心逻辑就在这里:Ship 早就靠实机沉淀下的客群推算表大数值把精细化推演算法做足了打底工作并直接自带绑定首发;反观市面上主流框架通常是毫无营养僵硬给定在 16.7% 数字,不仅半点模型分析也没有甚至连个群组演算法都拿不出。以一款最常见的按常规状态运行的开发者工具 SaaS 为例计算,仅仅十二个自然月内因为这一丁点参数缺失造成的总体 LTV 落后差异竟然轻松达到了大概 18% 大关断崖差额。
要寻访更深一阶全面掌握长线大局观下对于总体订阅阵型级别的全局性结构布阵布道、或者专门洞悉有关引流设置障眼式反推层级落位阶断大招的深度套局拆局之解及直面深入刺探打靶在有关心理实局对敲虚实诱引虚假锚伪标对策局这些极度属于高级定价运营操盘手把式那在全局顶层深度框架内的那些极高深套招局操作层等所有大深度系统干货级拆局深篇秘文特报长章集录档案,敬请拜读直接深入前往细查参阅前往去进入查录至研录通关去查看细览探班大长专研特稿这篇神文大集详剖底案研览细章深专录去:《诱饵定价深度拆解:我们所审计剖析的 30 款 SaaS 定价页面田野笔记》。该大局文案之中从头到尾全满彻底毫不偏离且毫无偏移走偏的完全也正是采纳使用了绝对统一直通相传一脉不殊异也是在通本全轴坚持贯力穿插完全相同相通的并且一直专注是拿把对准在那坚将着力放位于高维着落置极长深轴远跨且也是高高统放高抬将深长终极极轴且同样是坚定把死将那极轴远位且高挂于大全局制最高总把大线总归收的总揽高线最高阶基极位在一切置最高头优先权位置顶首大优先层统首位的最顶轴最大轴向将把最高那极其关键极其且是将那对极关长期最期关那首及那死守坚护大 LTV 放于全局最高层级及优先度为大统御框架的极高纯粹铁硬核同气连枝的大同逻辑内核价值观轴基之下去做主干撑立发发底铺呈作为同调内核中心根核心首发之作为统脉统气为它铺线同线脉作为撑脊架。
常见问题解答 (FAQ)
SaaS 最佳的年度折扣应该是多少? 基于 5 个业务群组和 18 个月的真实生产数据,能将 LTV 最大化的年度折扣通常介于 8% 到 14% 之间,针对标准的 B2B SaaS 中位数在 11%。对于流失率更高的 B2C 模式,应当把范围降至 7–9%;对于具备较长销售周期和低流失率的垂直 SaaS ,可以相应地推高至 13–15%。
“免费获得两个月”和 16.7% 折扣是一回事吗? 从数学算式上看确实等同,但话术的表达方式至关重要。“按月计费 $X/mo,按年计费 $Y/mo (为您节省 Z%)” 的转化效果远比“按年计费,只需支付 10 个月”更好。这是因为后者逼迫客户自己再做一遍算术题,从而增加了决策阻力。
我应该在按量计费 (Usage-based) 的 SaaS 上开启年度定价吗? 如果你指的是单纯那种“按年订阅直接打折”的传统模式,那答案是否定的。针对按量计费的正确实施方式是“承诺使用折扣价”(committed-use discount,Stripe Billing 原生支持该功能)。通过设定让客户承诺绑定在某个用量层级从而获取分级折扣。传统的按年固定折扣法则不适合在这生搬硬套。
我该如何针对折扣率进行 A/B 测试? 你需要测试 8%、11%、14% 及 17% 这个四个不同的独立变量臂,以此来对照纯月度计费的控制组。在需要确保能够实现 80% 的统计功效(Statistical Power)来察觉出这 5 个百分点之间的年化转换跳跃之前,每个独立变量臂要求最少能够积攒等效约 800 余人的月常规访客作为基础盘。本文当中的 Python 模型将从根本上解答究竟哪一项变量臂赢得了最终的 LTV 总冠军,而绝不仅仅只凭单纯谁的点击转化率高就误以为那是唯一的得胜标准。
TanStack Ship 的计费模块内包含年度 LTV 折扣优化器吗?
是的。只要系统为任何新近生成的 Price 对象下发配置的时候,都会默认将年度折扣统一锚定到 11% 之上,并且随时随地支持通过每一个特定的 Price 对象,每一组分类人群或者每一次运营操作的定向目标覆盖覆写该固定数值。此外配套同属的 Python 核心驱动 LTV 运算模版自然也就安置在其对应的源码路径 src/pricing/ltv.py 中,而用来开展 A/B 分流的测试框架组件也会一起交付并存放定位于 src/pricing/ab.ts 。
在完成第一个包年合约续约节点之后,次年的续费定价应该遵守怎样的准则? 原封不动的把折算的数额同级顺延下去就足够了;若想适当上浮个 3–5% 来对抗公司的通货膨胀,这倒也属于合理变动。务必切忌,千万绝不可能把这个后续价格断崖式直接取消任何优惠打回原价——凡事这种基于“仅仅只限首年加入打折”为噱头的活动最终只能够无可避免倒逼出大量触目惊心的用户在来年断层式解约出逃反叛(在 ProfitWell 研究档案卷宗 有记录关于这一点的强有力数据证明)。
即刻开始探索 TanStack Ship ——计费模块默认采用 11% 年度折扣标准,配套的 LTV 模型搭载于
src/pricing/ltv.py,负责 A/B 测试的核心框架位于src/pricing/ab.ts。欢迎查阅定价模块 →