赛道 D · 闭环通知机制
Notification-driven Retention
推送闭环是 v0.7 命门 —— Strava / BeReal / Duolingo / Reddit / Peloton 是怎么把"通知 → 回到 App"这件事跑通的?又是怎么把它跑死的?
竞品扫描 · 2026-05-22 · Product Lab · 给 v0.8 战略备忘 + 5/25 验证后第一波规划用
5 条核心结论(给 Tyra 拍板用)
- 推送是 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"路径,而不是默认轰炸。
- Reddit 的"预算器"是 Momcozy 必抄的架构。 Reddit 不直接发推送,而是先用 causal model 给每个用户算"今日推送预算" —— 平衡 click/engage(正向)vs disable/churn(负向),再决定发几条。这是把推送从"营销战术"升级到"留存科学"的关键。Momcozy 应直接抄这个 budgeting 思路,不要让 release → response → notification 的链路在用户身上变成 5+ 次/天的推送。
- Duolingo 的 bandit 算法 + forgetting curve 是 Phase 2 工程目标。 Duolingo 用 KDD 2020 论文级的强化学习选每个用户每天最好的那一条提醒文案,并显式"降低近期发过的文案权重"避免麻木。Phase 1 不需要这么重 —— 先做"按事件触发 + 简单文案 A/B",但目标架构是"按用户敏感度个性化推送频率 + 内容",不是"全员同一模板"。
- BeReal 的死法给 Momcozy 一记警告:单一通知点不能稀释。 BeReal 核心是"每天一次随机时刻 → 2 分钟同步窗口" —— 这个机制本身是它的护城河(2024 峰值 4000 万 MAU)。2025 年加了"一天发多条 / 任意时间发"两个功能 → 用户开始挑好看的时刻发 → "real" 失去意义 → 应用被遗忘。对 Momcozy 的镜像:硬件 push(吸奶器一插发通知)是 Activity anchor 的护城河,绝不能因为"用户没接吸奶器也想用"就放开普通推送 —— 否则 push 就退化成消息流,跟 Reddit / Peanut 同质化。
- 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 个样本深度拆解
规模
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 推送。
推送文案示例(社区原话)
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 链路就死了。
推送机制
每天 1 次随机时刻(9 AM-11 PM)全区域同步
死法
放开"一天多条 / 任意时间发"功能 → 失去"real"含义
核心机制
BeReal 早期是推送即产品的极端范例:整个产品体验就由一条推送定义。每天 9 AM-11 PM 之间某个随机时刻,全区域所有用户同时收到 "⚠️ Time to BeReal ⚠️",然后 2 分钟同步窗口内拍照发布。这个机制创造了三件事:
- 同步在场感(赛道 A 主题)—— 全区域用户同时打开 App、同时拍照、同时刷 feed
- FOMO 飞轮 —— 不在那 2 分钟内的人会"晚到" feed,被打 late 标签
- 稀缺性 —— 一天 1 条强制了 1+1 vs 1+10 的反差,每条都被认真看
死法(最重要的部分)
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 的直接警告:
- 硬件触发的推送 ≠ 普通社区推送。前者是 Activity anchor 护城河,后者是消息流
- 一旦把"打开 App 就能用 Activity"这条路径打开(不依赖硬件),用户就会挑"我准备好了" 的时刻 → 失去同步在场感
- BeReal 倒下的原因不是用户腻了,是产品方自己稀释了核心机制
给 v0.8 的直接建议: Activity anchor 必须严格绑定硬件触发。Tyra 之前提的"Phase 1 减到 3 个 anchor"(Persistent + Topic + Activity)这个建议成立,但要补一句 —— Activity anchor 必须等硬件 push 跑通之后才上,否则用户可以从 App 里"找入口"进 Activity,就是 BeReal 死法 + Clubhouse 死法的合并版。
关键论文
Yancey, KDD 2020 (200M 推送 / 34 天数据集)
核心理论
Bandit + Forgetting Curve(重复降权)
核心机制
Duolingo 的推送系统是个性化引擎的范例,对 Momcozy Phase 1 来说太重,但架构思路必须懂:
- Bandit 算法选文案: 每个用户每天的提醒,从一个预写文案池里"选一条"。算法逐渐学会哪条文案对哪种用户最有效(slot machine 模型)。
- 音域公平打分: "Time for Chinese" 对学中文的人很有效,但对学英语的人不行。打分时只跟同类用户对比。
- 遗忘曲线避麻木: 同一条文案最近发过的会被显式降权。这是反 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.'"
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 件事可以现在做:
- 预写文案池 + 标签:所有推送文案统一收纳,每条标注"适用场景"(深夜 / 白天 / 第一次 release / 收到 hug / 流失 3 天等)
- 事件 + 用户状态二维表查找:(事件: "hug received") × (用户状态: "深夜活跃") → 模板"3 moms hugged your 2:17 AM note. You're not alone tonight."
- 预留 A/B 接口:从 Day 1 就在推送发送时记录 [user_id, template_id, sent_at, opened],3 个月后这就是 Bandit 的训练数据
给 v0.8 的直接建议: Phase 1 推送文案库别贪多 —— 10-15 条手工写的文案 + 简单事件路由就够了。重点是从 Day 1 记录数据,Phase 2 接入 Bandit 时不会从零开始。文案风格参考 Vol.01 Q21 那位北美妈妈自发提出的"release"语感 —— 不要 Duo 的 passive aggressive(妈妈用户对这种 tone 会有强反应),要温暖直白。
规模
数千万用户接收推送 / 百万 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 的情况:
- 妈妈 2 AM release 一条 "Tired AF" → 5 个其他妈妈给了 hug → 推送 5 次(每次一个 hug)
- 3 个妈妈 reply → 推送 3 次
- 她加入的 Topic anchor "#SupplyAnxiety" 有 12 条新贴 → 推送(合并 / 分发?)
- 结果:一晚上 10+ 推送 → 第二天关推送 → 永远失联
带 Budgeter 的情况:
- 系统知道这个妈妈"深夜推送容忍度" = 2 条/晚(从历史数据学到的)
- 合并 5 个 hug 成 1 条 "5 moms hugged your note" + 优先级最高的 reply 推 1 条
- Topic anchor 新贴推到明天早上 7 AM
- 结果:一晚上 2 条推送 → 用户体验是"刚刚好的陪伴"
Phase 1 简化版 Budgeter(不用 ML 也能做)
- 事件分级:hug / reply / Topic 内新贴 / Group 公告 → 4 个优先级
- 合并规则:同事件 60 分钟内合并发 1 条(5 hugs → "5 moms hugged your note")
- 每用户每日上限:默认 5 条(onboarding 时让她选 "Low / Medium / High 推送频率",对应 3/5/10 条)
- 深夜静默时段:11 PM - 6 AM 默认静默(用户可在 onboarding 选"我深夜抽奶想被叫醒")
- 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 命门"这句话点对了,但必须明确告诉推送团队 —— 不是"能发推送",是"能按预算发推送"。
规模
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,推送会到你的手机:
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 的范式完美解决这个:
- 2:17 AM release —— 暂时没人在线响应
- 8 AM 美东其他妈妈起床喂奶时刷 Topic anchor,看到这条 release,点了 hug
- 推送回到原发布者锁屏:"Sarah hugged your 2:17 AM note. You weren't alone after all."
- 原发布者打开 App → 落到那条 release 的 detail 页(87 hugs + 3 replies + Add another note)
这就是 v0.7 链路图里 "23 分钟后 → Notification" 的产品现实意义 —— 不是 23 分钟,是任何时候都行。release 像一个永远开放的信箱,谁路过都能放一封信进来,每一封信都会推送回原发件人。
设计细节(PeloBuddy 社区观察)
- High Five 推送不打扰发送方(不需要双向操作)
- 累积式:5 个 high five 在 1 小时内合并成 "5 people high-fived your ride"
- 可以在 class 结束后的 Activity Page 看到历史 high fives,进而追送 high five 回礼(异步的双向闭环)
给 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 & Beverage | 60% | 订单时间敏感 |
| Financial Services | 55% | 账户安全相关 |
| Social | 39% | 👉 Momcozy 落在这一档 —— 平均 60% 的妈妈会拒绝推送 |
| 所有行业平均 | ~50% | — |
Appbot 2026 报告补充:最常被关推送的 App 共性 ——
- 每天超过 2 条非交易类推送
- 无个性化(同样的 banner 推送给所有人)
- 无明确价值("打开 App 看看吧" 类无聊文案)
- 没有粒度控制(要么全开要么全关)
- 晚 10 点后推送
Momcozy 必须避开的 5 个雷:
每一项 v0.8 都要明确策略 —— 现在就把"用户 onboarding 时怎么 opt-in 推送 / 推送频率怎么选 / 类型粒度怎么切 / 深夜静默怎么默认 / 失败信号怎么收"5 个问题写到产品文档里。
🎯 给 v0.8 战略备忘的具体建议(按优先级)
P0 · 必须在 5/25 验证回来之后立刻补的
- 简化版 Budgeter 设计(抄 Reddit 架构)—— 写一份 1 页纸的"事件优先级 + 合并规则 + 每日上限 + 深夜静默 + opt-out 反向降频"5 条规则。负责人:Tyra + 推送团队
- Peloton 异步范式—— 把 v0.7 Figma 里的 Notification mock 改成"任何时间都可能到来",不是单纯的 "23 分钟后"。负责人:UX 团队
- 推送类型粒度 toggle(抄 Strava)—— 至少把 hug / reply / Topic 新贴 / Group 公告 4 类独立 toggle。负责人:产品 + 推送团队
P1 · Phase 1 上线前完成的
- Onboarding 推送 opt-in 路径设计 —— 不是系统默认弹窗,是先让用户感受到"为什么推送对你有用"的小演示(参考 Duolingo 的"先给你一个 bonus box 再让你开推送"trick),目标 opt-in 率从 social 平均 39% 拉到 60%+
- 预写文案库(10-15 条)—— 按事件 × 用户状态二维表写,深夜版本必须有专门 tone。从 Vol.01 Q21 那位妈妈自发提出"release"的语感入手
- BeReal 防稀释护栏 —— Activity anchor 在 Phase 1 严格绑定硬件触发,App 内"探索 Activity"路径推迟到 Phase 2,绝不能让用户自由进 Activity anchor
- 推送数据埋点(为 Phase 2 Bandit 准备)—— 从 Day 1 记录 [user_id, template_id, event_type, sent_at, opened_at, action],3 个月后这是优化推送的金矿
P2 · Phase 2 工程目标(写进 roadmap,但 Phase 1 不做)
- Bandit 算法选文案(抄 Duolingo)—— 当用户量到 50K+,文案 A/B 数据足够时启动
- Two-tower 个性化推荐推送(抄 Reddit)—— 同上
- 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 验证回来后做最终修正