Усі статті
Поглиблений аналіз8 хв читання

Retention Messaging API від Apple виводить ваш текст на екран скасування, але запити на повернення коштів через нього не проходять

Retention Messaging API від Apple дає змогу показати повідомлення, пропозицію змінити план або промоакцію, коли підписник натискає «Скасувати». Пояснюємо, як це працює, скільки коштує підтримка і чому запит на повернення коштів потрапляє до Apple, взагалі не торкаючись цього екрана.

Людина за столиком у кав'ярні тримає iPhone з відкритим екраном налаштувань підписки, саме для цього моменту створено Retention Messaging API від Apple

Головне

  • Retention Messaging API від Apple дає розробнику змогу вибрати повідомлення, яке підписник на iPhone бачить після натискання Cancel Subscription (Скасувати підписку). Є чотири типи: текст, текст із зображенням, пропозиція змінити план або промоакція.
  • У документації Apple Retention Messaging API досі описано як попередню версію, до якої розробники подають заявку. Версія 1.0 вийшла 16 липня 2025 року, версія 1.5 вийшла 27 квітня 2026 року.
  • У потоці реального часу Apple викликає ендпоінт Get Retention Message розробника, коли активний підписник відкриває сторінку з деталями підписки та кнопкою скасування. У продакшені ендпоінт має відповісти протягом 700 ms, інакше Apple показує повідомлення за замовчуванням.
  • Повідомлення для утримання впливає лише на майбутні продовження. Запит на повернення коштів надходить до Apple через reportaproblem.apple.com або вікно повернення в застосунку, і екран скасування з повідомленнями для утримання не є частиною цього шляху.
  • Коли клієнт запитує повернення коштів у застосунку через API запиту на повернення StoreKit, Apple сама вимикає автопродовження і надсилає DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED. Це той самий тип і підтип, що й при скасуванні зі сторінки налаштувань підписок.
  • Єдиний внесок розробника в рішення Apple щодо повернення коштів: відповідь на CONSUMPTION_REQUEST протягом 12 годин через Send Consumption Information, і лише якщо клієнт погодився поділитися цими даними.
  • У Google Play немає задокументованого аналога повідомлення на екрані скасування, яке вибирає розробник. Розробник отримує сповіщення SUBSCRIPTION_CANCELED уже після скасування, а поле userInitiatedCancellation показує, чому підписник пішов.

Підписникам, які натискають «Скасувати» на iPhone, тепер можна показати вибране вами повідомлення, дешевший план або знижку ще до підтвердження. Це Retention Messaging API від Apple, і вперше розробник має голос на власному екрані скасування Apple. Це досі попередня версія, до якої треба подати заявку. І вона має жорстку межу, важливу для всіх, кого турбують повернення коштів: вона звертається до людей, які збираються припинити платити, а не до тих, хто просить гроші назад. Такі запити йдуть до Apple іншим шляхом.

Що робить Retention Messaging API від Apple

Retention Messaging API це сервіс типу «сервер до сервера». Ви заздалегідь завантажуєте до Apple тексти й зображення повідомлень, Apple їх перевіряє, а потім ви вибираєте, яке схвалене повідомлення побачить підписник, коли збирається скасувати автопоновлювану підписку. У документації Apple наведено чотири типи повідомлень:

  • Текстове повідомлення, яке може містити маркований список.
  • Текстове повідомлення із зображенням.
  • Повідомлення про зміну плану, яке пропонує іншу підписку з тієї самої групи підписок.
  • Повідомлення з промоакцією, яке пропонує знижену ціну на тому самому або іншому рівні. Для цього використовується промоакція, яку ви налаштовуєте в App Store Connect і підписуєте на своєму сервері.

Повідомлення з'являється після того, як клієнт натискає Cancel Subscription на сторінці з деталями підписки. Потім Apple показує сторінку Confirm Cancellation (Підтвердити скасування). Клієнт усе одно може скасувати, натиснути Keep Subscription (Залишити підписку) або прийняти запропоновану вами пропозицію чи план. Приховати вихід не можна, і Apple просить розробників не завантажувати оманливий або неточний контент.

Повідомлення за замовчуванням і потік реального часу

Є два способи роботи. Простий: повідомлення за замовчуванням, тобто текст із зображенням або маркованим списком чи без них, призначений кожному продукту та локалі. Розширений: потік реального часу, у якому Apple викликає ендпоінт Get Retention Message на вашому сервері, а ви відповідаєте ідентифікатором повідомлення. Лише потік реального часу може показувати повідомлення про зміну плану та промоакції.

На практиці повідомлення за замовчуванням обов'язкові. Apple використовує їх як запасний варіант щоразу, коли виклик у реальному часі не вдається, і взагалі не показує повідомлення для утримання для продукту в локалі, де немає повідомлення за замовчуванням.

ПунктЩо сказано в документації Apple
СтатусПопередня версія, розробники подають заявку на участь
ПродуктиАвтопоновлювані підписки
Типи повідомленьТекст, текст із зображенням, зміна плану, промоакція
Ліміт відповіді в реальному часі700 ms у продакшені
Доступ до продакшенуСпершу пройти тест продуктивності в sandbox, близько 700 ms
Заголовок і пункти спискуПо 66 символів, до п'яти пунктів
Основний текст144 символи
Альтернативний текст зображення150 символів
Повідомлень на застосунок2 000
ПеревіркаНові повідомлення мають статус PENDING і показуються лише після APPROVED
ПристроїiOS 15.1, iPadOS 15.1, visionOS 1, macOS 14 або новіші

Що Apple передає вашому серверу у виклику в реальному часі

Запит є JWS, підписаним App Store. Після декодування він містить originalTransactionId, appAppleId, productId, userLocale, requestIdentifier у форматі UUID, середовище та signedDate. Apple радить перевіряти, що appAppleId відповідає вашому застосунку, і не відповідати, якщо це не так. Найкорисніше тут originalTransactionId: за ним можна подивитися, що цей підписник насправді робив у вашому застосунку, перш ніж вибрати, що йому сказати.

Де з'являється повідомлення для утримання, а де ні

Apple розміщує повідомлення на одному екрані: це крок Confirm Cancellation після натискання Cancel Subscription, наприклад з Apple Account > Subscriptions або зі сторінки підписки в App Store. Цей екран вирішує, чи відбудеться наступне продовження. Уже отриманих грошей він не стосується.

Запит на повернення коштів це окрема дія. Сторінка підтримки Apple направляє клієнтів на reportaproblem.apple.com, де вони вибирають "Request a refund" (Запит на повернення коштів), причину та покупку, а потім чекають на відповідь від 24 до 48 годин. У вашому застосунку beginRefundRequest зі StoreKit відкриває вікно повернення коштів Apple, і Apple зазначає, що App Store схвалює або відхиляє запит протягом 48 годин. Жоден із цих шляхів не проходить через екран Confirm Cancellation.

МоментДе це відбуваєтьсяЩо на конуХто вирішуєВаш внесок
СкасуванняСторінка з деталями підписки, потім Confirm CancellationМайбутні продовженняКлієнтВибране вами повідомлення для утримання, відповідь протягом 700 ms
Запит на повернення коштівreportaproblem.apple.com або вікно повернення у вашому застосункуУже сплачені грошіAppleДані для CONSUMPTION_REQUEST протягом 12 годин, якщо клієнт дав згоду

Чи може повідомлення для утримання зупинити запит на повернення коштів?

Ні. Запит на повернення коштів ніколи не доходить до екрана, де живе повідомлення. Одна деталь у документації Apple щодо сповіщень робить це наочним. Коли клієнт запитує повернення коштів через ваш застосунок за допомогою API запиту на повернення, Apple сама вимикає автопродовження і надсилає DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED. Клієнт, який скасовує підписку зі сторінки налаштувань підписок, породжує той самий тип і підтип. Ваш сервер бачить одне сповіщення для двох дуже різних клієнтів, і лише один із них бачив ваше повідомлення для утримання.

Якщо запит на повернення коштів рухається далі, каналом для доказів є CONSUMPTION_REQUEST. Apple надсилає його для запитів на повернення за будь-яким типом продукту, і у вас є 12 годин, щоб відповісти через Send Consumption Information. Відповідати можна лише за згоди клієнта. Після цього рішення Apple надходить як сповіщення REFUND або як REFUND_DECLINED, якщо Apple відхиляє повернення, яке клієнт ініціював у вашому застосунку.

Чи є в Google Play API для повідомлень при скасуванні?

У документації Google про життєвий цикл підписок його немає. Підписник Google Play скасовує підписку в центрі підписок Play, зберігає доступ до кінця поточного платіжного циклу і до того може натиснути Resubscribe (Відновити підписку), щоб скасувати скасування. Google називає це відновленням. Ви дізнаєтеся про скасування пізніше зі сповіщення SUBSCRIPTION_CANCELED, а поле userInitiatedCancellation у ресурсі підписки показує, чому користувач пішов. Пауза, яка, за словами Google, увімкнена за замовчуванням для всіх підписок, є головним вбудованим способом зменшити добровільний відтік.

Щодо повернень коштів, у Google Play є власний канал для доказів. PendingRefundReviewNotification надходить, коли чарджбек потребує перевірки розробником, і у вас є 24 години, щоб відповісти через orders.reviewrefund. Для замовлень, зроблених після 3 серпня 2026 року, Google перекладає на розробника ціну покупки за вирахуванням сервісного збору Play, а також комісії банку за чарджбек, коли чарджбек проходить.

Скільки грошей коштує вам екран скасування

Повідомлення для утримання здаються безкоштовними. Це не так, і рахунки приходять з трьох боків.

Обчислення при кожному перегляді сторінки

Apple викликає ваш ендпоінт, коли активний підписник відкриває сторінку з деталями підписки та кнопкою скасування, а не лише тоді, коли він скасовує. Кожен візит означає запит, який ваш сервер має автентифікувати, обробити й відповісти на нього протягом 700 ms, інакше Apple покаже повідомлення за замовчуванням. Це виключає функцію з холодним стартом, яка іноді працює дві секунди. Ви платите за постійно «теплі» потужності, а також за всі читання з бази даних і платні виклики сторонніх API, які ваша логіка рішень робить на кожен запит.

Розробник за столом стежить за графіками часу відповіді сервера на моніторі поруч із ноутбуком та iPhone, саме такий постійно доступний ендпоінт очікує Retention Messaging API від Apple

Знижка це дохід, від якого ви відмовилися

Промоакція, яка втримує підписника, зберігає реальні гроші. Промоакція, яка дісталася тому, хто й так залишився б, це чиста знижка. Ось ілюстрація, а не еталон. Місячний план за $9.99 за половину ціни протягом трьох місяців коштує вам $14.99 за кожну прийняту пропозицію. Якщо кожен третій із тих, хто її прийняв, залишився б і за повною ціною, тисяча прийнятих пропозицій означає близько $5,000 знижки, відданої людям, яким вона не була потрібна. Інший бік балансу: підписники, які справді збиралися піти.

Повернення коштів, яке провокує незручний вихід

Apple залишає кнопку Cancel Subscription на сторінці, тож нікого не можна загнати в пастку, але дратувати все ще можна. Клієнт, який відчуває тиск, має інший варіант: попросити Apple повернути останній платіж. Коли повернення відбувається, гроші йдуть назад, а витрати на обчислення, зберігання, виклики API та будь-які партнерські виплати, пов'язані з цим підписником, уже зроблено. Жодне повідомлення для утримання цих витрат не поверне.

Як використовувати повідомлення для утримання, не збільшуючи частку повернень

Ставтеся до екрана скасування як до місця для точності, а не для хитрощів. Кілька правил тримають його по правильний бік межі повернень:

  • Вирішуйте для кожного підписника окремо. Використовуйте originalTransactionId із запиту Apple, щоб переглянути нещодавнє використання. Пропонуйте знижку або дешевший план тим, хто користується продуктом. Тим, хто не відкривав його тижнями, покажіть коротке чесне повідомлення.
  • Відповідайте швидко. Прораховуйте рішення заздалегідь, коли змінюються дані про використання, щоб сам запит зводився до одного пошуку, який легко вкладається в 700 ms.
  • Напишіть повідомлення за замовчуванням для кожного продукту та локалі. Без нього невдалий виклик означає, що повідомлення не буде взагалі.
  • Уважно стежте за AUTO_RENEW_DISABLED. Якщо далі надходить CONSUMPTION_REQUEST для того самого originalTransactionId, перед вами запит на повернення коштів, а не скасування, і 12-годинний відлік уже почався.
  • Відповідайте на кожен CONSUMPTION_REQUEST, на який маєте право відповісти. RefundHalt надсилає Apple точні дані про споживання в межах 12-годинного вікна і відповідає на перевірку чарджбеків Google Play протягом 24 годин, бо це єдині два моменти, коли будь-який із магазинів запитує вашу позицію.

Чи варто просити в Apple доступ?

Якщо ви продаєте автопоновлювані підписки і вже обробляєте App Store Server Notifications V2, імовірно, так. Екран скасування це останнє місце, де можна звернутися до підписника перед його відходом, а зміна плану коштує вам менше, ніж повна втрата клієнта. Лише закладіть у бюджет ендпоінт, який відповідає на кожен перегляд сторінки підписки, і тримайте захист від повернень там, де повернення справді відбуваються.

Поширені запитання

Що таке Retention Messaging API від Apple?
Це API типу «сервер до сервера», який дає розробнику змогу вибрати повідомлення, що його бачить підписник після натискання Cancel Subscription в автопоновлюваній підписці. Apple підтримує чотири типи: текст, текст із зображенням, пропозицію змінити план і промоакцію. У документації Apple його досі описано як попередню версію, до якої розробники подають заявку.
Як швидко має відповідати мій ендпоінт Get Retention Message?
Протягом 700 ms у продакшені. Якщо ваш сервер повільніший або дає збій, Apple показує повідомлення за замовчуванням, налаштоване для цього продукту та локалі, а якщо його немає, не показує нічого. Також потрібно пройти тест продуктивності в sandbox, близько 700 ms, перш ніж Apple дозволить указати URL для продакшену.
Чи з'являється повідомлення для утримання, коли клієнт запитує повернення коштів?
Ні. Apple показує повідомлення для утримання на екрані Confirm Cancellation після того, як клієнт натискає Cancel Subscription. Запити на повернення проходять через reportaproblem.apple.com або вікно повернення в застосунку, яке відкриває beginRefundRequest, і єдиний внесок розробника там: CONSUMPTION_REQUEST, на який треба відповісти протягом 12 годин, якщо клієнт дав згоду.
Як відрізнити запит на повернення коштів від скасування в App Store Server Notifications?
Лише за сповіщенням про продовження це неможливо. І скасування зі сторінки налаштувань підписок, і запит на повернення через ваш застосунок породжують DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED. CONSUMPTION_REQUEST для тієї самої транзакції, а згодом сповіщення REFUND або REFUND_DECLINED показують, що йдеться про запит на повернення коштів.
Чи дає Google Play розробникам змогу показувати повідомлення, коли користувачі скасовують підписку?
Документація Google про життєвий цикл підписок такої можливості не описує. Розробники отримують сповіщення SUBSCRIPTION_CANCELED постфактум і можуть прочитати поле userInitiatedCancellation, щоб дізнатися, чому користувач скасував підписку. Пауза, увімкнена за замовчуванням для всіх підписок, є головним вбудованим інструментом Google Play проти добровільного відтоку.

Джерела та додаткове читання

RefundHalt

Автопілот повернень для App Store і Google Play

Читайте далі

Наступний запит на повернення вже в дорозі.

Налаштуйте RefundHalt за час, потрібний, щоб прочитати черговий лист у підтримку про повернення, яке ви не встигли оскаржити.