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

Главное
- Каждый возврат, который Apple или Google отправляет на ваш сервер, несёт код причины возврата, и это единственная часть возврата, которую вы можете прочитать после того, как деньги уже ушли. Он говорит, почему произошёл возврат, а это говорит, что делать дальше.
- Voided Purchases API от Google Play проставляет два числа на каждой отмене: voidedReason от 0 до 8 (другое, передумал, не получено, дефект, случайная покупка, мошенничество, дружественное мошенничество, чарджбэк, неподтверждённая покупка) и voidedSource: 0 пользователь, 1 разработчик или 2 Google.
- Apple даёт более узкий, но чёткий сигнал. На возвращённой транзакции revocationReason равен 1, когда App Store сделал возврат из-за реальной или предполагаемой проблемы внутри вашего приложения, и 0, когда возврат произошёл по другой причине, например из-за случайной покупки.
- Коды делятся на три стопки. Дефект, не получено, неподтверждённая покупка и код Apple о проблеме в приложении указывают на ваш продукт, поэтому их вы чините. Мошенничество, дружественное мошенничество и чарджбэк, это споры, которые вы оспариваете или предотвращаете. Передумал и случайную покупку вы никогда не могли предотвратить.
- voidedReason 8, неподтверждённая покупка, это возврат, который вы выставили себе сами. Google автоматически возвращает и отзывает любую покупку, которую ваше приложение не подтвердило в течение трёх дней, и этот код, это то, как вы находите такую ошибку в собственной интеграции.
- voidedReason 7, чарджбэк, это дорогой. Для заказов Google Play, размещённых 3 августа 2026 года или позже, проигранный чарджбэк стоит разработчику цену покупки за вычетом сервисного сбора Play плюс сбор банка за чарджбэк, поэтому подсчёт ваших отмен с кодом чарджбэка, это подсчёт реальных дополнительных расходов.
- Voided Purchases API смотрит назад только на 30 дней и фильтрует по тому, когда Google видит отмену, а не когда произошла покупка, поэтому код причины, который вы не захватили внутри этого окна, это код причины, который вы теряете навсегда.
Когда Apple или Google возвращает деньги одному из ваших клиентов, деньги обычно уже ушли до того, как у вас появится голос. То, что попадает на ваш сервер потом, выглядит как чек, и большинство команд относятся к нему именно так. Это больше, чем чек. Каждый возврат несёт код причины возврата, и это единственная часть возврата, которую вы всё ещё можете прочитать после того, как решение принято. Google Play говорит вам, что возврат был чарджбэком, или запросом из-за того, что клиент передумал, или покупкой, которую ваше собственное приложение так и не подтвердило. Apple говорит вам, винит ли возврат что-то внутри вашего приложения. Прочитайте этот код, и возврат перестаёт быть строкой в отчёте и становится инструкцией: почини это, оспорь это или отпусти это. Вот что означает каждый код, как их сортировать и сколько стоит каждый.
Что на самом деле такое код причины возврата
Код причины возврата, это собственная метка магазина, объясняющая, почему покупка была отменена. Вы его не задаёте и не можете с ним спорить. Он приходит прикреплённым к возврату постфактум, и два магазина раскрывают его в разных формах и с очень разной детализацией.
Google Play проставляет причину и источник на каждой отмене
Voided Purchases API от Google Play возвращает одну запись на каждую отменённую покупку, и каждая запись несёт два целых числа, которые важны. voidedReason говорит, почему покупка была отменена. voidedSource говорит, кто это запустил. Вместе они превращают простой возврат в предложение: этот заказ был отменён из-за чарджбэка, инициированного Google, или отменён из-за того, что клиент передумал, инициированного пользователем. Вы читаете это, опрашивая API или подписавшись на уведомление для разработчиков в реальном времени, которое срабатывает, когда приходит отмена. В любом случае эти два числа, это та полезная нагрузка, которую стоит сохранять.
Apple даёт более узкий сигнал, но чёткий
Apple не выдаёт вам причину с девятью значениями. На возвращённой транзакции Apple задаёт revocationReason одному из двух значений. 1 означает, что App Store вернул транзакцию из-за реальной или предполагаемой проблемы внутри вашего приложения. 0 означает, что он вернул её по другой причине, например из-за случайной покупки. Поле появляется только на транзакциях, которые были возвращены или отозваны, рядом с revocationDate, внутри подписанной информации о транзакции в App Store Server Notification REFUND. Два значения, это немного, но то, которое важно, 1, это Apple говорит вам, что возврат был о вашем продукте, а не о том, что клиент передумал.
Девять причин, которые даёт вам Google Play
voidedReason от Google богаче из двух, и каждое значение стоит знать с первого взгляда, потому что каждое указывает в другое место. Вот полный набор, прямо из ресурса VoidedPurchase, с тем, что каждый код на самом деле велит вам сделать.
| voidedReason | Метка Google | Что код велит вам сделать |
|---|---|---|
| 0 | Другое | Конкретная причина не записана. Складывайте в общую корзину и следите за объёмом, а не за отдельным случаем. |
| 1 | Передумал | Клиент передумал. С вашим приложением всё было в порядке. |
| 2 | Не получено | Клиент говорит, что так и не получил то, за что заплатил. Проблема с доставкой, которую надо проверить. |
| 3 | Дефект | Покупка не сработала. Ошибка продукта, и самый действенный код в этом списке. |
| 4 | Случайная покупка | Ошибочный клик или непреднамеренная покупка. Подумайте о более понятном шаге подтверждения. |
| 5 | Мошенничество | Google отметил транзакцию как мошенническую. Не ваш клиент, и не ваш доход, чтобы его удерживать. |
| 6 | Дружественное мошенничество | Покупатель оспорил списание, которое он совершил и получил. Доказательства всё ещё могут повлиять на этот случай. |
| 7 | Чарджбэк | Банк отменил списание. Самый дорогой путь, теперь с прикреплённым сбором. |
| 8 | Неподтверждённая покупка | Ваше приложение так и не подтвердило покупку, поэтому Google вернул её автоматически. Ошибка в вашем коде. |
voidedSource говорит вам, кто нажал на спусковой крючок
Рядом с причиной стоит voidedSource, и он отвечает на другой вопрос: кто отменил это. 0 означает, что это сделал пользователь, через самообслуживание или банк. 1 означает, что это сделал разработчик, то есть вы или ваши собственные инструменты, выпустившие возврат. 2 означает, что это сделал Google по собственному решению, включая автоматический возврат за неподтверждённую покупку. Когда вы видите всплеск отмен, источник, это первый разрез. Стена из источника 2, это Google, действующий по вашему аккаунту, и обычно это сигнал, указывающий обратно на вашу интеграцию, а не на ваших клиентов.
Рассортируйте каждый возврат на починить, оспорить или принять
Причина, по которой код полезен, в том, что он говорит вам, какой из трёх ответов заслуживает возврат. Большинство команд относятся ко всем возвратам одинаково и тратят усилия на те, которые никогда не смогут выиграть. Коды делятся чётко.
Починить: возвраты, которые вызвал ваш продукт
Некоторые коды, это отчёты об ошибках в одежде возврата. Дефект (3) и не получено (2) у Google, и revocationReason 1 у Apple, все говорят одно и то же: клиент заплатил, а ваше приложение не доставило. Неподтверждённая покупка (8), самый чёткий из них, потому что вина полностью в вашем коде выставления счетов. Это самые дешёвые возвраты для устранения, потому что вы устраняете их, починив что-то своё, а не убеждая кого-либо. Растущее число в этой стопке, это дефект продукта с приложенной суммой в деньгах.
Оспорить: возвраты, которые кто-то обрабатывает
Мошенничество (5), дружественное мошенничество (6) и чарджбэк (7), это споры. Чистое мошенничество (5), это не ваш клиент и не доход, который вы когда-либо собирались удержать. Дружественное мошенничество (6), когда покупатель получил ровно то, за что заплатил, а затем оспорил это, это единственный спор, который ваши доказательства всё ещё могут сдвинуть, а чарджбэк (7), это место, где эти доказательства подаются. Когда один из них приходит, вы отзываете доступ, если ещё не сделали этого, и там, где открыто окно рассмотрения, вы отвечаете на него тем, что знаете об аккаунте.
Принять: возвраты, которые вы никогда не могли предотвратить
Передумал (1) и случайная покупка (4), это собственное изменение решения клиента. revocationReason 0 у Apple тоже здесь. Ни одна функция не отказала, и никакого мошенничества не произошло. Вы можете смягчить корзину случайных покупок более понятным подтверждением покупки, но вы не можете переспорить возврат из-за того, что клиент передумал, и время, потраченное на попытки, это время, отнятое у стопки починки, где на самом деле находятся деньги.
| Корзина | Коды Google | Сигнал Apple | Ваше действие |
|---|---|---|---|
| Починить | 2 не получено, 3 дефект, 8 неподтверждённая | revocationReason 1 | Найдите первопричину ошибки продукта или выставления счетов за этим |
| Оспорить | 5 мошенничество, 6 дружественное мошенничество, 7 чарджбэк | (проявляется через REFUND, а не через причину) | Отзовите доступ, ответьте в окне рассмотрения доказательствами |
| Принять | 1 передумал, 4 случайная покупка | revocationReason 0 | Запишите, настройте процесс покупки, двигайтесь дальше |

Ловушка 30 дней, из-за которой коды причин легко потерять
На стороне Google есть жёсткое ограничение, которое превращает это из функции отчётности в срок. Если вы не захватываете коды непрерывно, вы их теряете.
Voided Purchases API смотрит назад только на 30 дней
Google прямо заявляет: API может показать только отменённые покупки за последние 30 дней. Более старые отмены не возвращаются, какой бы startTime вы ни передали, а само значение startTime нельзя задать раньше, чем 30 дней назад. Хуже для наивной интеграции то, что окно в 30 дней измеряется по тому, когда системы Google видят покупку как отменённую, а не по тому, когда покупка была совершена, и даже не по voidedTimeMillis в записи. Так что код причины возврата, который вы не вытянули внутри этого окна, пропал, а ежемесячная задача экспорта с любым пробелом молча отбросит отмены, которые она была слишком медленной, чтобы поймать.
Сколько коды причин стоят в деньгах
Два кода несут конкретную цену, и их чтение, это то, как вы ставите число на проблемы, которые иначе прячутся внутри агрегированной доли возвратов.
Один код, это счёт, который вы выписали себе сами
voidedReason 8, неподтверждённая покупка, самый чистый пример возврата, который вызвали вы. Google Play требует, чтобы ваше приложение подтвердило покупку в течение трёх дней после предоставления права, и если вы этого не делаете, Google автоматически возвращает заказ и отзывает товар. Каждая отмена с отметкой 8, это реальная продажа клиенту, который хотел продукт, отданная обратно, потому что вызов для подтверждения покупки так и не сработал. Потерянная сумма, это полная цена продажи плюс вычисления, вызовы API и хранилище, которые вы уже потратили на её доставку. Это не возврат, о котором вы договариваетесь. Это ошибка, которую вы закрываете, и код, это то, как вы её находите.
Код чарджбэка теперь несёт сбор
voidedReason 7, чарджбэк, изменил стоимость 3 августа 2026 года. Для заказов Google Play, размещённых в эту дату или позже, проигранный чарджбэк стоит разработчику цену покупки за вычетом сервисного сбора Play, плюс банковский сбор за чарджбэк, тогда как Google покрывает только свой собственный сервисный сбор. Поскольку сборы за чарджбэк фиксированы, а цены продуктов нет, на дешёвой встроенной покупке один только сбор может превысить то, что заплатил клиент. Подсчёт ваших отмен с кодом 7 теперь, это подсчёт статьи расходов, а не просто потерянной продажи, и именно поэтому корзина чарджбэков заслуживает собственной строки в любом отчёте о возвратах, который вы строите.
| Код причины | Во что он вам обходится | Почему код важен |
|---|---|---|
| 8 Неподтверждённая покупка | Полная цена продажи плюс стоимость доставки, на продаже, которую клиент хотел | Он нанесён самому себе, поэтому код, это трекер ошибок |
| 7 Чарджбэк (заказ 3 августа 2026 года или позже) | Цена продажи за вычетом сервисного сбора Play, плюс банковский сбор за чарджбэк | Единственный код, добавляющий сбор поверх потерянной продажи |
| 3 Дефект | Цена продажи плюс стоимость доставки, повторённая для каждого клиента, попавшего на ошибку | Объём в этом коде оценивает дефект продукта в деньгах |
| 1 Передумал | Цена продажи и стоимость доставки, которую вы уже потратили | Реальные издержки, но не те, которые изменение кода может вернуть |
Как выстраиваются Apple и Google
Два магазина отвечают на один и тот же вопрос с разной детализацией, поэтому межмагазинный отчёт о возвратах должен нормализовать их, а не ожидать, что они совпадут.
| Вопрос | App Store | Google Play |
|---|---|---|
| Где живёт код | revocationReason в подписанной транзакции уведомления REFUND | voidedReason в Voided Purchases API и её уведомлении |
| Сколько причин | Две: 1 проблема в вашем приложении, 0 другое | Девять, от 0 другое до 8 неподтверждённая покупка |
| Кто это сделал | Не выделено отдельно | voidedSource: 0 пользователь, 1 разработчик, 2 Google |
| Насколько далеко назад можно прочитать | Доступно на транзакции при любом запросе | Только последние 30 дней отмен |
| Самый чёткий сигнал | 1 означает, что возврат о вашем продукте | Коды 3, 8 и 7 каждый указывают на отдельные, устранимые издержки |
Магазины никогда не дадут вам один и тот же код для одного и того же возврата, и это нормально. Важно то, что оба выдают вам машиночитаемую причину, и оба вознаграждают команду, которая её читает. Единственный бит Apple говорит вам, когда возврат, это вина вашего продукта. Девять причин Google и его флаг источника говорят вам, какая ошибка продукта, какой спор и какой самому себе нанесённый пробел в выставлении счетов вы рассматриваете. Ни один код не останавливает возврат. Оба говорят вам, что делать, чтобы следующий не случился.
RefundHalt захватывает код причины на каждом возврате в момент его прихода, в обоих магазинах, и удерживает его с хорошим запасом внутри 30-дневного окна Google, чтобы ничего не ускользнуло. Он сортирует каждую отмену на починить, оспорить или принять, так что всплеск кода 3 дефект доходит до вас как оповещение о продукте, а всплеск кода 8 неподтверждённая доходит до вас как ошибка интеграции, а не как смутный спад дохода. Он отвечает на CONSUMPTION_REQUEST от Apple в течение 12 часов и на рассмотрение чарджбэка в Google Play в течение 24, и отзывает доступ в момент, когда приходит возврат или чарджбэк. Вы не можете изменить код, который магазин ставит на возврат. Вы можете убедиться, что читаете каждый из них и действуете по тем, которые действительно ваши, чтобы их починить.
Частые вопросы
- Что такое код причины возврата в App Store и Google Play?
- Это собственная метка магазина, объясняющая, почему покупка была отменена, доставляемая на ваш сервер вместе с возвратом. Voided Purchases API от Google Play возвращает voidedReason от 0 до 8 и voidedSource: 0 пользователь, 1 разработчик или 2 Google. Apple задаёт revocationReason 1, когда возврат произошёл из-за проблемы внутри вашего приложения, или 0 по другой причине, например из-за случайной покупки. Вы не задаёте код и не можете его изменить, но его чтение говорит вам, указывает ли возврат на ваш продукт, на спор или на изменение решения клиента.
- Какие значения voidedReason есть у Google Play?
- Их девять: 0 другое, 1 передумал, 2 не получено, 3 дефект, 4 случайная покупка, 5 мошенничество, 6 дружественное мошенничество, 7 чарджбэк и 8 неподтверждённая покупка. Каждое возвращается по каждой отменённой покупке через Voided Purchases API рядом с voidedSource, который говорит, кто инициировал отмену. Коды 2, 3 и 8 указывают на проблемы в вашем собственном приложении, коды 5, 6 и 7, это споры, а коды 1 и 4, это собственное решение клиента.
- Что означает revocationReason 1 у Apple?
- Это означает, что App Store вернул транзакцию из-за реальной или предполагаемой проблемы внутри вашего приложения, в отличие от значения 0, которое означает, что возврат произошёл по другой причине, например из-за случайной покупки. Поле появляется только на возвращённых или отозванных транзакциях вместе с revocationDate, внутри подписанной информации о транзакции в App Store Server Notification REFUND. 1, это Apple говорит вам, что возврат был о вашем продукте.
- Почему Google вернул покупку с кодом причины неподтверждённая?
- Потому что ваше приложение не подтвердило покупку вовремя. Google Play требует, чтобы вы подтвердили покупку в течение трёх дней после предоставления права, и если вы этого не делаете, Google автоматически возвращает заказ и отзывает товар, помечая отмену кодом voidedReason 8. Это возврат, который вы вызвали ошибкой выставления счетов, а не запросом клиента, поэтому исправление находится в вашем коде обработки покупок, а не в каких-либо переговорах.
- Как далеко назад я могу читать коды причин возврата?
- В Google Play только 30 дней. Voided Purchases API возвращает отмены за последние 30 дней и игнорирует любой startTime старше этого, и измеряет окно по тому, когда Google видит отмену, а не когда была совершена покупка. Код, который вы не захватили в течение 30 дней, потерян, поэтому вам следует подписаться на уведомление об отменённой покупке в реальном времени или опрашивать по расписанию с хорошим запасом внутри окна. revocationReason у Apple остаётся на транзакции при любом запросе.
Источники и дополнительное чтение
- Google Play Developer API: REST Resource purchases.voidedpurchases (voidedReason and voidedSource values)
- Google Play Developer API: Method purchases.voidedpurchases.list (30-day lookback window)
- Google Play: Voided Purchases API overview
- Apple Developer: revocationReason (App Store Server Notifications)
- Apple Developer: Transaction.RevocationReason (StoreKit)
- Apple Developer: Handling refund notifications (revocationDate and revocationReason on REFUND)
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility (August 3, 2026)
- Google Play Billing: Integrate the Google Play Billing Library (acknowledge within three days or auto-refund)
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Несанкционированные встроенные покупки, сделанные детьми, почти всегда возвращаются родителю, а расходы несёте вы
Когда ребёнок покупает набор монет на телефоне родителя, и Apple, и Google возвращают деньги, и никто из них не спрашивает вас заранее. Так это устроили регуляторы. Вот как работают эти возвраты за несанкционированные встроенные покупки в каждом магазине, что за 15-минутное окно, в котором уходят деньги, и во сколько на самом деле обходится одна такая покупка.
Вы никогда не владели app refund tax, поэтому возврат стоит вам вашей доли, а не итога в чеке
Оформите возврат встроенной покупки, и в чеке отобразится возвращаемая цена плюс налог. Этот налог никогда не был вашими деньгами. Apple и Google взимают и перечисляют его как merchant of record, а затем отменяют при возврате, не касаясь вашей доли. Вот что возврат стоит на самом деле и та единственная схема, при которой налог становится вашим.