Все статьи
Руководство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, прежде чем реагировать на возврат, ведь отправить запрос на ваш URL вебхука может кто угодно

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

Следующий запрос на возврат уже в пути.

Настройте RefundHalt за то время, что уходит на чтение очередного письма в поддержку о возврате, который вы не успели оспорить.