WWDC Quick Look 💓 By SwiftGGTeam
Explore Retention Messaging in App Store Connect

Explore Retention Messaging in App Store Connect

观看原视频

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

  1. 优先使用实时响应
  2. fallback 到 App Store Connect 中配置的静态 Retention Messaging
  3. 最后 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,后端解析逻辑需要更新枚举
  • offerIdentifierofferDiscountTypeofferPeriod 等字段与常规优惠一致

两种方案的对比

维度App Store Connect 静态配置Real-time Retention Messaging
决策方式App Store 自动选择开发者实时控制
配置入口App Store Connect 或 ASC APIRetention Messaging API
优惠类型Retention OfferPromotional 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

评论

GitHub Issues · utterances