2026 年 11 月 4 日,Apple 在 App Store Connect 中开放了 retention messages:订阅用户在确认取消的页面上会看到一条消息,你愿意的话还能附带一个优惠。以前只能通过 Retention Messaging API 实现,而且要先申请访问权限。现在 App Store 订阅取消页的挽留消息可以直接在后台配置,一行服务端代码都不用写。
MeteoHealth 的订阅用的是 StoreKit 2,没有接 RevenueCat。所以我关心的是:今天能打开什么,以及之后怎么判断它有没有用。下面按顺序讲配置步骤、审核会拒绝的文案,再把 Apple 和 RevenueCat 的数据拆开看,因为两边量的不是同一个东西。
订阅用户在取消页看到什么#
用户在订阅设置里点 Cancel Subscription,系统弹出 Confirm Cancellation 页面,页面上有一个“From the developer”区块,里面就是你的消息。按钮是 Cancel Subscription 和 Keep Subscription;如果带了优惠,则还有领取优惠的按钮。消息有三种形态:
- 纯文字;
- 文字加图片(没有优惠,或者该用户不符合优惠条件);
- 文字加优惠(用户符合条件时)。此时不显示图片,优惠占据图片的位置。
支持 iOS 15.1+、iPadOS 15.1+、visionOS 1+ 和 macOS 14+。更低版本的系统上,取消页保持原样(见API 概览)。
App Store 订阅取消挽留:两种配置方式#
消息可以在 App Store Connect 里做,也可以通过 Retention Messaging API 下发。两种方式能叠加使用,但成本不同。
| App Store Connect | Retention Messaging API | |
|---|---|---|
| 服务器 | 不需要 | 需要 |
| 消息类型 | 文字、文字加图片、文字加优惠 | 文字(可带要点列表)、文字加图片、切换套餐、促销优惠 |
| 按用户选择消息 | 不能,一个订阅对应一条消息 | 可以,实时选择 |
| 优惠 | Retention offer,在订阅层级配置 | 促销优惠,由你的服务器签名 |
| 权限 | Account Holder、Admin、App Manager、Marketing 角色 | 需申请 |
走 API 时,当有效订阅用户打开带取消按钮的订阅页面,App Store 会请求你的端点。请求由 App Store 签名(JWS,需要你验签),携带 originalTransactionId、productId、userLocale、environment 等字段。生产环境必须在 700 ms 内响应,上线前端点要先在沙盒里通过 Performance Test。如果请求失败,就展示 App Store Connect 里为该订阅配置的消息,没有的话再展示默认消息。
优先级是:实时响应最高,App Store Connect 的消息高于 API 的默认消息。从 11 月 4 日起(API 版本 1.6),实时响应里可以填写在 App Store Connect 中配置好的消息的标识符(见 changelog)。也就是说,服务器可以从你在后台做好的消息里挑一条。
API 的默认消息按“产品加语言区域”设置,只能是文字,不带优惠。关于 API 的申请,Adapty 的文档写的是 Apple 的审核最长要一个月,所以要提前提交。这是 Adapty 的说法,Apple 的文档里没有写明时限。
我会从 App Store Connect 开始:为了一个效果未知的实验去搭服务器不划算;效果出来了,以后还可以再接 API:自 1.6 版起,服务器也能返回在 App Store Connect 里做好的消息。
在 App Store Connect 里配置:逐步操作#
细节见 Apple 的帮助文档和 WWDC26 的 Session 309。
- 打开 App,依次进入 Monetization、Subscriptions、Retention Messaging,点“+”或 Get Started。
- 填 Reference name,订阅用户看不到它。
- 填标题和正文,两项都必填。订阅销售的所有商店地区都要做本地化。
- 需要图片的话,上传 3840 × 2160 或 5244 × 2950 像素的图。文件格式和大小,帮助文档里没写。
- 选择订阅。每个 App 最多 10 条消息,一条消息可以挂任意多个订阅,但一个订阅同一时间只能属于一条消息。
- 需要的话,附上 retention offer(见下文)。
- 打开预览:卡片视图、iPhone 和 iPad 视图,可以选择某个优惠或 None。
- 点 Add for Review。状态变成 Approved,说明消息已经生效,会展示给想取消订阅且符合条件的用户。
优惠#
Retention offer 建在订阅层级,不属于消息,订阅用户只能通过消息看到它。每种订阅套餐类型(标准,或者年订阅的“按月付费、承诺 12 个月”)最多可建 10 个优惠,这 10 个可以全部挂到同一条消息上。展示哪一个由 App Store 决定,Apple 在 WWDC 上的原话是它会“自动为符合条件的用户选择最佳优惠”。
创建之前有两点要知道。Reference name 和优惠标识符创建后不能修改。标识符会出现在 Sales and Trends 的销量和 StoreKit 交易里,所以命名要让半年后的自己还看得懂。
谁能拿到优惠由条件决定。Paid Subscription Duration 要求付费订阅达到最短时长。Wait Between Offers 是可选条件,只对单个优惠生效,不针对整个订阅。优惠类型有 Pay as you go、Pay up front 和 Free。其他国家和地区的价格按最新汇率换算,可以手动覆盖。
审核会拒绝哪些挽留文案#
消息的标题和正文不能提到促销、折扣或具体价格:不能写“$9.99”,不能写“五折”,也不能写“免费一个月”。审核会拒绝这类消息。原因是正文所有订阅用户都能看到,而优惠只有符合条件的人才看得到。
可以写用户会失去什么这类事实。不要施压,也不要承诺无法验证的事:Apple 给的反例是,不能写取消某个 VPN 订阅会导致中病毒。“最好的 App”这类最高级表述和没有依据的统计数字,Apple 强烈不建议,全大写和连续的感叹号也一样。
下面的例子针对一个假设的“按天气预测身体状况”的订阅。这些文案是我自己写的,仅作示意。
| 示例 | 判断 | 原因 |
|---|---|---|
| “留下来,下个月五折” | 会被拒 | 所有订阅用户都能看到的文字里出现了折扣 |
| “最强的天气敏感人群预报!!!” | 不建议 | 最高级、全大写、连续感叹号 |
| “不订阅的话,气压变化和偏头痛还会找上你” | 有风险 | 恐吓加无法验证的说法,和“取消 VPN 会中病毒”是同一类 |
| “10 个订阅用户有 9 个感觉更好” | 不建议 | 没有依据的统计 |
| “取消后,未来几天的身体状况预测将不再更新” | 可以 | 陈述实际损失,不涉及价格和承诺 |
| “已保存的身体状况笔记会留在设备上,但新的天气建议只对订阅用户提供” | 可以 | 平静地说明哪些会保留、哪些会失去 |
关于长度。标题 66 个字符、正文 144 个字符,这两个限制写在 Retention Messaging API 的文档里。在 App Store Connect 里手动输入的消息,帮助文档没有给出限制。既然 ASC 没有标明限制,我会把文字控制在同样的范围内。
版本方面的几个坑#
- 消息不能回滚。编辑已通过的消息会生成 New Version:草稿和线上版本并存,用户看到的还是线上版本。草稿通过后会替换线上版本,无法退回。
- 沙盒显示的是最新版本,包括草稿。测试者可能看到用户暂时还看不到的内容。
- 删除消息不可撤销。已有 10 条的情况下,想建第 11 条就必须先删一条。
- 一个订阅只属于一条消息。把它选进第二条消息,就会从第一条里消失,所以改完之后要检查每个订阅现在挂在哪条消息上。
关于自动化:WWDC 上说 App Store Connect API“也将支持”Retention Messaging,帮助文档则写着可以通过它自动化管理挽留消息。我在文档里没有找到端点名称,所以眼下还没有可以用来搭建 ASC API 自动化的依据。
挽留消息有没有用#
Apple 在 WWDC 上给了一个数字:save rate 平均提高 1.4 个百分点,相当于增长 82%。带促销优惠的消息效果最好,提高 5.5 个百分点,相当于增长 223%。Apple 对 save rate 的定义是:到达取消确认页的订阅用户中,最终保留订阅的比例。Apple 自己也加了一句:不同开发者观察到的结果不一样。统计周期和样本量都没有给。
RevenueCat 的画面不一样,而且这是厂商数据,不是独立研究。RevenueCat 在 10 月 6 日发布了早期基准数据,覆盖 309 个提前拿到权限的 App、共 21,960,020 条消息,每个 App 至少有 100 条消息。统计区间是 2026 年 3 月 22 日到 9 月 20 日。
- save rate 的中位数是 16.7%。排名后四分之一的 App 低于 10/100,前四分之一高于 27/100,前 10% 的 App 达到 42/100 以上。
- 6 月到 9 月的优惠接受率:促销优惠 1.1%,切换套餐 0.6%。
- 对取消的影响,他们拿 64 个付费客户 500 人以上的 App 与匹配的对照组比较。RevenueCat 的结论是:数据没有显示出任何方向上可测量的效果。按作者的说法,这项分析也不能证明消息让用户留了下来或续费。
- 使用消息的 App 比例随收入上升:月收入 $1M 以上的是 44.4%,$100k 到 $1M 的是 16.9%,$10k 到 $100k 的是 4.7%,$1k 到 $10k 的是 1.3%,$1k 以下的是 0.06%。
最后一条对理解其他数字很关键。用了消息的 App 以大体量为主,所以在我看来样本可能有偏差,小项目的表现可能不一样。Apple 和 RevenueCat 的数字也不能直接对比:Apple 没给周期和样本,RevenueCat 的数据来自早期参与者。
在 App Store Connect 里配置的成本是后台的一个页面加一次审核。你的结果只有你自己的订阅用户才能回答,所以要在自己的用户身上测。
Apple 提供了两个度量手段。用户领取 retention offer 后,签名交易和 renewal info 里会出现值为 5 的 offerType。此外,优惠标识符在 Sales and Trends 和 StoreKit 交易里都能看到。这样可以把接受优惠的用户的续订情况和其他人做对比。Apple 的帮助文档里我没有找到内置的对照组比较,所以续订的对比要自己搭。
我给 MeteoHealth 的计划(只是计划,还什么都没配置):先上一条只含文字、陈述实际损失、不带优惠的消息,比较上线前后各一个月的取消占比。这不是 A/B 测试,季节也会影响取消。然后加上优惠,用 offerType 5 看有多少人接受了优惠,以及他们之后有没有续订。要等多久才能下结论,取决于每月有多少次取消。
Retention messages 与 win-back offers#
Retention message 展示给点了取消的在订用户,win-back offer 面向已经离开的用户。Win-back offers 在 2024 年 9 月 10 日公布,对象是前订阅用户,出现的位置有 App Store、App 内、链接和订阅设置。两者互不替代。如果用户还是走了,他已经看过 retention message,接下来轮到 win-back。
上线检查清单#
- 订阅已经配置好,条款和 EULA 链接就位。没有的话,先看订阅 EULA 与条款链接这篇文章。
- 确定了方式:App Store Connect 还是 API。选 API 的话,访问申请要提前提交。
- 标题和正文不含价格、折扣、全大写和感叹号,并写明失去的内容。对照 App Review 的要求检查文案。
- 订阅销售的所有商店地区都有本地化。
- 有图片的话,尺寸是 3840 × 2160 或 5244 × 2950。
- 有优惠的话:标识符有意义且是最终版本,条件(Paid Subscription Duration,必要时 Wait Between Offers)已设置。
- 在 iPhone 和 iPad 上看过预览,沙盒里验证了有优惠和无优惠两种情况。
- 审核通过后,订阅已经挂到正确的消息上。
- 度量方式已就绪:报表里能看到
offerType5 和优惠标识符。交易与 renewal info 通过 StoreKit 2 读取,详见 StoreKit 2 订阅详解。



