Highlight
Apple 在 App Store Connect 中新增 Retention Messaging 功能,让开发者在用户取消订阅时展示挽留消息和优惠;同时开放 Real-time Retention Messaging API,支持服务器在用户点击取消的实时请求中返回个性化消息、降级方案或促销优惠,已采用该功能的 App 平均挽留率提升 82%,促销优惠模式提升 223%。
核心内容
做订阅制 App 的人都有一个共同的痛点:用户默默打开系统设置取消订阅,你连说话的机会都没有。以前只能在 App 内放一个”管理订阅”的入口,但真打算取消的用户根本不会走你的流程。
Apple 这次把订阅管理页面的取消确认环节开放了。(00:15)
App Store Connect 静态配置:零后端即可上手
对于没有后端团队或不想写代码的开发者,可以直接在 App Store Connect 里配置 Retention Messaging。进入订阅管理页面,点击”Get Started”创建一条挽留消息,填写标题和描述,从 Asset Library 选一张配图,再绑定到具体的订阅项上。一条消息可以关联多个订阅,也可以配置多条 Retention Offer,App Store 会自动为符合条件的用户选择最优优惠。(02:43)
配置完成后,当用户点击取消订阅,系统会在取消确认页展示你配置的消息。Apple 给出的数据很直接:用了 Retention Messaging 的 App,平均取消挽留率(Save rate)提升了 1.4 个百分点,相当于 82% 的相对增长;如果配上促销优惠,挽留率提升 5.5 个百分点,相当于 223% 的相对增长。(02:06)
Real-time Retention Messaging:千人千面的精准挽留
对于有后端能力的团队,重头戏是 Real-time Retention Messaging。当用户点击取消时,App Store 会向你的服务器发送一个 HTTP 请求,你的服务器可以根据用户数据实时决定展示什么内容。(06:48)
实时响应支持三种格式:
- 返回一条消息(纯文字或配图片)
- 返回一个降级方案(alternateProduct),推荐同订阅组内的其他产品
- 返回一个促销优惠(promotionalOffer),下发限时折扣
这种模式下,你可以根据用户的活跃度、使用时长、付费历史等数据,决定是打折挽留、推荐低价方案,还是只展示一条提醒消息。这比统一发优惠券聪明得多。(08:57)
三级兜底机制
实时接口对响应速度有硬性要求。如果服务器超时或返回错误,App Store 会按以下顺序降级:(10:10)
- 优先使用实时响应
- fallback 到 App Store Connect 中配置的静态 Retention Messaging
- 最后 fallback 到 Retention Messaging API 中配置的默认消息
这意味着即使实时接口出问题,用户看到的也不是空白页面。
详细内容
Retention Messaging API 端点概览
实时功能通过 https://api.storekit.apple.com/inApps/v1/messaging 提供服务,核心端点如下:(07:50)
// URL 配置
PUT /realtime/url // 设置实时回调 URL
GET /realtime/url // 查询当前 URL
DELETE /realtime/url // 删除 URL
// 消息配置
PUT /message/{messageIdentifier} // 创建/更新消息
DELETE /message/{messageIdentifier} // 删除消息
GET /message/list // 列出所有消息
PUT /default/{productId}/{locale} // 设置默认消息
DELETE /default/{productId}/{locale} // 删除默认消息
GET /default/{productId}/{locale} // 查询默认消息
// 图片配置
PUT /image/{imageIdentifier} // 上传图片
DELETE /image/{imageIdentifier} // 删除图片
GET /image/list // 列出所有图片
// 性能测试(仅限 Sandbox)
POST /performanceTest // 发起性能测试
GET /performanceTest/result/{requestId} // 查询测试结果
关键点:
- 所有配置操作都是 server-to-server,不需要客户端参与
- 消息、图片、默认配置相互独立,可以灵活组合
- Sandbox 环境必须先通过
/performanceTest才能启用 Production
App Store 发来的实时请求格式
当用户点击取消时,App Store 会向你的回调 URL 发送如下 JSON:(08:34)
{
"originalTransactionId": "123456789",
"appAppleId": 6745974591,
"productId": "Yoga_summer_2026",
"userLocale": "en-US",
"requestIdentifier": "c03248af-dd76-4e9b-9c1e-4489cd19a768",
"environment": "Production",
"signedDate": 1780920000000
}
关键点:
originalTransactionId用于定位用户的订阅记录userLocale告诉你该用哪种语言回复requestIdentifier用于追踪和调试environment区分 Sandbox 和 Production
响应格式一:返回消息
{
"message": {
"messageIdentifier": "551ee7c0-c097-418e-9dd5-2a98533a7390"
}
}
关键点:
messageIdentifier必须预先通过PUT /message/{id}配置好- 消息可以单独展示文字,也可以配对一张通过
PUT /image/{id}上传的图片 - 如果该消息在 App Store Connect 中也有配置,两者会保持一致
响应格式二:返回降级产品
{
"alternateProduct": {
"messageIdentifier": "ed7f25fc-5741-46a3-8502-062e0fb8afd0",
"productId": "Yoga_summer_2026_annual"
}
}
关键点:
productId必须与当前取消的订阅在同一个 Subscription Group 内- 用户点击后会直接切换到新产品,无需重新走购买流程
- 适合”用不到高级功能”的用户,用低价方案保住 LTV
- iOS 26.5 新增的 12 个月承诺月付计划也可以通过
billingPlanType字段指定(11:11)
响应格式三:返回促销优惠
{
"promotionalOffer": {
"messageIdentifier": "80135e2b-ae15-4ec4-8c5c-9ecc8045c0dc",
"promotionalOfferSignatureV2": "eyJhbGciOiJFUzI..."
}
}
关键点:
- 必须使用 V2 版本的促销优惠签名,V1 签名不生效
- 签名生成逻辑遵循 StoreKit 2 规范
- 适合高价值但即将流失的用户,用限时折扣精准挽留
识别 Retention Offer 交易
当用户接受了挽留优惠,交易信息中会带有新的标记:(06:08)
{
"bundleId": "com.example.app",
"productId": "Yoga_summer_2026",
"type": "Auto-Renewable Subscription",
"transactionReason": "RENEWAL",
"offerType": 5,
"offerIdentifier": "Yoga_2026_cancel_free_3m",
"offerDiscountType": "FREE_TRIAL",
"offerPeriod": "P3M",
"originalTransactionId": "1000011859217"
}
关键点:
offerType: 5是新增的 Retention Offer 类型- 以前 offerType 只有 1-4,后端解析逻辑需要更新枚举
offerIdentifier、offerDiscountType、offerPeriod等字段与常规优惠一致
两种方案的对比
| 维度 | App Store Connect 静态配置 | Real-time Retention Messaging |
|---|---|---|
| 决策方式 | App Store 自动选择 | 开发者实时控制 |
| 配置入口 | App Store Connect 或 ASC API | Retention Messaging API |
| 优惠类型 | Retention Offer | Promotional Offer |
| 视图支持 | 消息 / 图片 / 优惠 | 消息 / 图片 / 优惠 / 降级方案 |
| 需要服务器 | 否 | 是 |
| 性能要求 | 无 | 必须通过 Sandbox 性能测试 |
(11:52)
核心启发
1. 先配静态,再上实时
没有后端或后端资源紧张的团队,先在 App Store Connect 里把静态 Retention Messaging 配好。Apple 的数据已经证明,哪怕只是配一条文字消息,平均也能提升 82% 的挽留率。这一步零代码、零成本,应该立刻做。
- 做什么:在 ASC 中为每个订阅产品配置一条挽留消息和一张配图
- 为什么值得做:零开发成本,直接吃到 82% 的挽留率提升
- 怎么开始:进入 App Store Connect > Subscriptions > Retention Messaging > Get Started
2. 用 alternateProduct 做智能降级
不要一遇到取消就打折。分析用户取消的原因,如果是因为”用不到高级功能”,返回一个同组内的低价基础版订阅。这保住了用户的 LTV,也避免了培养”取消就打折”的羊毛党心理。
- 做什么:根据用户画像数据,在实时响应中返回
alternateProduct - 为什么值得做:比打折更优雅,利润率损失更小
- 怎么开始:在订阅组内创建低价档位产品,通过 Retention Messaging API 配置降级消息
3. 把用户画像缓存到 Redis
实时接口对延迟极度敏感。不要在收到请求时去查数据库或调第三方接口。把用户的活跃度、付费历史、使用偏好等数据提前计算好,存在 Redis 里,收到 originalTransactionId 直接查缓存返回。
- 做什么:构建一个低延迟的挽留决策服务
- 为什么值得做:性能测试是上线门槛,延迟直接影响用户体验
- 怎么开始:用
originalTransactionId做 key,把用户画像数据预热到缓存中
4. 结合 Win-back 做全生命周期闭环
Retention Messaging 拦截的是”正在取消”的用户,Win-back 召回的是”已经取消”的用户。两者结合,订阅生命周期彻底闭环。
- 做什么:在取消时用 Retention 拦截,取消后用 Win-back 召回
- 为什么值得做:覆盖订阅流失的两个关键节点
- 怎么开始:先上线 Retention Messaging,再接入 Win-back Offer
关联 Session
- What’s new in Apple In-App Purchase — 了解 iOS 26.5 新增的 12 个月承诺月付计划,以及 Retention Offer 在交易中的完整表现
- Enhance your presence on the App Store — 学习 Asset Library 的使用,Retention Messaging 的图片直接复用 Asset Library
- App Intents: What’s new — 如果你的 App 支持 Siri 或 Shortcuts,可以结合 App Intents 让用户通过语音管理订阅
- What’s new in StoreKit — 深入理解 StoreKit 2 的交易模型和促销优惠签名机制
评论
GitHub Issues · utterances