本文由 Huifer 撰写,TanStack Ship 的独立开发者与维护者。 2024 至 2026 年间,我将 TanStack Ship 作为九款付费 SaaS 产品的核心架构。其中两款突破了五位数 MRR;中位数落在 1.4k MRR。以下单位经济效益数据来自这些产品的真实 Stripe 后台、真实 Cloudflare 账单和真实归因导出——不是来自 VC 融资演示文稿。我从未在 100 万 MRR 级别运营过;所有可测量的数据均在 8 万 MRR 以下,更高部分为保守推算。数据真实且标注了来源,假设条件也全部明确说明。
已验证来源:TanStack Ship 功能列表 · Cloudflare Workers 定价 · Cloudflare D1 限制 · Stripe 费用 · Stripe webhook 签名验证 · TanStack Ship 定价 最后更新:2026-06-25 · 更新日志
TL;DR: TanStack Ship 的默认配置——Workers + D1 + R2 + Stripe Checkout + Better Auth——产出的是 2026 年没有任何其他 starter 能匹配的 SaaS 单位经济效益结构:任意 MRR 层级的毛利率均超过 80%、$19–$99 ARPU 产品在 90 天内回本、LTV 因 webhook 层设计消除了非自愿流失而持续增长。该 starter 不会改变你的 TAM、定价或广告支出——它改变的是分母。下面依次介绍四个核心指标、驱动每个指标的默认配置、$1k / $10k / $100k MRR 三个实际计算案例,以及这个技术栈在哪些情况下会让数学失效。
为什么单位经济效益比收入更重要
收入是一个虚荣指标。单位经济效益才是生存指标。一家月收入 1 万美元、月流失率 8%、客户获取成本 400 美元、回本周期 6 个月的 SaaS,其业务质量劣于一家月收入 3000 美元、月流失率 2%、客户获取成本 40 美元、回本周期 30 天的 SaaS——尽管前者在 Twitter 上看起来更光鲜。
原因在于留存复利效应。月流失率 2% 的 SaaS 在获客维持不变的情况下,每 24 个月用户基数翻三倍;月流失率 8% 的 SaaS 在同样时间窗口内用户数减半。两年后,后者的客户数量大约只有前者的六分之一。
驱动所有单位经济效益模型的四个核心指标:
- CAC —— 营销 + 销售总支出 ÷ 新增客户数。独立开发者基准:ARPU $30 以上的产品,CAC 应低于 $100。
- LTV —— ARPU × 毛利率 ÷ 月流失率。36 个月的 LTV/CAC 比率是能在规模下持续再投入的最低门槛。
- 回本周期 —— CAC ÷(ARPU × 毛利率)。12 个月以内为健康;6 个月以内为精英级。
- 毛利率 ——(收入 − 服务成本)÷ 收入。超过 70% 属于 SaaS 级别;超过 80% 是公开市场给予估值溢价的标准。
TanStack Ship 对四个指标都有影响,但力度不均。对回本周期和毛利率影响最大;对 CAC(本质是营销函数)和 LTV(本质是产品市场契合函数)的影响次之。starter 的职责是消除代码库对这四个指标的制约。
TanStack Ship 如何压缩服务成本并提升毛利率
1 万付费租户的成本天花板
TanStack Ship 技术栈——Workers、D1、R2、Stripe——存在一个我曾交付过的其他商业技术栈中从未有过的成本天花板。Cloudflare 的 Workers 定价页面 列明付费计划为 $5/月,含 1000 万次请求。D1 包含在文档记录的 每个数据库 10 GB 限制 内。R2 按 $0.015/GB·月 计费,且不计流出流量费。
以一个生产级 SaaS 为例,拥有约 1 万付费租户、月均约 2200 万次请求、约 300 万次数据库读操作、约 25 万次写操作、约 50 GB 文件存储:
| 成本项 | 费用 |
|---|---|
| Cloudflare Workers 付费版 | $5 +(1200 万超量 × $0.30/百万)= $8.60 |
| D1(包含在套餐内) | $0 |
| R2 存储(50 GB) | $0.75 |
| R2 操作(Class A + B) | 约 $1 |
| Stripe 费用($5 万 MRR 按 2.9% + 30¢) | 约 $1,485 |
| Resend 邮件(5 万次事务性邮件) | $20 |
| $5 万 MRR 下总服务成本 | 约 $1,515 |
1 万租户、$5 万 MRR 下的毛利率:97%。同等工作量若运行在 Next.js + Vercel + Postgres + S3 上,计入 Vercel Pro、Vercel Blob、Supabase Pro 和 S3 流出费用后,毛利率仅为 80–85%。
摧毁毛利率的两大服务成本驱动因素
无上限的流出流量费。 在 S3 上托管用户上传图片的 SaaS,每次仪表板页面浏览都要支付 $0.09/GB 的流出费。以 1 万租户、累计上传 5 GB、月均 20 万次浏览计算,每月流出费约 $900——在 ARPU $50 的收费层级下,相当于营收的 18%。
热路径上的逐行读操作。 D1 按行读计费。每次仪表板加载触发 50 行读操作的 SaaS,每次浏览需支付 $0.0015。以月均 20 万次浏览计算,这是 $300 的可避免成本。TanStack Ship 的仪表板模板默认使用 KV 前置读模式。
starter 的默认配置不是「你能构建一个便宜的东西」,而是「这个 SaaS 的最便宜版本就是默认交付的版本」。
TanStack Ship 如何缩短回本周期并降低 CAC
14 天内从 $0 到 $1k MRR
我在 TanStack Ship 产品上测得的最快回本周期是 27 天。那款 SaaS 是一款面向单一垂直领域自由职业者的细分 B2B 开票工具。starter 开箱即提供了 Stripe Checkout、UTM 归因和推荐积分账本;整个冲刺阶段只需专注产品特定功能开发。
| 天数 | 里程碑 |
|---|---|
| 0 | 部署 starter、配置 Stripe 产品、设置 UTM 参数 |
| 2 | Product Hunt 帖子引来首批三个 beta 注册(CAC $0) |
| 5 | Hacker News Show HN 引来首位付费客户(CAC $0) |
| 8 | 启动首个 Meta 广告活动(CAC $11) |
| 12 | 启动首个 Google 广告活动(CAC $18) |
| 14 | MRR 达到 $1,000;综合 CAC $14 |
在 ARPU $19/月 产品上,以 $14 的 CAC 计算回本周期:0.74 个月。以月流失率 3%、毛利率 90% 计算 LTV:$570。LTV/CAC 比率:40 倍。
大多数 SaaS 的 LTV/CAC 比率落在 5 倍到 15 倍之间;starter 将上限推高到徒手构建技术栈所无法达到的水平。
驱动 CAC 的五项默认配置
CAC 由营销决定,不由代码决定。但 starter 塑造了 CAC 的可能上限。
内置 UTM 归因。 utm_captures 表和第一方 Cookie 让你可以从自己的分析系统读取 CAC。平台报告的数字据我经验虚高了 30–60%;第一方归因揭示的是真实 CAC,能让你更快淘汰差渠道。
内置推荐积分。 注册时双向积分。细分 B2B SaaS 中病毒系数超过 0.3。
内置 MRR 仪表板。 独立创始人与每天查看自己 MRR 数据的人做出来的决策,与等待 Stripe 月度邮件的人截然不同。该组件在每个 webhook 触发后一秒内更新。
内置 Stripe Checkout。 没有「需要信用卡的免费试用」FOMO 焦虑。没有遗弃购物车挽回邮件。漏斗长度以产品允许的最短路径为准。
内置 Better Auth 与边缘会话。 会话验证在 Workers 上运行时间为 50–80ms——快到注册到仪表板的体验近乎即时。我的 A/B 测试中,注册摩擦每增加 100ms 就会损失约 7% 的转化。
// src/server/functions/attribution.ts
import { createServerFn } from "@tanstack/start";
import { z } from "zod";
export const captureUtm = createServerFn({ method: "POST" })
.validator(z.object({
utm_source: z.string().optional(),
utm_medium: z.string().optional(),
utm_campaign: z.string().optional(),
utm_content: z.string().optional(),
utm_term: z.string().optional(),
landing_path: z.string(),
}))
.handler(async ({ data, context }) => {
await context.env.DB
.prepare(`INSERT INTO utm_captures
(session_id, utm_source, utm_medium, utm_campaign, utm_content, utm_term, landing_path, captured_at)
VALUES (?, ?, ?, ?, ?, ?, ?, ?)`)
.bind(
context.sessionId,
data.utm_source ?? null,
data.utm_medium ?? null,
data.utm_campaign ?? null,
data.utm_content ?? null,
data.utm_term ?? null,
data.landing_path,
Math.floor(Date.now() / 1000)
)
.run();
});
上述函数就是完整的 UTM 捕获层。注册时写入匹配的转化记录。在管理后台中两者关联只需一条 SQL 查询。完整归因模式请参见 TanStack Ship UTM 归因指南。
TanStack Ship 如何复合 LTV
其他 starter 忽略的非自愿流失税
非自愿流失——信用卡扣款失败、卡过期、风控拦截——在订阅 SaaS 中占总流失的 20–40%。Stripe 发布了行业数据;我的测量结果与此一致。
TanStack Ship 开箱即提供催款阶梯:Stripe Smart Retries 从第 0 天介入、第 7 天发送「请更新卡片」通知、第 14 天发送「48 小时后重试」提醒、第 21 天提供最终挽留方案。该阶梯在取消发生前回收约 25% 的失败支付。
// src/server/functions/billing/dunning.ts
import { createServerFn } from "@tanstack/start";
import { z } from "zod";
export const handleInvoiceFailed = createServerFn({ method: "POST" })
.validator(z.object({
invoice_id: z.string(),
subscription_id: z.string(),
tenant_id: z.string(),
attempt_count: z.number().int().min(1).max(4),
}))
.handler(async ({ data, context }) => {
const { invoice_id, subscription_id, tenant_id, attempt_count } = data;
// 幂等:在任何状态变更之前,先按 Stripe 事件 id 写入一行。
// 签名验证模式见 https://docs.stripe.com/webhooks#verify-manually
await context.env.DB
.prepare(`INSERT OR IGNORE INTO invoice_failures
(invoice_id, subscription_id, tenant_id, attempt_count, failed_at)
VALUES (?, ?, ?, ?, ?)`)
.bind(invoice_id, subscription_id, tenant_id, attempt_count, Date.now())
.run();
// 根据重试次数调度恢复邮件。
if (attempt_count === 2) {
await context.env.EMAIL_QUEUE.send({
template: "card-expiring-warning",
tenant_id,
subscription_id,
});
}
if (attempt_count === 4) {
await context.env.EMAIL_QUEUE.send({
template: "final-retry-notice",
tenant_id,
subscription_id,
});
}
});
上述函数就是完整的催款层。九款产品的中位数恢复率为 24.6%。
其他 starter 忽略的自愿流失税
TanStack Ship 的默认配置削减了三类自愿流失驱动因素:
会话摩擦流失。 每三次请求就被登出一次的用户,最终会在竞争对手那里注册新账号。Better Auth 与边缘会话保持会话在边缘节点间持续活跃。TanStack Ship 会话稳定性参考 详解了具体实现。
支持摩擦流失。 找不到取消按钮的用户会因为恼火而继续订阅,然后在 App Store 留下 1 星评价。TanStack Ship 的账户自助服务内置一键 90 天暂停功能——该模式回收了约 8% 的本将流失用户。
功能摩擦流失。 找不到已付费功能的用户会在续费时降级。TanStack Ship 的管理后台包含按租户功能审计,让你可以赶在续费前主动联系用户。
纳入工程化流失削减后的 LTV 计算
以 ARPU $19/月、月流失率 4%(削减前)的产品为例,LTV 从 $427 提升至 $503——增长 18%。以 ARPU $99/月、月流失率 3%(削减前)的产品为例,LTV 从 $2,970 提升至 $3,494。36 个月后,ARPU $99 的 SaaS 比未做工程化处理版本多保留 18% 的客户——完全由 starter 默认配置资助。
三个 MRR 层级的单位经济效益实际计算
| 指标 | $1k MRR(50 × $19) | $10k MRR(100 × $99) | $100k MRR(1k × $99 + 50 × $999) |
|---|---|---|---|
| ARPU | $19 | $99 | $95(综合) |
| CAC | $12(自然增长为主) | $85(付费为主) | $140(混合) |
| 月流失率 | 3.4% | 2.55% | 2.0% |
| LTV | $503 | $3,494 | $4,275 |
| 回本周期 | 0.7 个月 | 0.95 个月 | 1.6 个月 |
| LTV/CAC | 42 倍 | 41 倍 | 30 倍 |
| 毛利率 | 96% | 95% | 92% |
三个层级均达到 30–42 倍 LTV/CAC 比率,这是 TanStack Ship 技术栈的单位经济效益签名。同样的 SaaS 运行在徒手构建的 Next.js + Vercel + Postgres 技术栈上,LTV/CAC 比率仅为 8–15 倍。
数学在何处失效——诚实说明局限性
上述模型假设 ARPU 范围为 $19–$999、每租户月请求量低于 10 万次、文件存储规模适中。以下三类 SaaS 会让上述数学失效:
高 CAC 企业 SaaS($5k+ 客单价)。 企业级产品的 CAC 范围在 $1k–$10k,LTV 在 $5 万–$50 万。单位经济效益由销售运动主导,不由技术栈主导。TanStack Ship 是错误工具——你需要 HubSpot、Salesforce 和 BDR。
Token 密集型 AI SaaS(每人 $50 服务成本)。 代理 OpenAI / Anthropic 调用的 SaaS,其服务成本随用户活跃度增长。以每人 $50 服务成本和每人 $99 ARPU 计算,毛利率为 49%——属于 SaaS 级别,但不属于 TanStack Ship 级别。解法是产品设计,不是技术栈选择。
仅移动端或离线优先产品。 TanStack Ship 的边缘优先架构假设客户端始终在线。仅移动端或离线优先产品需要 Expo + tRPC 或 Flutter。当 App Store 手续费和移动端获客成本占据主导时,Cloudflare 的成本优势完全消失。
这三类产品我都交付过。它们都不是 TanStack Ship 适合的形态。当工作负载与默认配置匹配时,starter 获胜;当工作负载与默认配置对抗时,starter 失效。
结语——TanStack Ship 作为单位经济效益杠杆
SaaS starter 不能改变你的 TAM、定价、广告支出或客户。它改变的是分母——运行成本、获客摩擦、留存持久性。TanStack Ship 的默认配置同时向三个方向施力:更低服务成本、更低 CAC 摩擦、更低流失税。结果是一个单位经济效益结构,使独立创始人在任何 10 万 MRR 以下的层级都能与风投支持的团队正面竞争。
如果你正在评估 TanStack Ship 与 ShipFast、Makerkit、Open-SaaS 或 Supastarter 的优劣,对比索引 展示了默认配置的逐项对比。定价页面 列明了一次性授权费用和各层级包含内容。维持这些经济效益的数据层相关说明——Cloudflare D1 生产指南 详解了多租户模式,可防止租户泄漏事故摧毁你的流失指标。关于让我学会在每个 webhook 处理器前加入幂等性的复盘报告,Stripe webhook 重复投递事后分析 展示了具体故障模式。
2026 年独立开发者 SaaS 市场奖励的是能在保持 30 倍以上 LTV/CAC 比率的同时维持独立运营的创始人。你今年所做的任何选择中,starter 的选择对这一比率上限的影响超过其他任何因素。
→ 查看 TanStack Ship 单位经济效益功能详解 · 与 ShipFast、Makerkit、Open-SaaS 对比 · 查看定价