Усі статті
Посібник8 хв читання

Причини скасування підписки зазвичай надходять до вас раніше за запит на повернення коштів, і Google Play передає їх значно більше, ніж Apple

Google Play записує причини скасування підписки з опитування під час скасування, а Apple надсилає лише код завершення. Що повідомляє кожен магазин, які сигнали віщують повернення коштів або чарджбек і скільки вам коштує кожен із них.

Розробник за столом у ранковому світлі переглядає екран підписки в телефоні поруч із блокнотом, повним позначок, і сортує причини скасування підписки

Головне

  • Google Play запитує підписників під час скасування, чому вони йдуть. Відповідь надходить розробнику через canceledStateContext.userInitiatedCancellation.cancelSurveyResult у purchases.subscriptionsv2.
  • Опитування Google Play має п'ять відповідей, які може прочитати розробник: мало користуюся, технічні проблеми, вартість, знайшов кращий застосунок та інше. Довільний текст у reasonUserInput є лише тоді, коли користувач обирає «інше».
  • Сповіщення SUBSCRIPTION_CANCELED від Google Play містить лише токен покупки. Причину скасування треба отримати через purchases.subscriptionsv2.get, а Google очищає всі поля скасування, якщо користувач відновлює підписку.
  • App Store Server API від Apple не має опитування під час скасування. Поле expirationIntent повертає один із п'яти кодів: клієнт скасував, помилка оплати, немає згоди на підвищення ціни чи конверсію пропозиції, продукт недоступний або інше.
  • Сповіщення Apple DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED може означати, що App Store вимкнув автопродовження після запиту клієнта на повернення коштів, а не лише те, що клієнт вимкнув його сам.
  • Причина скасування ніколи не дає розробнику права голосу щодо повернення коштів. Докази запитують лише CONSUMPTION_REQUEST від Apple, на який треба відповісти протягом 12 годин, і перевірка чарджбека в Google Play через orders.reviewrefund, з відповіддю протягом 24 годин.
  • Підписник Google Play, який скасовує через технічні проблеми, найчастіше хоче повернути гроші. Для замовлень після 3 серпня 2026 року виграний ним чарджбек коштує розробнику ціну покупки за вирахуванням сервісного збору Play плюс комісії банку.

Більшість підписників, які зрештою отримують повернення коштів, спершу скасовують підписку. Це скасування має причину, і два магазини передають її в дуже різному обсязі. Google Play проводить коротке опитування й надсилає відповідь на ваш сервер, разом із довільним текстом. Apple надсилає числовий код, який каже, як закінчилася підписка, а не чому клієнт захотів піти. Читайте обидва сигнали правильно, і ви побачите запити на повернення заздалегідь, поки ще можна щось зробити.

Що Google Play повідомляє про причини скасування підписки

Коли користувач скасовує підписку в центрі підписок Play, Google запитує його про причину. Відповідь потрапляє до ресурсу підписки, який ви отримуєте з purchases.subscriptionsv2.get, у поле canceledStateContext. Цей об'єкт існує лише поки підписка скасована або завершилася, і він показує, хто її завершив: користувач, система Google, ви або заміна, наприклад зміна тарифу.

Якщо скасував користувач, об'єкт userInitiatedCancellation містить два поля. cancelTime показує час скасування. cancelSurveyResult містить відповідь на опитування.

Причина в опитуванніОпис GoogleЩо це часто означає
CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGEНедостатньо користується підпискоюМало використання, отже, мало витрат на акаунт
CANCEL_SURVEY_REASON_TECHNICAL_ISSUESТехнічні проблеми під час використання застосункуНайсильніший сигнал повернення коштів і чарджбека
CANCEL_SURVEY_REASON_COST_RELATEDПричини, пов'язані з ціноюЧутливість до ціни, іноді неочікуване продовження
CANCEL_SURVEY_REASON_FOUND_BETTER_APPКористувач знайшов кращий застосунокПереміг конкурент, спір буває рідко
CANCEL_SURVEY_REASON_OTHERSІнші причиниЧитайте reasonUserInput, слова самого користувача
CANCEL_SURVEY_REASON_UNSPECIFIEDПричину в опитуванні не вказаноВідповіді немає, працювати немає з чим

Права колонка відображає наше тлумачення, а не позицію Google. Перші дві колонки взято безпосередньо з довідника API.

У сповіщенні немає причини

Скасована підписка запускає сповіщення для розробників у реальному часі SUBSCRIPTION_CANCELED, тип 3. Google прямо зазначає, що такі сповіщення повідомляють лише про зміну стану покупки. Payload містить токен покупки і більше нічого корисного, тож ваш обробник має викликати purchases.subscriptionsv2.get, щоб прочитати відповідь на опитування.

Що видно в Play Console

Для загальних цифр код не потрібен. Звіти про підписки в Play Console мають картку «Скасування», яка ділить відтік на добровільний, недобровільний та інший, і картку з відповідями на опитування про скасування від користувачів, які вирішили відповісти. Текстові відповіді тих, хто обрав «інше», можна завантажити у CSV з картки «Інші відповіді». Для завантаження потрібен дозвіл View financial data, той самий, який ви надали б інструменту, що читає ваші замовлення.

Що повідомляє Apple і про що мовчить

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

expirationIntentЗначення за AppleВідповідний підтип EXPIRED
1Клієнт скасував підпискуVOLUNTARY
2Помилка оплати, наприклад неправильні платіжні даніBILLING_RETRY
3Немає обов'язкової згоди на підвищення ціни чи конверсію пропозиціїPRICE_INCREASE
4Продукт був недоступний для покупки під час продовженняPRODUCT_NOT_FOR_SALE
5Інша причинаПідтипу немає

Код 1 єдиний описує рішення клієнта, і він нічого не каже про мотив. Клієнт, який пішов через постійні збої застосунку, і клієнт, який просто завершив проєкт, виглядають однаково.

Сигнал, прихований в AUTO_RENEW_DISABLED

Одне сповіщення Apple варто розглянути уважніше. DID_CHANGE_RENEWAL_STATUS з підтипом AUTO_RENEW_DISABLED зазвичай означає, що клієнт вимкнув автопродовження. Документація Apple додає другий випадок: App Store теж вимикає автопродовження після того, як клієнт запросив повернення коштів.

Отже, на iOS подія вимкнення продовження може бути першим слідом запиту на повернення. Якщо покупка є витратною або це автоматично поновлювана підписка, може надійти CONSUMPTION_REQUEST, і з цього моменту у вас є 12 годин, щоб надіслати дані про споживання. Якщо така подія надходить без видимих дій у вашому застосунку, сприймайте її як попередження й підготуйте дані про використання цього акаунта.

Apple і Google поруч

Google PlayApple App Store
Запитує користувача про причинуТак, опитування під час скасуванняОпитування, видимого розробнику, немає
Де зберігається причинаcanceledStateContext у purchases.subscriptionsv2expirationIntent в інформації про продовження
Довільний текстreasonUserInput, лише для «інше»Немає
Хто скасувавКористувач, система, розробник або замінаВиводиться з коду та підтипу
СповіщенняSUBSCRIPTION_CANCELED, потім виклик getDID_CHANGE_RENEWAL_STATUS, EXPIRED
Втрачається при повторній підписціТак, очищається при відновленніІнформація про продовження відображає поточний стан
ПанельКартка відповідей на опитування про скасуванняДля причин немає
Надруковані картки опитування, розкладені невеликими стосами на дерев'яному столі поруч із телефоном і чашкою кави, так розробник групує причини скасування підписки

Де скасування перетворюється на повернення коштів

Скасування зупиняє наступне списання. Останнє воно не повертає. Чи повернуться гроші, залежить від того, у який процес повернення клієнт потрапить далі, а більшість таких процесів відбувається без вас.

  • У Google Play покупець може сам отримати повернення протягом 48 годин після покупки, і рішення ухвалює Google.
  • Про повернення через підтримку Google або Apple вирішує магазин.
  • CONSUMPTION_REQUEST від Apple запитує ваші дані про споживання, строк 12 годин.
  • Перевірка чарджбека в Google Play запитує докази через orders.reviewrefund, строк 24 години. Рішення банку щодо чарджбека остаточне.

Причина скасування не змінює жодного з цих правил. Вона змінює те, наскільки рано ви дізнаєтеся, який клієнт незадоволений, і чи будуть готові ваші докази, коли надійде один із двох процесів, що їх запитують.

Скільки вам коштує кожна причина

Відповідь на опитування також приблизно показує, скільки вже коштувало обслуговування акаунта. Саме ці гроші залишаються на вас у разі повернення.

Технічні проблеми

Це найдорожчий випадок. Клієнт користувався продуктом достатньо, щоб натрапити на проблеми, тож ви оплатили обчислення за його сесіями, виклики API моделі за його запитами, зберігання всього, що він створив, і виплати авторам, чий контент він використовував. Якщо потім він отримає повернення, ціна піде назад, а ці витрати залишаться на вас. Якщо в Google Play він піде до банку, замовлення після 3 серпня 2026 року коштуватиме вам ціну покупки за вирахуванням сервісного збору Play плюс комісії банку.

Вартість

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

Мало користується

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

Знайшов кращий застосунок

Ці клієнти рідко щось оскаржують. Вони пішли до конкурента. Причина корисна для продуктових рішень і майже ніколи для захисту від повернень.

Порядок роботи з причинами скасування

  • За кожного SUBSCRIPTION_CANCELED з Google Play викликайте purchases.subscriptionsv2.get і зберігайте canceledStateContext разом із токеном покупки та cancelTime.
  • Зберігайте reasonUserInput дослівно, коли причина «інше». Це єдиний довільний текст, який дає будь-який із магазинів.
  • За кожного DID_CHANGE_RENEWAL_STATUS від Apple з AUTO_RENEW_DISABLED записуйте подію в лог і вивантажуйте дані про використання акаунта на випадок, якщо надійде CONSUMPTION_REQUEST.
  • За кожного сповіщення EXPIRED від Apple записуйте підтип і expirationIntent, щоб добровільний відтік і помилки оплати не змішувалися.
  • За скасувань у Google Play через технічні проблеми перевіряйте журнали помилок цього акаунта й зв'язуйтеся з клієнтом до того, як він піде до банку.
  • Ведіть журнали використання для кожного акаунта, щоб на CONSUMPTION_REQUEST відповісти протягом 12 годин, а на перевірку чарджбека протягом 24.

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

Як дізнатися, чому підписник Google Play скасував підписку?
Викличте purchases.subscriptionsv2.get і прочитайте canceledStateContext.userInitiatedCancellation.cancelSurveyResult. Поле reason містить відповідь на опитування, а reasonUserInput містить довільний текст, якщо користувач обрав «інше». Play Console також показує підсумки в картці відповідей на опитування про скасування.
Чи повідомляє Apple розробникам, чому клієнт скасував підписку?
Ні. Apple не має опитування під час скасування, видимого розробнику. Поле expirationIntent каже, як закінчилася підписка, з кодами для скасування клієнтом, помилки оплати, відсутності згоди на підвищення ціни, недоступності продукту або іншої причини, але не повідомляє мотив клієнта.
Чи містить сповіщення SUBSCRIPTION_CANCELED причину скасування?
Ні. Сповіщення для розробників у реальному часі від Google Play повідомляють лише про зміну стану покупки. Отримайте підписку через purchases.subscriptionsv2.get, щоб прочитати причину, і одразу збережіть її, бо Google очищає поля скасування, якщо користувач відновлює підписку.
Чи може сповіщення Apple AUTO_RENEW_DISABLED означати запит на повернення коштів?
Так. Згідно з документацією Apple, підтип AUTO_RENEW_DISABLED охоплює і випадок, коли клієнт вимикає автопродовження, і випадок, коли App Store вимикає його після запиту клієнта на повернення коштів.
Чи можна закрити доступ, коли підписник скасовує підписку?
У Google Play не можна, поки він ще має право на доступ. Google зазначає, що підписник, який скасував, зберігає доступ до кінця розрахункового періоду, а дострокове закриття доступу порушує правила підписок Google Play. Використовуйте expiryTime, щоб визначити, коли доступ закінчується.

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

RefundHalt

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

Читайте далі

Посібник8 хв читання

Надмірні запити на повернення коштують дорожче за самі повернення: обидва магазини застосунків вважають їх сигналом якості

Правило 5.6.4 Apple прямо називає надмірні запити на повернення ознакою того, що застосунок не відповідає стандартам якості, а угода Google про розповсюдження дозволяє видаляти застосунки нових розробників через частку повернень. Розбираємо, що пише кожен магазин, скільки коштує видалення і як не потрапити під удар.

Детальний розбір8 хв читання

Перевіряйте серверні сповіщення App Store, перш ніж діяти щодо повернення коштів, бо надіслати запит на ваш webhook URL може будь-хто

Сповіщення про повернення коштів залишається звичайним HTTPS-запитом, доки ви не перевірите його підпис. Пояснюємо, як перевіряти серверні сповіщення App Store і повідомлення Google Play RTDN, що саме підписує кожен магазин і скільки коштує підроблене або помилково відхилене повернення.

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

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