返回探索
指南VibeFix 编辑部更新于 2026年10月9日

上线之后才是战争:vibe 项目留存与流失召回实战指南

发布日是高潮,上线之后才是战争。这篇实战指南讲:D1/D7/D30 怎么定义才不自欺欺人、cohort 留存表怎么看、流失用户 4 层分层与 6 种流失原因、召回渠道选型决策表、3 封可直接套用的召回邮件模板(含标题写法)、流失分层 SQL、PostHog/Plausible 配置要点、Resend 与自建 SMTP 选型对比、5 个反模式,以及第 30/60/90 天复盘清单。

vibe 项目留存与流失召回实战指南封面:cohort 留存曲线

发布那天你盯着实时访问曲线看了三个小时,截图发了朋友圈。然后第二天曲线断崖,第三天评论区没人了。你把这个叫"失败",但这其实是每个 vibe 项目的正常开局:上线不是终点,是你第一次拿到真实用户数据的起点。这篇指南解决的就是上线之后的问题——你怎么看留存数据,怎么知道谁在流失,以及怎么把他们叫回来。我自己踩过这些坑,也用这些方法把几个项目的 D30 留存翻了一倍多。

留存曲线图:cohort 留存分析示意

第一节:留存指标,先定义对了再看

大多数独立开发者看的第一个数是"注册量",第二个是"DAU"。这两个数有个共同点:都能让你自我感觉良好,也都没法指导行动。注册量里混着凑热闹的、误点的、注册完就忘的;DAU 涨可能是你发了条推特,跌可能是周末——看完你还是不知道改哪里。

留存指标的黄金组合是 D1 / D7 / D30,但前提是每个都定义清楚。D1 留存 = 首日访问的用户中,第二天回来的人占比。注意分母不是"注册用户",是"首日活跃用户"。你用注册用户做分母,数字会虚低,你会误判产品没人要;你用 PostHog 默认的 retention 图看的是"第 N 天回来就算",和你自己口径算的可能差 5 个点以上。定义一次,写进文档,以后全团队(就是你一个人)都用同一个。

看 cohort 留存表的方法很简单:行是用户注册的周(或日),列是第 1、7、30 天,格子里是留存率。你要看三件事。第一,看同一列上下对比:最近两周的 cohort D7 是不是比上个月好——这是你改版有没有用的证据。第二,看行内衰减曲线:第 1 天到第 7 天掉多少。第 1→7 天掉 80% 的产品和第 1→7 天掉 40% 的产品,病因完全不一样:前者是"用户没看懂产品是干嘛的",后者是"用户看懂了,但觉得不值"。第三,别看平均数。把 cohort 按获客渠道拆开——Product Hunt 来的和 Google 搜索来的留存能差一倍,混在一起看等于没看。

激活(activation)和留存的关系,用一句话说:留存是激活的滞后指标。用户在注册后 24 小时内有没有完成你定义的"aha 时刻",基本决定了他 30 天后还在不在。我的做法是反推:先找到留存用户和流失用户行为上的最大差异点,把它定为激活事件。比如一个 AI 写作工具,留存用户 90% 都在首日生成过 3 篇以上内容,那"首日生成 3 篇"就是激活事件。之后所有运营动作——新手引导、邮件、推送——都围绕把用户推到这个事件为止。别定义 5 个激活事件,一个就够。

Vanity metrics 陷阱清单,贴在显示器边上:

  • 累计注册用户:只涨不跌的数,看它没有意义。
  • 页面访问量 / PV:爬虫和你自己调试的流量也在里面。
  • 邮件订阅数:和产品使用是两回事,别混为一谈。
  • 社交媒体粉丝:粉丝不付钱,不续费。
  • 单日峰值 DAU:上 Hacker News 首页那天谁都好看,看的是峰值之后的衰减斜率。

真正值得每天看的只有三个数:D7 留存(按最近 cohort)、激活率(新用户 24 小时内完成激活事件的比例)、以及付费转化率。其他的都是月报素材。

第二节:谁在流失,先分层再谈原因

PostHog 留存分析界面:cohort 留存曲线配置示例

"流失用户"这个词太粗了。一个 3 天没来的用户和一个 90 天没来的用户,召回策略完全不同。我的分层标准很简单,按最后活跃时间切四层:

分层定义状态召回思路
活跃7 天内有过行为健康别打扰,正常产品迭代触达即可
打盹(slipping)8–30 天没来正在流失召回 ROI 最高的一层,优先处理
流失(churned)31–90 天没来已流失需要强理由(新功能 / 折扣 / 调研)才回来
休眠(dormant)90 天以上没来基本告别只在大版本更新时碰一次,别浪费预算

为什么 8–30 天这层 ROI 最高?因为他还记得你。超过 30 天,用户对产品的记忆开始模糊,你的邮件标题他得想半天"这谁啊";超过 90 天,基本等于重新获客。所以召回预算和精力,永远先砸在"打盹"层。

分层之后是归因:他为什么走。流失原因我归纳成 6 种,每种的召回打法都不一样:

  1. 价格型:用过,觉得不值。特征是付费页访问过、试用转付费率低。召回打法:降价没用,要"重新算账"——告诉他用你产品省了多少时间,或者推更便宜的档位。
  2. 上手难型:注册了,卡在第一步。特征是激活事件没完成、帮助文档访问率高。召回打法:别发功能更新,发"3 分钟上手视频"或一键模板。
  3. 缺功能型:核心需求你没有。特征是用户在反馈区 / 邮件里提过具体功能。召回打法:这个功能上线那天,就是召回他的最佳时机,一对一发邮件效果最好。
  4. 被替代型:竞品挖走了。特征是流失时间点和竞品发布 / 降价重合。召回打法:别攻击竞品,强调你的差异点,最好是他迁移成本最低的那个点。
  5. 一次性需求型:事情办完就走。特征是首日重度使用、之后断崖。召回打法:接受现实,这类用户召回率最低;能做的只有在他下次有需求时被想起——内容营销比邮件召回管用。
  6. 技术问题型:被 bug 劝退。特征是流失前有报错日志、支持工单。召回打法:bug 修好后第一时间道歉 + 补偿,这是召回率最高的一类,因为他本来是想用的。

怎么知道用户属于哪种?三招:看行为数据(上面写的特征)、发 1 封调研邮件(模板见第三节)、直接看客服记录。别猜,猜的归因比没有归因更害人——你会给"上手难"的用户发折扣,给"缺功能"的用户发上手教程,两边都白费。

第三节:召回 playbook——渠道、节奏、3 封模板

召回不是"群发一封邮件",而是按分层和原因匹配渠道和内容。先看渠道选型决策表:

渠道适合的流失类型成本打开率基准注意事项
邮件上手难、缺功能、被替代、价格约 $0.0008/封(Resend 批量价)25–35%召回主力;必须带退订链接
推送通知一次性需求、技术问题修复免费(自建)5–15%需要用户授权过;文案超 40 字基本没人看
站内信 / 应用内横幅打盹层(偶尔回访的用户)免费触达取决于回访只提示,不做营销;用户回来才看得见
短信高价值付费用户流失$0.02–0.05/条90%+一生只用一次,且必须用户明确同意过

打开率基准是经验值,不是承诺:邮件 25–35% 是召回类邮件的正常区间(高于普通营销邮件),推送 5–15% 看你之前有没有把权限要到,短信打开率高但贵且扰民,只留给月付 $50 以上的流失用户。

节奏建议:打盹层用户,沉默第 10 天发第 1 封,第 20 天发第 2 封,第 30 天发第 3 封,之后停手。三封没回来就别发了,继续发只会换来退订和"骚扰"印象。流失层(31–90 天)只在大事件时触达一次:你补上了他要的功能、做了大改版、或者年底促销。

下面是 3 封可以直接套用的模板。每封都给了 subject line 写法——标题决定 80% 的打开率,正文决定剩下的。

模板 A:功能更新型(适合"缺功能型"流失)
Subject: You asked, we shipped: [功能名] is live / 中文:你提过的那个功能,上线了:[功能名]
正文:

Hi [名字],

还记得你 [X 月 X 日] 反馈说想要 [功能名] 吗?它今天上线了。

简单说下它能做什么:[一句话,配一张 GIF 或截图]。

你的账号还在,数据都在,点这里直接试用:[链接]

如果还有别的想要的功能,直接回复这封邮件,我会看。

—— [你的名字],[产品名] 独立开发者

要点:点名他提过的具体功能和日期,证明这不是群发;落款写"独立开发者"而不是"团队",回复率会高一截——用户愿意跟真人说话。

模板 B:折扣型(适合"价格型"流失,只能用一次)
Subject: 50% off for the next 48 hours — no strings / 中文:48 小时内回来,半价,没有套路
正文:

Hi [名字],

开门见山:[产品名] 专业版现在半价,48 小时内有效:[链接]

没有"先涨价再打折",原价 [X],现在 [Y]。到期自动恢复原价,不会自动续成全价坑你。

如果你当时离开是因为价格,希望这个能让你重新试试。如果是因为别的原因,直接回复告诉我,我想听真话。

—— [你的名字]

要点:折扣只给"价格型"用户,别全量发(反模式第二节会细说);48 小时制造紧迫感;最后一句"想听真话"是钩子,能钓出真实流失原因。

模板 C:调研型(适合原因不明的流失,顺带做归因)
Subject: Quick question (30 seconds) / 中文:问你个问题,30 秒
正文:

Hi [名字],

注意到你有一段时间没用 [产品名] 了。不推销,就想问一个问题:

当初是什么让你决定不再用的?

点一下就行:
1. 太贵了 → [链接]
2. 不会用 / 太复杂 → [链接]
3. 缺少我需要的功能 → [链接]
4. 换了别的工具 → [链接]
5. 事情办完了,暂时不需要 → [链接]

每个链接带参数,点选自动记录,连表单都不用填。作为感谢,回复的人我会手动送 [一个小福利,比如 1 个月免费]。

—— [你的名字]

要点:一键点选代替填表单,回复率能差 5 倍;链接带 ?reason=price 这类参数,点选即归因;手动送福利而不是自动发,是为了逼自己去看每一条回复。

第四节:代码和配置——把召回做成流水线

流失用户召回流程图:分层触达工作流示意

手动发召回邮件撑不过 200 个用户。用户量一上来,召回必须是一条自动流水线:定时任务扫出分层用户 → 按原因匹配模板 → 发送 → 写回发送记录做归因。下面是每个环节的落地代码和配置。

1. 流失分层 SQL(Postgres,每天跑一次,结果写进 churn_tiers 表):

-- 每天凌晨跑一次:按最后活跃时间给用户打分层标签
INSERT INTO churn_tiers (user_id, tier, computed_at)
SELECT
  u.id,
  CASE
    WHEN MAX(e.created_at) > NOW() - INTERVAL '7 days'  THEN 'active'
    WHEN MAX(e.created_at) > NOW() - INTERVAL '30 days' THEN 'slipping'
    WHEN MAX(e.created_at) > NOW() - INTERVAL '90 days' THEN 'churned'
    ELSE 'dormant'
  END AS tier,
  NOW()
FROM users u
LEFT JOIN events e ON e.user_id = u.id
WHERE u.created_at < NOW() - INTERVAL '7 days'   -- 注册不满 7 天的不算流失
  AND u.email IS NOT NULL
GROUP BY u.id
ON CONFLICT (user_id) DO UPDATE
  SET tier = EXCLUDED.tier, computed_at = EXCLUDED.computed_at;

注意两个细节:events 表只记"有意义的行为"(登录不算,核心功能使用才算),否则分层会被刷新的登录态污染;注册不满 7 天的用户排除在外,新用户有自己的新手引导流程,别和召回混在一起。

再补一段归因查询——召回邮件发出去之后,有没有回来:

-- 召回归因:发出后 7 天内回来的用户算召回成功
SELECT
  s.template,                       -- 用的哪个模板
  COUNT(*) AS sent,
  COUNT(*) FILTER (WHERE e.user_id IS NOT NULL) AS winback,
  ROUND(100.0 * COUNT(*) FILTER (WHERE e.user_id IS NOT NULL) / COUNT(*), 1) AS winback_rate_pct
FROM winback_sends s
LEFT JOIN events e
  ON e.user_id = s.user_id
 AND e.created_at BETWEEN s.sent_at AND s.sent_at + INTERVAL '7 days'
WHERE s.sent_at > NOW() - INTERVAL '30 days'
GROUP BY s.template;

每封召回邮件发出去都要在 winback_sends 表里记一笔(user_id、template、sent_at)。没有这张表,你永远不知道哪封模板有用,召回就永远是玄学。

2. PostHog / Plausible 的 cohort 配置要点

PostHog:进 Product analytics → Retention,新建 retention 图。关键配置只有三处:第一,Retention criterion 选你的激活事件(比如"生成了内容"),别用默认的"pageview",否则数字虚高;第二,Target event 和 criterion 用同一个事件,看的是"做了核心行为的用户第 N 天还做不做";第三,Add filter 按获客渠道(utm_source)拆 cohort,对比看。Insights 存成 dashboard,设每周一早上发邮件给自己——免费版就支持。

Plausible:它没有 retention 图,别硬套。用 Funnels 功能搭一条"注册 → 完成激活事件"的漏斗,看转化率;留存趋势用 Goals + 对比时间段凑合看。Plausible 的定位是轻量隐私统计,用户量小、事件简单的时候够用;等你开始做分层召回,趁早迁到 PostHog,它的 cohort 和 feature flag 是一套的,召回实验可以直接按 cohort 灰度。

3. 发件通道选型:Resend vs 自建 SMTP

Resend自建 SMTP(Postfix / Postal)
成本免费 3000 封/月,之后约 $0.0008/封服务器成本,接近 0
送达率高,IP 信誉它维护看你自己养 IP,新 IP 进垃圾箱是常态
接入成本10 分钟,调 API半天起,还要配 SPF / DKIM / DMARC
退订 / 投诉处理自带自己写
适合谁99% 的独立开发者月发 10 万封以上、且有专人维护

结论很直接:用 Resend。自建 SMTP 省的那点钱,不够你付一次进垃圾箱的排查时间。域名一定要用自己的(hello@你的域名.com),别用 gmail 发批量邮件,Gmail 发 500 封批量邮件基本等于自杀。

4. 召回发送脚本思路(Python + Resend,每周跑一次 cron):

import os, resend, psycopg2

resend.api_key = os.environ["RESEND_API_KEY"]

# 1. 查出这周该触达的人:slipping 层 + 还没收到过这封模板的
rows = query("""
  SELECT u.id, u.email, u.name, c.tier
  FROM churn_tiers c JOIN users u ON u.id = c.user_id
  LEFT JOIN winback_sends s
    ON s.user_id = u.id AND s.template = 'slipping_v1'
  WHERE c.tier = 'slipping' AND s.user_id IS NULL
  LIMIT 200
""")

for r in rows:
    # 2. 发
    resend.Emails.send({
        "from": "你的名字 <hello@你的域名.com>",
        "to": r.email,
        "subject": "还记得 [产品名] 吗?有个更新你可能想看",
        "html": render("slipping_v1.html", name=r.name),
    })
    # 3. 写回发送记录——归因就靠这一行
    query("INSERT INTO winback_sends (user_id, template) VALUES (%s, 'slipping_v1')", r.id)

三个硬规则写进脚本里:同一用户 30 天内最多收到 1 封召回邮件(用 winback_sends 去重);每次 LIMIT 封顶,别一次全发出去;退订用户进 unsubscribed 表,查询时直接排除。合规不是可选项,CAN-SPAM 和 GDPR 罚起款来比你的 MRR 高多了。

第五节:5 个反模式,别碰

反模式 1:骚扰式召回。一周发三封"我们想你了",用户不想你,只想退订。召回邮件的上限是:打盹层 30 天内 3 封,流失层只在大事件时 1 封。超过这个频率,召回率不涨,投诉率涨。

反模式 2:给所有人发折扣。折扣是召回里最贵的武器,因为它训练用户"等打折"。只给"价格型"流失发,而且一年最多一次。你给"上手难"的用户发半价,他回来还是不会用,30 天后照样走,你还亏了 50% 的收入。

反模式 3:全量推送"我们更新了"。"v2.0 来了!"这种推送,点开率不到 2%。用户不关心你更新了,他关心"跟我有什么关系"。推送文案必须带"对你"的信息:"你上次卡住的导出功能,现在一键就能用了。"

反模式 4:召回不归因。发了 500 封邮件,回来 30 个人,你不知道是哪封模板的功劳,下次还是一锅烩。每封邮件带模板标记、每次发送写 winback_sends 表、每周跑一遍归因 SQL(第四节那段)。做不到归因的召回,不如不做。

反模式 5:把召回当增长主引擎。这是最贵的一个误会。召回的天花板是"把流失率降几个点",它补不上漏水的桶。如果 D1 留存只有 10%,你最该做的不是召回,而是回去修激活流程。召回是止血带,不是造血干细胞。一个健康的配比:70% 精力做产品和激活,30% 做召回。

第六节:第 30 / 60 / 90 天复盘

上线第 30 天、第 60 天、第 90 天,各花一小时看这 5 个数:

  1. D30 留存(按 cohort):最近一批用户的 30 天留存,对比上线第一批。是涨是跌,一眼就知道产品是在变好还是变坏。
  2. 激活率:新用户 24 小时内完成激活事件的比例。低于 30% 说明新手引导或产品理解有大问题,优先修这个。
  3. 召回率:发出召回后 7 天内回来的比例,分模板看。低于 5% 的模板直接下掉,别犹豫。
  4. 流失原因分布:用调研模板 C 的点选数据,看 6 种原因占比变化。"上手难"占比在涨,说明你最近上的功能把产品搞复杂了。
  5. 召回成本 vs 获客成本:召回一个用户的成本(邮件成本 + 折扣成本)对比新获客成本(CAC)。召回成本超过 CAC 的 1/3,说明你的召回策略亏了,要么是折扣发太多,要么是触达了不该触达的休眠层。

看完数,做 3 个动作:

  1. 砍掉最差的 1 个模板:归因数据里召回率最低的那个,重写或下掉。模板是越少越精,3 个够了。
  2. 修激活链路上的 1 个断点:看激活漏斗,哪一步掉得最多,修那一步。多数情况下是注册后第一屏不知道点哪里。
  3. 给"缺功能型"流失发 1 封一对一邮件:挑 10 个提过具体功能的用户,功能上线后亲手发邮件。批量召回是效率,一对一是口碑,这 10 封邮件带来的转介绍经常比 1000 封群发值钱。

最后说句实话:留存和召回没有银弹。我见过 D30 留存 40% 的产品,也见过折腾半年召回率不到 3% 的产品,差别从来不在技巧,在于产品本身值不值得回来。召回能做的,是把"值得回来但忘了"的用户带回来;"不值得回来"的用户,你发什么都没用。先把产品做到值得回来,召回才有意义。这篇指南里的 SQL、模板、决策表,拿去就能用;但别指望它们替你回答那个最难的问题:用户凭什么留下?

浏览项目广场发布你的项目

相关文章

Vibe 项目 SEO 与内容增长实战指南封面:技术 SEO 清单与自然流量增长
指南
Vibe 项目 SEO 实战:技术清单 30 项 + 内容增长三板斧

AI 把做网站压缩到了一个周末,但让人访问它依然很难。这篇实战指南给你一整套自然流量打法:30 项技术 SEO 清单(分必须做/加分/别折腾三档)、可直接复制的 Next.js metadata 与 sitemap 代码、OG 图自动生成思路、Programmatic SEO 的安全做法与 Google 惩罚红线、内容增长三板斧(文档即营销、更新日志公开化、教程选题公式)配 4 周内容日历、Search Console 必看的 4 张报表,以及 5 个反模式。

增长与营销产品策略独立开发
黎明时分升空的火箭,象征产品上线首日
指南
上线即沉没?vibe 项目冷启动首日实战手册

vibe 项目最大的死法不是做得烂,而是上线那天没人知道。这篇首日作战手册包含:上线前 14 项检查清单、T 日 24 小时五个动作节点的节奏表、Product Hunt / Show HN / X / 小红书四平台文案模板、预热弹药库(等候名单、build in public、KOL 内测)、评论区作战话术、三级流量预案(Vercel/Cloudflare 速配),以及决定产品值不值得继续的五个漏斗数字。

产品发布增长与营销独立开发
vibe 项目新用户第一屏:空状态与注册流程决定了用户留下还是关掉标签页
指南
注册不是终点:vibe 项目新用户上手引导设计实战

vibe 项目很少死于功能缺失,而是死在注册后的第一分钟。本指南认为:引导的目标不是教会用户用产品,而是尽快交付你承诺的价值。内容包括:找 Aha moment 的价值承诺画布、三种引导模式选型决策表、注册页要砍掉的 7 类字段、空状态文案模板、可直接粘贴的 3 步 React 引导组件(localStorage)、4 个漏斗指标与埋点命名规范,以及上线前 10 项自查清单。

设计体验项目创作独立开发