留存:产品健康的温度计

获客解决「用户来不来」,留存解决「用户走不走」。很多产品陷入「漏斗式增长」:投放拉新数据很好看,但用户来了几天就流失,等于往漏水的桶里倒水。留存是产品健康最诚实的温度计——它不看你宣传了多少,只看用户用过之后还愿不愿意回来。留存率低,拉新越多浪费越多;留存率稳,增长才谈得上「复利」。

没有留存做底,增长越快,泡沫越大。

留存分析的第一步,是先看懂「同期群」(Cohort)这个最基础也最有用的分析框架。

为什么留存比新增更重要
  • 复利效应留存率每提高一点,长期用户价值翻倍。
  • 成本更低老用户召回成本远低于新客获取。
  • 口碑来源留得住的用户才会推荐别人。
  • 产品信号留存掉,往往是体验问题的预警。

同期群分析是什么

同期群分析的核心思想很简单:把用户按「首次使用时间」分组,观察每一批(Cohort)在后续每个周期还有多少人留下。它比「整体留存率」高明在哪?整体留存把新老用户混在一起,老用户稀释了趋势;同期群则能回答「这个月拉来的用户,质量比上个月好还是差」——逐批对比,变化一目了然。

下面这段小脚本,模拟了同期群留存表的核心计算逻辑。

# 同期群留存计算(示意)
cohorts = {
    "W1": {"d0": 1000, "d7": 420, "d30": 250},
    "W2": {"d0": 1200, "d7": 540, "d30": 336},
}

for name, c in cohorts.items():
    r7 = c["d7"] / c["d0"] * 100
    r30 = c["d30"] / c["d0"] * 100
    print(name, "7日留存 %.1f%% 30日留存 %.1f%%" % (r7, r30))
纵向时间轴上多行发光圆点队列分色分组、平滑留存折线穿过的同期群分析扁平插画
同期群表把「哪批用户留住了」和「哪些流失了」变得可见。

留存曲线怎么看

把同期群的留存画成曲线,形态会透露产品阶段。陡降型:前几天大量流失,说明「首次体验」有问题,激活环节没过关;渐稳型:前期流失后趋于平稳,说明留下来的用户形成了习惯,产品有长期价值;平缓型:留存很高,但通常伴随低频,要警惕「僵尸活跃」。看曲线要看「拐点」——在哪一天流失最快,那一天就是优化的关键点。

下面这段小脚本,演示了留存曲线拐点识别的简化逻辑。

# 找流失拐点
retention = [100, 62, 48, 41, 38, 36, 35]

def find_turnpoint(data):
    drops = [data[i - 1] - data[i] for i in range(1, len(data))]
    return drops.index(max(drops)) + 1

print("流失最快的一天:D", find_turnpoint(retention))

拐点前后对应的行为差异,就是「留与走」的分水岭。

从留存到行动:召回与干预

留存分析的价值在「看完能行动」。常见的干预动作分四类:激活优化——提升新用户首日体验,解决陡降问题;触达召回——对流失用户做推送、短信、邮件,但要有节制和个性化;功能钩子——在关键行为节点设计「回来看看」的理由(新内容、新权益、好友互动);分层运营——按价值分群,重点服务高价值用户。每次干预都要能对应到留存曲线的变化。

下面这段小脚本,演示了按用户分层决定召回力度的简化策略。

# 召回策略分层
def recall_plan(user):
    if user["value"] > 100:
        return "人工+权益召回,重点跟进"
    if user["value"] > 20:
        return "推送+优惠券召回"
    return "低打扰批量触达"

print(recall_plan({"value": 150}))

没有行动的留存分析只是报表,有行动的留存分析才是增长引擎。