Причины отмены подписки обычно приходят к вам раньше запроса на возврат, и 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 Play | Apple App Store | |
|---|---|---|
| Спрашивает пользователя о причине | Да, опрос при отмене | Опроса, видимого разработчику, нет |
| Где хранится причина | canceledStateContext в purchases.subscriptionsv2 | expirationIntent в информации о продлении |
| Свободный текст | reasonUserInput, только для «другое» | Нет |
| Кто отменил | Пользователь, система, разработчик или замена | Выводится из кода и подтипа |
| Уведомление | SUBSCRIPTION_CANCELED, затем вызов get | DID_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, чтобы определить, когда доступ заканчивается.
Источники и дополнительное чтение
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Чрезмерные запросы на возврат обходятся дороже самих возвратов: оба магазина приложений считают их сигналом качества
Правило 5.6.4 Apple прямо называет чрезмерные запросы на возврат признаком того, что приложение не соответствует стандартам качества, а соглашение Google о распространении позволяет удалять приложения новых разработчиков по доле возвратов. Разбираем, что пишет каждый магазин, во что обходится удаление и как не попасть под удар.
Проверяйте серверные уведомления App Store, прежде чем реагировать на возврат, ведь отправить запрос на ваш URL вебхука может кто угодно
Уведомление о возврате остается обычным HTTPS-запросом, пока вы не проверили его подпись. Рассказываем, как проверять серверные уведомления App Store и сообщения RTDN из Google Play, что подписывает каждый магазин и во что обходится поддельный или ошибочно отклоненный возврат.