工具产品看数据

目录

这篇写给已经过了 PMF、准备放大的产品。刚起步、还在验证有没有人要的,先读 PMF 验证与第一批用户。

SEO 的监测 看到的是「人来了没」:抓取、收录、展示、点击、到站。这篇接着往下看:来了以后用上没、回来没、付钱没、这钱赚得划不划算。怎么做运营见 工具产品出海运营,这篇只讲数据。

GSC / Cloudflare        GA4                    PostHog(产品分析)         支付平台
────────────────       ────────────           ─────────────────────      ────────────────
搜索里有没有你    →    从哪来、落在哪页  →    用上没、回来没、卡在哪  →   付钱没、留下没、赚多少

后面先画指标树,再讲工具和埋点,然后按漏斗一段一段讲公式,最后是出了问题怎么查、实验怎么判断、每周看什么和周报模板。


一、先画指标树

数据看不明白,大多是因为没有先想清楚要看什么。先定一个北极星指标,再把它拆开。

1. 北极星指标

北极星指标要满足三个条件:用户拿到了价值、和收入正相关、团队每周能推动它。工具产品一般选:

每周完成核心动作的用户数(Weekly Active Value Users)

「核心动作」就是 Aha 时刻那个事件:图片处理成功、格式化成功、生成内容被导出。不要选注册数(注册了不用没有意义),也不要选页面访问量(大部分是一次性访客)。

使用周期是一个月的工具,把「每周」换成「每月」。

2. 拆开

每周价值用户
= 新激活用户                             ← 获客 × 激活
+ 老用户里本周回来的                       ← 留存
+ 回流用户(流失后又回来的)                ← 召回

收入(MRR)
= 付费用户数 × ARPU
= 激活用户 × 付费转化率 × ARPU − 流失

展开成一棵树:

                           MRR
            ┌───────────────┼────────────────┐
         新增 MRR        扩张 MRR         流失 MRR
            │          (升级、加量)    (取消、降级)
     新付费用户 × ARPU
            │
   激活用户 × 付费转化率
            │
   注册 / 使用用户 × 激活率
            │
       访客 × 注册率
            │
  ┌─────────┼──────────┬──────────┬──────────┐
自然搜索   AI 推荐    引荐 / 目录    社区      直接
(GSC)

**每个数掉了,都要能在树上找到是哪一枝掉的。**做不到,说明埋点缺了。


二、工具:各管一段,一个 ID 串起来

工具 管哪一段 为什么是它
Search Console 搜索里的展示、点击 只有它有 Google 的搜索数据
Cloudflare 爬虫、速度 在网络边缘,看得到爬虫
GA4 渠道、落地页、到站 免费,和 GSC、Google Ads 打通,渠道归因现成
PostHog(或 Mixpanel、Amplitude) 产品里的行为:漏斗、留存、路径、功能使用 GA4 做漏斗和留存很难用;PostHog 有免费额度,还带功能开关、A/B 测试、会话录屏
支付平台(Stripe、Paddle、Lemon Squeezy) 付费、续费、退款、流失 收入只认支付平台的数,不认埋点
数据库 用户、订阅、用量 唯一可信的业务数据

小团队不用全上。起步用 GSC + GA4 + PostHog + 支付平台后台就够了。

最重要的一件事:用同一个 user_id 把它们串起来。

匿名访客:PostHog 的 distinct_id(匿名 ID)
   │ 注册 / 登录时
   ▼
posthog.identify(user_id)          ← 匿名阶段的行为自动并到这个用户上
gtag('set', {user_id: user_id})     ← GA4 也设置
   │ 付费时
   ▼
支付平台的 customer 带上 metadata.user_id
Webhook 回来时,用 user_id 发服务端事件 subscription_started

串起来之后,才能回答「从 Reddit 来的用户,付费率是多少」这类问题。


三、埋点

1. 命名规则

事件名:对象_动作,小写,下划线,过去时
        tool_used、file_uploaded、export_completed、subscription_started
属性名:小写,下划线
        tool_name、file_type、plan、source

规则定下来就不改。事件名改一次,历史数据就断一次。

2. 最小事件表

工具产品有这十几个事件就能把漏斗画完整:

事件 什么时候触发 关键属性 端
page_viewed 每个页面 path、utm_*、referrer 前端(自动)
tool_opened 工具加载完成、可以操作 tool_name 前端
tool_used 用户开始执行一次核心操作 tool_name、input_type、input_size 前端
tool_succeeded 核心操作成功,这就是 Aha tool_name、duration_ms 前端或服务端
tool_failed 核心操作失败 tool_name、error_code 前端或服务端
export_completed 下载、复制、导出 tool_name、format 前端
signup_started 打开注册弹窗 trigger(被什么触发:下载、额度、保存) 前端
signup_completed 注册成功 method、首次触达的 utm_* 服务端
paywall_viewed 看到付费墙 trigger、plan_shown 前端
checkout_started 点进付款页 plan、billing_period 前端
subscription_started 支付成功 plan、billing_period、amount、currency 服务端(Webhook)
subscription_renewed 续费成功 plan、amount 服务端(Webhook)
subscription_canceled 取消订阅 plan、reason 服务端(Webhook)
refund_issued 退款 amount、reason 服务端(Webhook)
quota_exhausted 免费额度用完 tool_name、plan 服务端

和钱有关的事件一律从服务端发。前端事件会被广告拦截插件挡掉,开发者工具的用户里,装拦截插件的比例很高,丢掉三成以上并不奇怪。

GA4 那边只需要把 tool_succeeded、signup_completed、subscription_started 标成关键事件,用来比较渠道。细的行为分析都在 PostHog 里做。

3. 用户属性

注册时写进用户属性,以后所有报表都能按它切:

first_utm_source / first_utm_medium / first_utm_campaign   首次触达的渠道
first_landing_page                                          首次落地页
first_referrer                                              首次来源域名
signup_country                                              国家
signup_tool                                                 注册前用的是哪个工具
plan                                                        当前套餐

首次触达的 UTM 要在用户第一次访问时存进 cookie 或 localStorage,注册时再读出来写进去。GA4 的会话来源只记得本次会话,用户第一次从 Reddit 来、三天后直接输网址来注册,GA4 会把这个注册算给「直接」。

4. 问一句「你从哪知道我们的」

注册后问一个可选的单选题:

你是从哪里知道我们的?
○ Google 搜索   ○ ChatGPT / Claude / Perplexity 等 AI   ○ Reddit
○ X / Twitter   ○ YouTube   ○ Product Hunt   ○ 朋友推荐   ○ 其他:____

这个数据叫自报归因。AI 的手机 App、微信和 Slack 里转发的链接、朋友口头推荐,这些都不带来源,在 GA4 里全算成「直接」。自报归因是唯一能看到它们的办法。它和 GA4 的归因经常差很多,两个都看。

5. UTM 规范

所有你能控制的链接都带 UTM。定一套规则,全团队只用这一套:

参数 写什么 例子
utm_source 平台,小写 producthunt、reddit、x、newsletter、futurepedia
utm_medium 渠道类型,只从固定列表里选 social、community、directory、email、referral、affiliate、cpc
utm_campaign 活动,日期加名字 2026-10-ph-launch、welcome-d1
utm_content 同一活动里区分位置 maker-comment、footer-link

utm_medium 必须用固定列表,大小写要统一。GA4 按 medium 归类默认渠道组,写成 Social 和 social 会被当成两个,写个 sns 就直接落进「未分配」。

站内链接永远不要带 UTM,会把本来的来源覆盖掉。


四、获客:哪个渠道值得继续做

SEO 那段看 SEO 的监测。这里是所有渠道放在一起比较。

1. 渠道质量表

每月填一次,所有渠道放在一张表里:

渠道 新访客 使用率 激活率 注册数 付费数 访客付费率 新增 MRR 投入(小时 / 钱)
自然搜索
AI
目录站
Reddit
Product Hunt
直接

按 first_utm_source / first_referrer 分组,数据来自 PostHog 或者数据库。

判断一个渠道,看的是付费数和投入,不是访客数。Product Hunt 当天带来 5000 个访客,付费 3 个;一个小众论坛每月 200 个访客,付费 5 个。后者更值得长期做。

2. 公式

使用率     = 触发 tool_used 的访客 ÷ 落地访客
访客付费率  = 付费用户 ÷ 新访客                     按渠道算,看 30 天内
渠道 ROI   = 渠道 30 天新增 MRR × 12 ÷ 渠道投入     粗算,投入的时间按时薪折成钱

3. 落地页

每个工具页就是一个落地页。按落地页看:

落地页 访客 使用率 成功率 注册率 主要来源

使用率低:第一屏没看到工具,或者看不懂怎么用。 成功率低:工具本身有问题,去看 tool_failed 的 error_code。 使用率高、注册率低:付费墙或者注册的触发点不对,或者免费版已经够用了。


五、激活:用上没

1. 公式

激活率          = 到达 Aha(tool_succeeded)的新用户 ÷ 新用户           按天或按周的新用户群算
到达时间 TTV    = 第一次 tool_succeeded 的时间 − 第一次访问的时间       看中位数,不看平均
工具成功率      = tool_succeeded ÷ tool_used

「新用户」按产品的形态定:先用后注册的工具,分母用新访客;必须注册才能用的,分母用新注册。定了就别改。

TTV 看中位数:少数用户隔了几天才回来用,平均值会被拉得很大。

2. 漏斗

在 PostHog 里建一个漏斗,时间窗口设 1 天:

page_viewed(工具页)
  → tool_opened
  → tool_used
  → tool_succeeded
  → export_completed
  → signup_completed

看每一步的流失,找流失最大的那一步。按 tool_name、国家、设备、来源拆开看,常常是某一个工具、某一类设备特别差。

移动端要单独看。很多工具在手机上根本没法用(比如要上传大文件、要拖拽),手机用户的激活率低很正常,这时候就别让手机用户进入付费漏斗来拉低数字,改成「发到邮箱,回电脑上用」。

3. 看会话录屏

漏斗告诉你在哪一步掉,没告诉你为什么。在流失最大的那一步,找 10–20 个会话录屏看一遍,比猜一周都有用。PostHog 自带录屏,也可以用 Microsoft Clarity(免费)。录屏前要遮住输入框,隐私政策里写上。


六、留存:回来没

1. 队列表

留存要按**队列(cohort)**看:同一周第一次激活的用户算一组,看这组人之后每周还有多少比例回来完成核心动作。

                  W0      W1      W2      W3      W4      W8
2026-08-03 组    100%     28%     21%     18%     17%     15%
2026-08-10 组    100%     31%     24%     20%     19%
2026-08-17 组    100%     35%     27%     23%
2026-08-24 组    100%     33%     26%
2026-08-31 组    100%     36%

两个方向都要看:

  • 横着看:一组人的留存曲线最后有没有走平。走平了,说明有一批人真的离不开你,这就是产品和市场匹配的信号。一路降到 0,说明还没有人非用不可。
  • 竖着看:同一列(比如 W1)从上往下,有没有在变好。变好说明最近的改动有用。

2. 公式

第 N 周留存(固定周期)   = 第 N 周完成过核心动作的人 ÷ 这组的总人数
第 N 周留存(累计)       = 第 N 周及以后任何时候回来过的人 ÷ 这组的总人数

高频工具用固定周期,低频工具用累计。月结类的工具看固定周期的周留存会很难看,但累计留存可能很健康。

回来的定义用核心动作,不用「打开过页面」。打开页面可能只是误点,完成核心动作才算真回来。

3. 使用频率

除了留存率,还要看回来的人用得多不多:

DAU / MAU          每月活跃的用户里,平均每天有多少比例在用。日常工具 20% 以上算高,周用工具 10% 左右正常
L28 分布            过去 28 天里,每个用户有几天用过。画成直方图,看右边有没有一批重度用户

L28 直方图如果在右端翘起来(有人 20 天以上都在用),这批人最有可能付费,访谈就找他们。


七、付费:钱从哪来,从哪漏

1. 转化

免费→付费转化率    = 队列中 N 天内付费的人 ÷ 队列激活用户数          按注册周算,N 取 30 或 60
试用转化率        = 试用结束后付费的人 ÷ 开始试用的人
付费墙转化率      = checkout_started ÷ paywall_viewed,按 trigger 拆
支付完成率        = subscription_started ÷ checkout_started

付费墙转化率按 trigger 拆非常有用。「额度用完」触发的和「想批量」触发的,转化率可能差几倍。转化率高的触发点,就是用户真正愿意付钱的地方,定价和额度都照着它调。

支付完成率低于 50%,先查付款页:是不是不支持当地的付款方式、是不是价格突然加了税、是不是要求填太多信息。

2. MRR

MRR(月经常性收入)是订阅产品的主数字:

MRR = Σ 每个在订阅中的用户每月付的钱
      年付的按 ÷ 12 折成月,一次性付款不算进 MRR

光看 MRR 总数不够,要拆成四块:

本月 MRR = 上月 MRR
         + 新增 MRR          新付费用户
         + 扩张 MRR          升级、加量
         − 缩减 MRR          降级
         − 流失 MRR          取消、支付失败后没恢复

这样拆开,MRR 不涨的时候,才知道是新增少了还是流失多了。两种情况的解法完全不一样。

买断和点数包的收入不进 MRR,单独记一条「非经常性收入」。

3. 流失

用户流失率(月)   = 本月流失的付费用户 ÷ 月初付费用户
收入流失率(月)   = (缩减 MRR + 流失 MRR) ÷ 月初 MRR
净收入留存 NRR     = (月初 MRR + 扩张 − 缩减 − 流失) ÷ 月初 MRR      只算月初就在的老用户

流失拆成两类:

  • 主动流失:用户自己点了取消。取消时问一个原因(太贵、不需要了、换了别的、功能不够、只是临时用一下),按原因统计
  • 被动流失:信用卡过期、余额不足导致扣款失败。这类可以救回来:打开支付平台的自动重试(dunning)、发邮件提醒更新卡。被动流失常常占总流失的两三成,是最容易捡回来的钱

「只是临时用一下」占比高,说明这是一次性需求,别跟它硬拼月订阅,加一个按次付费或者短期套餐。

4. 单位经济

ARPU           = MRR ÷ 付费用户数
毛利率 GM       = (收入 − 支付手续费 − 服务器 − AI 调用成本) ÷ 收入
LTV            = ARPU × GM ÷ 月用户流失率
CAC            = 渠道投入(钱 + 折算的时间) ÷ 这个渠道带来的新付费用户
回本周期(月)   = CAC ÷ (ARPU × GM)

算个例子:ARPU 12 美元,毛利 80%,月流失 6%。

LTV = 12 × 0.8 ÷ 0.06 = 160 美元

一个付费用户能带来大约 160 美元的毛利。要让 LTV ÷ CAC 在 3 以上,获客成本就得压在 53 美元以下。低价工具靠广告很难做到这个数,这就是为什么工具产品要靠 SEO、插件商店、口碑这些不花钱的渠道。

AI 类工具一定要把调用成本算进毛利。免费用户的调用成本也要算,算成获客成本的一部分。

**早期流失率不稳定,LTV 算出来会很离谱。**付费用户不到 100 人、跑不满 6 个月的时候,LTV 只当参考,看回本周期更实在。


八、数字掉了怎么查

按树从上往下找,哪一段先断,问题就在哪一段。

1. 先排除假警报

  • 是不是统计坏了:最近是否发过版、改过埋点、改过 GA4 设置、换了 Cookie 弹窗。去 PostHog 和 GA4 看实时事件,几个关键事件还有没有在进来
  • 是不是日历效应:周末、节假日(美国感恩节、圣诞到新年)、月初月末。和上周同一天比,和去年同期比
  • 是不是一个大号走了:一个大客户或者一次性的流量高峰走了,看的是平均数就会掉
  • 样本是不是太小:一周只有 20 个付费,少了 5 个就是 −25%。量小的时候看 4 周移动平均,看置信区间(下一节)

2. 沿着树往下找

MRR 掉了
├─ 流失 MRR 涨了?
│    ├─ 被动流失涨了 → 支付平台的扣款失败率、dunning 设置
│    └─ 主动流失涨了 → 取消原因分布变了没;最近改过价格 / 功能 / 额度没
└─ 新增 MRR 掉了
     ├─ 付费转化率掉了?
     │    ├─ paywall_viewed 少了 → 额度 / 触发条件被改了?
     │    ├─ checkout_started / paywall_viewed 掉了 → 定价页、价格改了?
     │    └─ 支付完成率掉了 → 付款页报错、某国家的付款方式出问题
     └─ 激活用户少了
          ├─ 激活率掉了 → 工具成功率掉了?按 tool_name、浏览器、设备拆
          └─ 新访客少了 → 按渠道拆
                ├─ 自然搜索掉了 → 按 SEO 的监测里的漏斗查:抓取 → 收录 → 展示 → 点击
                ├─ 某个引荐源掉了 → 那个目录站 / 帖子是不是没了
                └─ 全部渠道一起掉 → 回到第 1 步,多半是统计坏了

3. 按维度切开

任何一个数掉了,先按这几个维度拆一遍,看是不是集中在某一块:

渠道 → 落地页 / 工具 → 国家 → 设备 → 浏览器 → 新 / 老用户 → 套餐

总数掉 10%,拆开常常会发现是某一个维度掉了 60%,其他都没动。


九、实验:改动到底有没有用

1. 能不能做 A/B 测试

A/B 测试需要的样本量,粗算:

每组样本量 n ≈ 16 × p × (1 − p) ÷ δ²

p 是现在的转化率,δ 是你想看出来的变化(绝对值)。这个公式对应的是常用的 95% 显著性和 80% 的把握。

例子:注册率 5%,想看出它变成 6%(相对提升 20%):

n ≈ 16 × 0.05 × 0.95 ÷ 0.01² = 7,600    每组

两组一共要 15,200 个访客。一周 2,000 个访客的站,要跑将近两个月。

所以:

每周相关的访客 怎么做
大于 1 万 可以做 A/B,用 PostHog 的实验功能,跑满至少一整周
1 千到 1 万 只测大改动(整个第一屏重做、定价翻倍),小改动测不出来
小于 1 千 别做 A/B。直接改,用前后对比 + 注释,再配合录屏和用户访谈

**做 A/B 时不要中途偷看结果就停。**每天看一眼,一看到显著就停下来,假阳性会多好几倍。开始之前算好样本量,跑够再看。

2. 小样本的时候,给数字带上误差

转化数很少的时候,一个比例后面要跟着它的置信区间。用 Wilson 区间:

p̂ = 转化数 ÷ 样本数 n,z = 1.96(95%)

中心 = (p̂ + z²/2n) ÷ (1 + z²/n)
半宽 = z × √( p̂(1−p̂)/n + z²/4n² ) ÷ (1 + z²/n)
区间 = 中心 ± 半宽

例子:这周 200 个访客,12 个注册,注册率 6%。算出来 95% 区间大约是 3.5% 到 10.2%。上周 4.5% 在这个区间里面,所以不能说这周变好了。

这就是建模时的习惯:数字要带误差。周报里比例类的指标,样本不到几百的都这么标一下。

3. 前后对比怎么做才靠谱

不能 A/B 的时候:

  • 改之前记下 4 周的基线,改之后看 4 周。不要只比一周
  • 同一时期只改一件事。同时改了标题和价格,涨了也不知道是谁的功劳
  • 找一个没改的对照:只改了 A 工具页,就同时看没改的 B 工具页。两个一起涨,多半是大盘在涨
  • 在 GSC、GA4、PostHog 都加上注释

十、常见的参考区间

下面这些是各种 SaaS 报告和独立开发者公开数据里常见的量级,来源不同、口径也不同,只能当刚起步时的起点。跑两三个月以后,用自己的数据替换掉。

指标 常见量级 说明
访客 → 注册 1%–5% 先用后注册的工具更低,但使用率会很高
注册 → 激活 20%–60% 和 Aha 定义得多严有关
Freemium 免费 → 付费 2%–5% 低于 1% 多半是免费额度给多了
试用 → 付费(不绑卡) 10%–25%
试用 → 付费(绑卡) 40%–60% 开始试用的人会少很多
月用户流失(个人 / 小团队用户) 3%–8% 个人消费者用的工具更高
LTV ÷ CAC 大于 3
回本周期 小于 12 个月 自己掏钱做的,最好在 6 个月内

和别人比没有太大意义,和自己上个月比才有意义。


十一、看板和节奏

1. 一个看板

在 PostHog 里建一个看板,从上到下按漏斗排,每一格一个数,都带上周对比:

┌──────────────┬──────────────┬──────────────┬──────────────┐
│ 每周价值用户   │ MRR          │ 新增付费       │ 流失付费       │
├──────────────┴──────────────┴──────────────┴──────────────┤
│ 新访客(按渠道堆叠)                                          │
├─────────────────────────────┬─────────────────────────────┤
│ 激活漏斗(最近 7 天)          │ 工具成功率(按 tool_name)     │
├─────────────────────────────┼─────────────────────────────┤
│ 周留存队列表                  │ 付费墙转化(按 trigger)       │
├─────────────────────────────┴─────────────────────────────┤
│ MRR 拆分:新增 / 扩张 / 缩减 / 流失(按月)                     │
└───────────────────────────────────────────────────────────┘

看板只放要做决定的数。放了但从来不会因为它做任何决定的数,删掉。

2. 节奏

每天(5 分钟)

  • 看板第一行:有没有哪个数和上周同一天比变了 ±30%
  • tool_failed 有没有突然变多
  • 支付平台:有没有新的拒付、退款、扣款失败
  • SEO 那部分的每日检查,见 SEO 的监测

每周(1 小时)

  • 填周报(模板在下一节)
  • 找出本周变化最大的一个数,沿着指标树拆到原因
  • 看新一周的留存队列
  • 流失最大的那一步,看 10 个录屏
  • 更新实验池,挑下周的实验

每月(2–3 小时)

  • 渠道质量表
  • MRR 拆分、NRR、流失原因分布
  • 单位经济:ARPU、毛利(含 AI 调用成本)、LTV、CAC、回本周期
  • 自报归因和 GA4 归因对比
  • 付费墙按 trigger 的转化,考虑调额度和定价
  • 找 3–5 个付费用户和 3–5 个流失的用户聊 15 分钟

每季度

  • 重看北极星指标和阶段目标(见 工具产品出海运营 的分阶段表)
  • 重看参考区间,换成自己的数据
  • 渠道组合:哪个渠道停掉,哪个加码

十二、周报模板

每周一份,和 SEO 周报放在同一张表里往下追加。

指标 公式 / 来源 本周 上周 变化 告警线
每周价值用户 本周完成 tool_succeeded 的去重用户,PostHog 周环比 < −15%
新访客 PostHog / GA4 周环比 < −20%
其中:自然搜索 按 first_utm / referrer
其中:AI
其中:其他引荐
使用率 tool_used 访客 ÷ 落地访客
工具成功率 tool_succeeded ÷ tool_used 低于 90%
激活率 到达 Aha 的新用户 ÷ 新用户 周环比 < −15%
TTV 中位数 PostHog
注册数 signup_completed
W1 留存 最近一个满一周的队列 连续 3 周下降
付费墙转化 checkout_started ÷ paywall_viewed
支付完成率 subscription_started ÷ checkout_started 低于 50%
新付费用户 支付平台
流失付费用户 支付平台,主动 / 被动分开
MRR 支付平台 连续 2 周下降
退款 / 拒付 支付平台 拒付大于 0
本周实验 实验池
本周改动 同步写进注释

比例类的指标,分母不到几百的,在后面标上 95% 区间。告警线跑一两个月后,按自己的波动范围调。


十三、数据多了以后

PostHog 可以直接写 SQL(HogQL),也可以把事件导到 BigQuery、ClickHouse、Postgres。支付平台的数据用 Webhook 写进自己的数据库。下面两段 SQL 按 Postgres 写,别的数据库改一下日期函数;表名和字段按实际情况改。

1. 周留存队列

-- events(user_id, event, ts)
-- 以第一次 tool_succeeded 的那一周为队列,看之后每周还有没有 tool_succeeded
WITH first_value AS (
  SELECT user_id, DATE_TRUNC('week', MIN(ts)) AS cohort_week
  FROM events
  WHERE event = 'tool_succeeded'
  GROUP BY user_id
),
activity AS (
  SELECT DISTINCT user_id, DATE_TRUNC('week', ts) AS active_week
  FROM events
  WHERE event = 'tool_succeeded'
)
SELECT
  f.cohort_week,
  EXTRACT(DAY FROM a.active_week - f.cohort_week) / 7 AS week_n,
  COUNT(DISTINCT a.user_id) AS users,
  COUNT(DISTINCT a.user_id) * 1.0
    / MAX(COUNT(DISTINCT a.user_id)) OVER (PARTITION BY f.cohort_week) AS retention
FROM first_value f
JOIN activity a USING (user_id)
WHERE a.active_week >= f.cohort_week
GROUP BY f.cohort_week, week_n
ORDER BY f.cohort_week, week_n;

week_n = 0 那一行就是这组的总人数,所以用它做分母。

2. MRR 拆分

-- mrr_monthly(user_id, month, mrr):每个用户每个月月末的 MRR,没订阅就没有这一行
WITH m AS (
  SELECT
    COALESCE(cur.user_id, prev.user_id) AS user_id,
    COALESCE(cur.month, prev.month + INTERVAL '1 month') AS month,
    COALESCE(prev.mrr, 0) AS prev_mrr,
    COALESCE(cur.mrr, 0) AS cur_mrr
  FROM mrr_monthly cur
  FULL OUTER JOIN mrr_monthly prev
    ON cur.user_id = prev.user_id
   AND cur.month = prev.month + INTERVAL '1 month'
)
SELECT
  month,
  SUM(CASE WHEN prev_mrr = 0 AND cur_mrr > 0 THEN cur_mrr END)                  AS new_mrr,
  SUM(CASE WHEN prev_mrr > 0 AND cur_mrr > prev_mrr THEN cur_mrr - prev_mrr END) AS expansion_mrr,
  SUM(CASE WHEN prev_mrr > 0 AND 0 < cur_mrr AND cur_mrr < prev_mrr THEN prev_mrr - cur_mrr END) AS contraction_mrr,
  SUM(CASE WHEN prev_mrr > 0 AND cur_mrr = 0 THEN prev_mrr END)                 AS churned_mrr,
  SUM(cur_mrr)                                                                   AS mrr
FROM m
GROUP BY month
ORDER BY month;

流失后又回来付费的用户,在这里会被算进新增 MRR。想单独看,再加一类「回流 MRR」:prev_mrr = 0,但更早的月份付过钱。


参考资料

指标与增长

工具

实验与统计

试试「AI」「GitHub」或「发布」
找到下一个行动的起点Tab 切换 · Enter 打开