Возвраты по подпискам работают не так, как возвраты за разовые покупки, и магазин, в котором вы находитесь, решает, сколько у вас будет права голоса
Возврат по подписке отменяет целый расчётный период, а не отдельную продажу. В App Store решение принимает Apple, а ваш сервер лишь узнаёт результат. В Google Play вы сами выбираете полный или пропорциональный возврат. Вот как каждый магазин обрабатывает возвраты по подпискам и во что вам обходится один такой возврат.

Главное
- Возврат по подписке это не то же самое, что разовый возврат. Отменяется расчётный период, и в обоих магазинах возврат по заказу подписки отменяет саму подписку и прекращает доступ.
- В App Store каждый возврат по подписке решает Apple. Клиент обращается к Apple на reportaproblem.apple.com, Apple выносит решение, а ваш сервер узнаёт результат только через уведомление REFUND, REFUND_DECLINED или REFUND_REVERSED.
- Когда Apple одобряет возврат по подписке, транзакция получает revocationDate, а autoRenewStatus подписки устанавливается в false, поэтому она перестаёт продлеваться, и клиент теряет доступ.
- Apple измеряет автопродлеваемую подписку по прошедшему времени, а не по вашим метрикам использования. Тот, кто прошёл шесть месяцев годового плана, потребил около 50 процентов, и GRANT_PRORATED это единственное предпочтение по возврату, которое вы можете для неё выразить.
- В Google Play возврат оформляете вы сами. purchases.subscriptionsv2.revoke принимает либо fullRefund, который возвращает весь текущий расчётный период, либо proratedRefund, который возвращает только неиспользованное время доступа.
- То, какой заказ вы возвращаете в Google Play, меняет результат. Верните самый последний заказ, и подписка удаляется немедленно, а будущие продления отменяются. Верните более старый заказ, и подписка остаётся активной.
- Ограничения Google Play строгие. Заказы старше трёх лет вернуть нельзя, частичные возвраты работают только для заказов, оформленных после March 2018, они не применяются к платным приложениям, и ни один возврат нельзя отменить после оформления.
Возврат подписки и возврат отдельной внутренней покупки кажутся одной и той же кнопкой. Это не так. Разовая покупка это одно списание, которое вы возвращаете. Подписка это повторяющееся списание с активным правом доступа, поэтому возвраты по подпискам должны отвечать на два вопроса, которых разовый возврат никогда не задаёт: какую часть текущего периода вы возвращаете и продолжает ли подписка работать. App Store и Google Play отвечают на эти два вопроса противоположным образом, и эта разница решает, сколько у вас контроля и сколько денег уходит с вашего счёта.
Вот короткая карта. В App Store решение за Apple, а вы узнаёте о нём постфактум. В Google Play рычаги у вас, и вы сами выбираете полный или пропорциональный возврат. Здесь разбираются оба магазина, точные поля и уведомления, которые использует каждый, какой заказ вы затрагиваете, когда подписка выставляла счета много раз, и во что на самом деле обходится возврат по подписке, если учесть уже потраченные вами вычислительные ресурсы.
Чем возвраты по подпискам отличаются от разовых возвратов
Оба магазина рассматривают возврат как отмену конкретного заказа. У разовой покупки есть только один заказ, поэтому выбирать нечего. Подписка это цепочка заказов, по одному на каждый расчётный период, с правом доступа, которое либо активно, либо нет. Именно такая структура даёт возврату по подписке выбор, которого нет у разового возврата.
Отменяется единица, равная расчётному периоду
Когда вы возвращаете подписку, вы не возвращаете платежи за всю жизнь. Вы действуете в отношении одного заказа в цепочке, обычно самого последнего, а это один расчётный период. Полный возврат возвращает весь этот период. Пропорциональный возврат возвращает только ту часть периода, которую клиент ещё не использовал. В любом случае продажа, которую вы отменяете, это цена одного периода, а не вся история клиента с приложением.
Реальная разница в том, кто решает
Более резкое различие это полномочия. В App Store Apple решает, произойдёт ли возврат по подписке вообще, а вы в лучшем случае предоставляете контекст. В Google Play решаете вы, и API делает ровно то, что вы ему говорите. Для клиента результат тот же, но у разработчика совершенно другое место, и это меняет то, что вы создаёте для обработки каждого случая.
Как App Store обрабатывает возврат по подписке
На стороне Apple вы зритель с маленьким микрофоном. Клиент говорит с Apple, Apple принимает решение, а ваш сервер читает результат.
Клиент обращается к Apple, и Apple выносит решение
Клиент App Store запрашивает возврат по подписке на reportaproblem.apple.com, а не у вас. Apple рассматривает запрос по собственным сигналам и решает. Вы его не одобряете, и в консоли Apple нет кнопки, которая позволила бы вам оформить возврат по подписке так, как это делает Google Play. У Apple есть до 90 days с момента покупки, чтобы принять запрос на рассмотрение, и как только она выносит решение, оно принадлежит Apple.
Что видит ваш сервер, когда приходит возврат
Вы узнаёте результат через App Store Server Notifications V2. Одобренный возврат приходит как уведомление REFUND, и транзакция теперь несёт revocationDate, отмечающий, когда доступ должен закончиться. autoRenewStatus подписки устанавливается в false, поэтому она перестаёт продлеваться, и клиент теряет право доступа. Если Apple отклоняет запрос, вы получаете REFUND_DECLINED, а если Apple позже отменяет уже одобренный возврат, вы получаете REFUND_REVERSED, и подписка возвращается. Ваша задача читать эти уведомления и переключать доступ, а не голосовать.
| Уведомление | Что оно означает | Что вы делаете |
|---|---|---|
| REFUND | Apple одобрила возврат; транзакция получает revocationDate | Отзовите доступ, считайте autoRenewStatus равным false |
| REFUND_DECLINED | Apple отклонила запрос клиента на возврат | Ничего не меняется; подписка сохраняется |
| REFUND_REVERSED | Apple отменила ранее одобренный возврат | Восстановите доступ и продажу |
Apple измеряет подписку по времени, а не по вашим метрикам
Для расходуемой покупки вы можете сообщить Apple, сколько было использовано, через данные о потреблении. Для автопродлеваемой подписки Apple сама вычисляет потребление по прошедшему времени. Собственный пример Apple это клиент, прошедший шесть месяцев годовой подписки, который потребил около 50 процентов. Так что ваши метрики использования не задают число для подписки. Единственный рычаг, который вы можете дёрнуть, это refundPreference, и для подписки актуальное значение это GRANT_PRORATED, которое означает, что вы предпочли бы, чтобы Apple вернула только неиспользованную часть. Это предпочтение, а не решение. Решает всё равно Apple.
Как Google Play обрабатывает возврат по подписке
Google Play отдаёт решение в ваши руки. Есть экран в Play Console и набор методов API, которые позволяют вернуть подписку напрямую, выбрать сумму и решить, прекращается ли доступ. Это противоположная позиция по сравнению с Apple, и она приходит с выбором, который нужно сделать правильно.
Полный или пропорциональный, и это ваше решение
Актуальный способ вернуть и отозвать подписку это purchases.subscriptionsv2.revoke, вызываемый с revocationContext. Передайте fullRefund, и Google Play завершает подписку и возвращает полную сумму текущего расчётного периода. Передайте proratedRefund, и Google Play завершает подписку и возвращает только оставшееся, неиспользованное время доступа. Более старый метод мог делать только полные возвраты, и это причина использовать новый. Пропорциональный отзыв это тело из двух строк, revocationContext, оборачивающий proratedRefund, а для всего периода вы подставляете fullRefund. Любой отзыв запускает уведомление разработчику в реальном времени SUBSCRIPTION_REVOKED, которое является вашим сигналом отключить доступ.
То, какой заказ вы возвращаете, меняет происходящее
Google Play также позволяет вернуть заказ без отзыва, через orders.refund, и здесь срабатывает тонкое правило. Если вы возвращаете самый последний заказ в подписке, заказ возвращается, подписка удаляется немедленно, а будущие продления отменяются. Если вы возвращаете более старый заказ в цепочке, этот заказ возвращается, но подписка остаётся активной. В orders.refund параметр revoke отзывает только тогда, когда заказ самый последний, поэтому, чтобы прекратить доступ по активной подписке, вы используете purchases.subscriptionsv2.revoke вместо этого.
| Действие | Возвращаемый заказ | Что происходит с подпиской |
|---|---|---|
| Возврат самого последнего заказа | Последний расчётный период | Удаляется немедленно, будущие продления отменяются |
| Возврат более старого заказа | Прошлый расчётный период | Остаётся активной, продолжает продлеваться |
| subscriptionsv2.revoke, полный или пропорциональный | Текущий период | Завершается сейчас, отправляется SUBSCRIPTION_REVOKED |

Ограничения, о которые спотыкаются разработчики
Несколько жёстких углов ловят людей, и ни один из них не лежит на счастливом пути.
- Заказы старше трёх лет вернуть вообще нельзя.
- Частичные возвраты работают только для заказов, оформленных после March 2018, и никогда для покупок платных приложений.
- Вы можете складывать несколько частичных возвратов на один заказ, но не до и не сверх итоговой суммы заказа.
- Возврат нельзя отменить после того, как он оформлен.
Google Play обычно возвращает решение по возврату в течение дня, хотя это может занять до четырёх. Планируйте эту задержку, когда возврат должен отразиться в ваших собственных механизмах контроля доступа.
Во что на самом деле обходится вам возврат по подписке
Возвращённое списание никогда не равно всему счёту. В тот момент, когда заказ подписки был доставлен, вы уже потратили на него реальные деньги: вычисления, вызовы API модели, хранилище и любые выплаты, привязанные к этому периоду. Возврат возвращает продажу. Он не возвращает то, что вы потратили на её обслуживание. У подписки форма потери зависит от того, какой возврат вы оформляете.
Полный против пропорционального это денежное решение
Полный возврат в Google Play отдаёт весь текущий период, поэтому вы теряете весь доход периода, сохраняя все затраты, которые уже понесли в этом периоде. Пропорциональный возврат отдаёт только неиспользованную часть, поэтому вы сохраняете доход за ту часть, которую клиент действительно получил. Если клиент прошёл 60 процентов месячного периода на плане за 10 долларов, полный возврат обходится вам в полные 10 долларов, а пропорциональный возврат обходится примерно в 4 доллара, неиспользованные 40 процентов. Apple применяет ту же логику прошедшего времени на своей стороне, когда определяет размер возврата по подписке.
| Тип возврата | Что клиент получает обратно | Что вы сохраняете |
|---|---|---|
| Полный возврат | Весь текущий период, 10.00 | Ничего из этого периода |
| Пропорциональный возврат | Неиспользованные 40 процентов, около 4.00 | Использованные 60 процентов, около 6.00 |
Затраты, которые никогда не возвращаются
Какой бы возврат вы ни оформили, внутренние затраты этого периода пропали. Вызов API модели, за который вы заплатили, отрендеренное видео, выделенное хранилище, уже отправленная выплата автору, ничего из этого не отменяется, когда проходит возврат по подписке. Определяйте размер возврата по тому, что клиент действительно использовал, а не по тому, как давно он подписался, потому что прошедшее время это не затраты, и ни один магазин не относится к нему так. И после August 3, 2026, если списание по подписке в Google Play заканчивается банковским чарджбэком, а не возвратом, который оформляете вы, вы также поглощаете банковскую комиссию за чарджбэк, которой избегает возврат, оформленный вами первым.
Как обрабатывать возвраты по подпискам без человека у экрана
Ничего из этого не должно ждать, пока кто-то читает панель. Уведомления приходят в любой час, и доступ должен переключаться в тот момент, когда приходит возврат, а не на следующее утро.
Читайте результат и отзывайте доступ в обоих магазинах
В App Store слушайте REFUND, REFUND_DECLINED и REFUND_REVERSED и используйте revocationDate и autoRenewStatus, чтобы автоматически прекращать или восстанавливать доступ. В Google Play слушайте SUBSCRIPTION_REVOKED и сигналы об аннулированных покупках и делайте то же самое. Это та проводка, которую RefundHalt запускает за вас: уведомление на входе, аккаунт сопоставлен, доступ переключён, ни одного человека в цепочке.
Держите доказательства готовыми до спора
Узкие окна, которые всё же просят ваш вклад, 12-часовой CONSUMPTION_REQUEST от Apple по расходуемым покупкам и 24-часовое рассмотрение чарджбэка в Google Play, помогают только тогда, когда доказательства уже существуют. Привязывайте идентификатор аккаунта к каждой покупке, appAccountToken в формате UUID на Apple и хешированный setObfuscatedAccountId длиной 64 characters или меньше на Google Play, и записывайте, что доставил каждый оплаченный период. Тогда, когда приходит токен, дело уже собрано, и ответить внутри окна это работа машины, а не гонка.
Частые вопросы
- Отличается ли возврат подписки от возврата разовой покупки?
- Да. Разовая покупка это отдельный заказ, который вы возвращаете. Подписка это цепочка заказов с активным правом доступа, поэтому возврат по подписке действует на один расчётный период и также решает, продолжает ли подписка работать. И в App Store, и в Google Play возврат по заказу подписки отменяет подписку и прекращает доступ, и вы часто можете выбрать между возвратом всего периода или только неиспользованной части.
- Может ли разработчик оформить возврат по подписке в App Store напрямую?
- Нет. Возвраты по подпискам в App Store решает Apple. Клиент запрашивает возврат на reportaproblem.apple.com, Apple выносит решение, а вы узнаёте результат через уведомление REFUND, REFUND_DECLINED или REFUND_REVERSED. Единственное, что вы можете предложить на входе, это refundPreference, например GRANT_PRORATED, и Apple относится к нему как к предпочтению, а не решению.
- Как оформить пропорциональный возврат по подписке в Google Play?
- Вызовите purchases.subscriptionsv2.revoke с revocationContext, установленным в proratedRefund. Google Play завершает подписку и возвращает только оставшееся, неиспользованное время доступа, затем отправляет уведомление SUBSCRIPTION_REVOKED. Передайте вместо этого fullRefund, чтобы вернуть весь текущий период. Более старый метод отзыва мог делать только полные возвраты.
- Почему мой возврат в Google Play не отменил подписку?
- Потому что вы вернули более старый заказ в цепочке. В Google Play возврат самого последнего заказа удаляет подписку немедленно и отменяет будущие продления, но возврат более старого заказа возвращает тот период, пока подписка остаётся активной. Параметр revoke в orders.refund отзывает только тогда, когда заказ самый последний, поэтому, чтобы прекратить активную подписку, используйте purchases.subscriptionsv2.revoke.
- Насколько давний заказ подписки можно вернуть?
- В Google Play заказы старше трёх лет вернуть нельзя. Частичные возвраты работают только для заказов, оформленных после March 2018, и никогда для платных приложений, и ни один возврат нельзя отменить после оформления. В App Store Apple принимает запросы клиентов на возврат в течение до 90 days с момента покупки и решает каждый сама.
Источники и дополнительное чтение
- Android Developers: Manage subscriptions and one-time purchases
- Play Console Help: Manage your app's orders and issue refunds
- Google Play Developer API: orders.refund
- Google Play Developer API: purchases.subscriptionsv2.revoke
- Google Play Help: Refund policies for apps, games, and in-app purchases
- Apple Developer: Handling refund notifications
- Apple Developer WWDC21: Support customers and handle refunds
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Разница между возвратным платежом и возвратом средств сводится к тому, кто принимает решение, и только одно из них окончательно
Возврат средств в App Store или Google Play оформляет магазин, и решение принимает магазин. Возвратный платеж, это когда банк клиента забирает деньги, и решает банк, без права на обжалование. Для разработчиков приложений разрыв между ними теперь стоит денег, потому что с 3 августа 2026 года Google Play перекладывает расходы по возвратным платежам на вас.
С 3 августа расходы на возвратные платежи в Google Play переложены на разработчиков, и вот что теперь забирает у вас каждый спор
Google Play тихо перестал покрывать возвратные платежи. По заказам, размещённым 3 августа 2026 года или позже, вы возвращаете цену покупки за вычетом сервисной комиссии Play плюс банковскую комиссию по каждому оспоренному заказу. Вот что изменилось, во сколько теперь обходится один возвратный платёж и то 24-часовое окно, в котором вы можете дать отпор.