赛道 D · 闭环通知机制

Notification-driven Retention

推送闭环是 v0.7 命门 —— Strava / BeReal / Duolingo / Reddit / Peloton 是怎么把"通知 → 回到 App"这件事跑通的?又是怎么把它跑死的?

竞品扫描 · 2026-05-22 · Product Lab · 给 v0.8 战略备忘 + 5/25 验证后第一波规划用

5 条核心结论(给 Tyra 拍板用)

  1. 推送是 retention 命门,但也是流量灾难的开关。 Andrew Chen 的 iOS 数据:高达 60% 用户会主动 opt out 推送,社交类 App 平均 opt-in 只有 39%(vs Ride Sharing 79%)。Reddit 工程团队原话:"Notification fatigue isn't just a UX nuisance, but a permanent loss of reach. Once a user disables notifications, there's rarely a path back." ——这条直接告诉 Momcozy:v0.7 的 notification-driven return 必须设计成"用户主动 opt in"路径,而不是默认轰炸。
  2. Reddit 的"预算器"是 Momcozy 必抄的架构。 Reddit 不直接发推送,而是先用 causal model 给每个用户算"今日推送预算" —— 平衡 click/engage(正向)vs disable/churn(负向),再决定发几条。这是把推送从"营销战术"升级到"留存科学"的关键。Momcozy 应直接抄这个 budgeting 思路,不要让 release → response → notification 的链路在用户身上变成 5+ 次/天的推送。
  3. Duolingo 的 bandit 算法 + forgetting curve 是 Phase 2 工程目标。 Duolingo 用 KDD 2020 论文级的强化学习选每个用户每天最好的那一条提醒文案,并显式"降低近期发过的文案权重"避免麻木。Phase 1 不需要这么重 —— 先做"按事件触发 + 简单文案 A/B",但目标架构是"按用户敏感度个性化推送频率 + 内容",不是"全员同一模板"。
  4. BeReal 的死法给 Momcozy 一记警告:单一通知点不能稀释。 BeReal 核心是"每天一次随机时刻 → 2 分钟同步窗口" —— 这个机制本身是它的护城河(2024 峰值 4000 万 MAU)。2025 年加了"一天发多条 / 任意时间发"两个功能 → 用户开始挑好看的时刻发 → "real" 失去意义 → 应用被遗忘。对 Momcozy 的镜像:硬件 push(吸奶器一插发通知)是 Activity anchor 的护城河,绝不能因为"用户没接吸奶器也想用"就放开普通推送 —— 否则 push 就退化成消息流,跟 Reddit / Peanut 同质化。
  5. Peloton 的 High Five 是 Momcozy "异步回响"的现成范式。 Live class 已经结束,但你点 High Five 仍然能到对方手机上 —— 这个机制解决"妈妈深夜抽奶时 in-app 没人响应"的最大恐惧。建议 v0.8 直接复刻:release 发出后,即使当下没人回应,后续任何 hug/reply 都会异步推送到锁屏,等于把"陪伴感"延伸到整个白天/夜里。

📦 5 个样本的核心机制对照

产品 触发逻辑 文案策略 频率控制 闭环目标 对 Momcozy 启示
Strava 🚴 事件触发:kudos / follower 活动 / 周challenge 进度 具体数据驱动:"X gave you kudos on your morning run" per-event,可分类关闭(kudos 独立 toggle) 14B kudos/年 · 把单次运动变社交回响 每次 reaction 都值得推一次 + 类型粒度 toggle
BeReal 📸 每天一次随机时刻(全区域同步) 固定:"⚠️ Time to BeReal ⚠️" 极致克制:1/天 全局同步 2 分钟窗口 制造 FOMO 时刻 · 触发同步社交 硬件触发的"同步窗口"是 Activity anchor 的护城河,不能稀释
Duolingo 🦉 每日固定时刻 + 流失阶段触发 bandit 算法选最优文案,"passive aggressive"幽默 per-user 个性化(streak 长度 / 语言 / 失活时长 都参数) 形成习惯回路 · 守住 streak 文案 A/B 不是 Phase 1 重点,但架构上要为个性化文案预留
Reddit 🤖 多源:reply / mention / DM / 推荐内容 多源差异化(reply 用对方话语,推荐用 sub 名) causal-model 每日预算(核心架构) 把订阅 + 推荐内容 push 化 · 拉回 DAU 👉 Phase 1 直接抄 budgeting 思路,避免推送过载
Peloton 🏋️ Class 开始前 / 朋友完成 class / 收到 High Five 极简社交化:"Sarah finished a 30-min ride" 朋友关系驱动(不是 sub)+ 仅 high-signal 事件 异步社交回响 · 让陪伴延伸到 class 结束后 👉 v0.8 直接复刻 High Five 异步推送范式

🔬 5 个样本深度拆解

🚴Strava · 事件触发型 + 类型粒度 toggle
最贴合 Momcozy
规模
130M+ athletes / 14B kudos/年(↑20% YoY)
核心比例
2 分钟 in-app → 1 小时实地运动
关键功能
"Device Activity Synced" 单独 toggle
retention 提升
Day-30 +35%(同类社交健身 App)

核心机制

Strava 几乎所有推送都是事件驱动:有人给你 kudos / 你关注的人完成了一次活动 / 你接近某个周目标。这跟 Momcozy 的"release → reply / hug → return"完全同构。

关键设计是类型粒度 toggle:用户可以单独关掉 kudos 推送但留着 follower activity 推送,单独关掉 challenge 提醒但留着 DM。这是给妈妈用户的关键给路 —— Vol.01 的 28% 不分享 + 67% 不想真聊天的妈妈,可能只想要 hug 推送,不想要 reply 推送。

推送文案示例(社区原话)

Strava · 现在
Sarah gave you kudos
on your 5.2 mi morning run

注意三件事:(1) 名字 + 数据 + 时间锚三件套,让推送本身已经传递价值;(2) 不需要打开 App 就知道发生了什么;(3) 点开直接落到那条活动详情页,零摩擦。

给 v0.8 的直接建议: Compose → Response → Notification 链路里,hug / Quick Reaction / reply 必须能单独配置开关。妈妈用户对推送的承受力比运动用户更低(深夜怕吵醒宝宝),如果是一刀切就只能选"全开"或"全关",那十有八九是"全关",整条 retention 链路就死了。
📸BeReal · 单一通知点的护城河 vs 稀释死法
反面教材 · 必读
峰值 MAU
~40M(2025)
死亡时间
2024 年底用户开始大规模删 App
推送机制
每天 1 次随机时刻(9 AM-11 PM)全区域同步
死法
放开"一天多条 / 任意时间发"功能 → 失去"real"含义

核心机制

BeReal 早期是推送即产品的极端范例:整个产品体验就由一条推送定义。每天 9 AM-11 PM 之间某个随机时刻,全区域所有用户同时收到 "⚠️ Time to BeReal ⚠️",然后 2 分钟同步窗口内拍照发布。这个机制创造了三件事:

死法(最重要的部分)

2025 年 BeReal 为了对抗活跃下滑,加了两个功能:(1) "一天可以发多条 BeReal"(Bonus BeReals);(2) "可以在任意时间发,不限于 2 分钟窗口"。结果:

用户行为变化 — 摘自 The General Journal 2026-03 复盘: "用户开始只在自己做特别的事或者看起来不错的时候发 BeReal。'real and in the moment' 的概念丢了。它失去了魔力。"

朋友们之间最常说的一句话从 "It's BeReal time!" 变成了 "I completely forgot about this app."

对 Momcozy 的关键镜像

Momcozy 有一个 BeReal 没有的天然护城河:硬件触发。吸奶器一插,就是"陪伴时刻"开始,这等同于 BeReal 的随机时刻 —— 但比 BeReal 更精准,因为它跟用户的真实需求绑定(妈妈正在抽奶,正在最需要陪伴的时候)。

BeReal 的死法给 Momcozy 的直接警告

给 v0.8 的直接建议: Activity anchor 必须严格绑定硬件触发。Tyra 之前提的"Phase 1 减到 3 个 anchor"(Persistent + Topic + Activity)这个建议成立,但要补一句 —— Activity anchor 必须等硬件 push 跑通之后才上,否则用户可以从 App 里"找入口"进 Activity,就是 BeReal 死法 + Clubhouse 死法的合并版。
🦉Duolingo · Bandit 算法 + 个性化文案
Phase 2 工程目标
用户基数
500M+ (2011 起)
推送量
数百万/天
关键论文
Yancey, KDD 2020 (200M 推送 / 34 天数据集)
核心理论
Bandit + Forgetting Curve(重复降权)

核心机制

Duolingo 的推送系统是个性化引擎的范例,对 Momcozy Phase 1 来说太重,但架构思路必须懂:

  1. Bandit 算法选文案: 每个用户每天的提醒,从一个预写文案池里"选一条"。算法逐渐学会哪条文案对哪种用户最有效(slot machine 模型)。
  2. 音域公平打分: "Time for Chinese" 对学中文的人很有效,但对学英语的人不行。打分时只跟同类用户对比。
  3. 遗忘曲线避麻木: 同一条文案最近发过的会被显式降权。这是反 Bandit 默认行为的 —— Bandit 默认会持续用赢家,但 Duolingo 发现"新奇度"本身就是激活变量。

"Passive aggressive" 文案的真相

Duolingo 的网红推送("What's wrong, babe? You haven't done Spanish in 3 days")不是产品经理拍脑袋写的,是 Bandit 算法跑出来的最优解 —— 在已经流失 N 天的用户身上效果最好。Cem Kansu(Head of Product)原话:

"A little-known fact about Duolingo is that we spend an insane amount of time perfecting our push notifications. This is one of our most successful — what we call a 'passive-aggressive' reminder: 'Hi, this is Duo. These reminders don't seem to be working. We're going to stop sending them for now.'"

Duolingo · 现在
Hi, this is Duo.
These reminders don't seem to be working. We're going to stop sending them for now. 🦉

对 Momcozy 的启示

Phase 1 不需要 Bandit,但有 3 件事可以现在做:

给 v0.8 的直接建议: Phase 1 推送文案库别贪多 —— 10-15 条手工写的文案 + 简单事件路由就够了。重点是从 Day 1 记录数据,Phase 2 接入 Bandit 时不会从零开始。文案风格参考 Vol.01 Q21 那位北美妈妈自发提出的"release"语感 —— 不要 Duo 的 passive aggressive(妈妈用户对这种 tone 会有强反应),要温暖直白。
🤖Reddit · Budgeter + 因果模型(必抄架构)
最高优先级抄
规模
数千万用户接收推送 / 百万 posts/天评估
核心组件
Budgeter → Retrieval → Ranking → Reranking
关键创新
causal modeling 而非 correlation
监测指标
click/engage vs disable/churn 平衡

核心架构 · 4 stage 队列

Reddit 把"今天给某个用户发几条 / 发哪些"拆成 4 个阶段,每一阶段都是异步队列驱动:

阶段做什么
Budgeter用 causal model 给每个用户算"今日推送预算"。权衡 click/engage(正向)vs disable/churn(负向)。建立 unbiased dataset 来估"如果发 X 条会怎样",避免相关性误判。
Retrieval从百万 posts 里筛出几百个候选。结合"用户订阅的 sub"(规则)+ "two-tower embedding 模型"(个性化)。
Ranking深度神经网络多任务学习同时预测 P(click) / P(upvote) / P(comment)。
Reranking产品规则覆盖 —— 强制订阅内容优先、强制 diversity、强制 freshness 等。

必抄的洞察(Reddit 工程团队原话)

"Notification fatigue isn't just a UX nuisance, but a permanent loss of reach. Once a user disables notifications, there's rarely a path back."

这一句话直接说明为什么 Budgeter 必须放在第一步 —— 你宁可少发一条让用户多留 30 天,不能多发一条让她关掉推送永远失联。

对 Momcozy 的镜像

v0.7 的 notification-driven return 链路(release → response → notification → return)听起来美好,但没有 Budgeter 就是灾难。想象一下:

无 Budgeter 的情况:

带 Budgeter 的情况:

Phase 1 简化版 Budgeter(不用 ML 也能做)

  1. 事件分级:hug / reply / Topic 内新贴 / Group 公告 → 4 个优先级
  2. 合并规则:同事件 60 分钟内合并发 1 条(5 hugs → "5 moms hugged your note")
  3. 每用户每日上限:默认 5 条(onboarding 时让她选 "Low / Medium / High 推送频率",对应 3/5/10 条)
  4. 深夜静默时段:11 PM - 6 AM 默认静默(用户可在 onboarding 选"我深夜抽奶想被叫醒")
  5. opt-out 信号监控:连续 5 条推送都没点开 → 自动降频;用户关推送 → 内部标记,App 内显示"我们不再推送了,但你 X 条 release 收到了 Y 条响应"卡片
给 v0.8 的直接建议: Phase 1 必须有"简化版 Budgeter",不能拍脑袋发。Reddit 架构里 Budgeter 在第 1 步不是巧合 —— 是踩过坑之后的觉悟。最低标准:(1) 事件合并;(2) 每日上限;(3) 深夜静默;(4) opt-out 信号反向降频。CLAUDE.md 里"推送 / 通知团队 —— v0.7 命门"这句话点对了,但必须明确告诉推送团队 —— 不是"能发推送",是"能按预算发推送"。
🏋️Peloton · High Five 异步社交回响
v0.8 直接复刻
规模
3.1M+ 会员 / 96% retention
核心机制
High Five 异步推送(class 结束后仍可点)
推送触发
朋友完成 class / 收到 High Five / class 开始前
retention 增益
+20%(tribe / community 数据)

核心机制

Peloton 把"陪伴感"从 live class 期间延伸到了 class 结束后 ——High Five 不需要双方在同一时间在线。你刚做完 30 分钟骑行 5 小时后,可能有某个朋友刚醒看到你的 activity,点了 High Five,推送会到你的手机:

Peloton · 现在
You received a high five! 🙏
Sarah saw your 30-min ride this morning

为什么这对 Momcozy 是 killer feature

Vol.01 数据:67% 的妈妈不想真聊天,但她们要"被听见"的感觉。深夜 2:17 AM 抽奶 release 的妈妈,最大的恐惧是"我把我的脆弱说出来了,但没人回应"

Peloton High Five 的范式完美解决这个:

这就是 v0.7 链路图里 "23 分钟后 → Notification" 的产品现实意义 —— 不是 23 分钟,是任何时候都行。release 像一个永远开放的信箱,谁路过都能放一封信进来,每一封信都会推送回原发件人。

设计细节(PeloBuddy 社区观察)

给 v0.8 的直接建议: v0.7 Notification mock 应改成"Peloton 范式" —— release 后任何时间的 hug/reply 都会异步推送到锁屏,配合 Reddit 的 Budgeter 合并规则(60 分钟内同事件合并)。这是"硬件触发实时在场感 + Release 累积情绪长河"的产品化具现 —— 实时在场感解决"妈妈现在在线"的问题,异步推送解决"妈妈深夜在线但没人回应"的问题,两条腿走路。

🚨 push 的副作用:行业基准数据

iOS push 平均 opt-in 率(按行业)—— Andrew Chen 数据

行业opt-in 率对 Momcozy 启示
Ride Sharing (Uber/Lyft)79%用户预知"必须依赖推送"
Food & Beverage60%订单时间敏感
Financial Services55%账户安全相关
Social39%👉 Momcozy 落在这一档 —— 平均 60% 的妈妈会拒绝推送
所有行业平均~50%

Appbot 2026 报告补充:最常被关推送的 App 共性 ——

  1. 每天超过 2 条非交易类推送
  2. 无个性化(同样的 banner 推送给所有人)
  3. 无明确价值("打开 App 看看吧" 类无聊文案)
  4. 没有粒度控制(要么全开要么全关)
  5. 晚 10 点后推送
Momcozy 必须避开的 5 个雷:
每一项 v0.8 都要明确策略 —— 现在就把"用户 onboarding 时怎么 opt-in 推送 / 推送频率怎么选 / 类型粒度怎么切 / 深夜静默怎么默认 / 失败信号怎么收"5 个问题写到产品文档里。

🎯 给 v0.8 战略备忘的具体建议(按优先级)

P0 · 必须在 5/25 验证回来之后立刻补的

  1. 简化版 Budgeter 设计(抄 Reddit 架构)—— 写一份 1 页纸的"事件优先级 + 合并规则 + 每日上限 + 深夜静默 + opt-out 反向降频"5 条规则。负责人:Tyra + 推送团队
  2. Peloton 异步范式—— 把 v0.7 Figma 里的 Notification mock 改成"任何时间都可能到来",不是单纯的 "23 分钟后"。负责人:UX 团队
  3. 推送类型粒度 toggle(抄 Strava)—— 至少把 hug / reply / Topic 新贴 / Group 公告 4 类独立 toggle。负责人:产品 + 推送团队

P1 · Phase 1 上线前完成的

  1. Onboarding 推送 opt-in 路径设计 —— 不是系统默认弹窗,是先让用户感受到"为什么推送对你有用"的小演示(参考 Duolingo 的"先给你一个 bonus box 再让你开推送"trick),目标 opt-in 率从 social 平均 39% 拉到 60%+
  2. 预写文案库(10-15 条)—— 按事件 × 用户状态二维表写,深夜版本必须有专门 tone。从 Vol.01 Q21 那位妈妈自发提出"release"的语感入手
  3. BeReal 防稀释护栏 —— Activity anchor 在 Phase 1 严格绑定硬件触发,App 内"探索 Activity"路径推迟到 Phase 2,绝不能让用户自由进 Activity anchor
  4. 推送数据埋点(为 Phase 2 Bandit 准备)—— 从 Day 1 记录 [user_id, template_id, event_type, sent_at, opened_at, action],3 个月后这是优化推送的金矿

P2 · Phase 2 工程目标(写进 roadmap,但 Phase 1 不做)

  1. Bandit 算法选文案(抄 Duolingo)—— 当用户量到 50K+,文案 A/B 数据足够时启动
  2. Two-tower 个性化推荐推送(抄 Reddit)—— 同上
  3. causal model 推送预算优化 —— Phase 1 用规则版(每日 5 条上限),Phase 2 升级到因果建模

📌 对 CLAUDE.md "待对齐问题"的直接答复

CLAUDE.md 原问题赛道 D 给出的答案理由
"5 种 anchor 类型 Phase 1 是否全做?还是 Persistent + Topic 先行?" Persistent + Topic 先行,Activity 等硬件 push 跑通才上,Audio/Podcast 推到 Phase 2 BeReal 死法证明 Activity 不能脱离触发机制;推送 budget 是 Phase 1 重点,Audio/Podcast 不增加推送闭环价值。本结论与赛道 C 一致。
"推送通知能力时间表?(v0.7 命门)" Phase 1 必须包含 5 个 P0 推送能力,不能等 Phase 2 Reddit 数据:60% 用户会 opt out 推送一次性 + 不可逆。Phase 1 没有 Budgeter / 粒度 toggle / 异步范式 / opt-in 路径 = retention 链路在第一周就被关掉
"KOC / Active Mom / Daily Task 是 Phase 1 上还是推后?" 推后,但保留"角色徽章"作为推送回响的发送方身份 KOC 是社区运营议题,跟推送闭环正交。但当 hug 来自带"OFFICIAL"徽章的妈妈时,推送应显示"Momcozy mom Sarah hugged you" —— 给运营留口子

📚 参考资料

赛道 D · Notification-driven Retention · 完成 2026-05-22 · Product Lab · Kris
赛道 A (Presence) / B (Anonymous Release) / C (Container) / D (Notification) 全部完成,下一步整合 → 5 anchor 落地对照表 → 等 5/25 验证回来后做最终修正