У каждого продления свой номер заказа Google Play, и именно его нужно проверить, прежде чем кому-то возвращать деньги
Номер заказа Google Play вида GPA.1234-5678-9012-34567..2 обозначает одно конкретное списание. Разбираем, как читать суффикс продления, находить заказ в Play Console или через Orders API и возвращать то списание, которое имеет в виду клиент, не платя за чужое.

Главное
- Номер заказа Google Play выглядит как GPA.1234-5678-9012-34567, а продления подписки получают суффикс, так что GPA.1234-5678-9012-34567..0 означает первое продление этой подписки.
- Метод getOrderId() из Play Billing Library для продлений подписки возвращает номер исходного заказа, а не собственный номер продления, и возвращает null, пока покупка находится в состоянии PENDING.
- 21 мая 2025 года Google добавил методы get и batchGet в ресурс Orders в Play Developer API. batchGet принимает от 1 до 1000 уникальных номеров заказов, и весь запрос завершается ошибкой, если хотя бы один из них не найден.
- Order из Orders API имеет состояние PENDING, PROCESSED, CANCELED, PENDING_REFUND, PARTIALLY_REFUNDED или REFUNDED, а также поле developerRevenueInBuyerCurrency, то есть выручку за вычетом частичных возвратов, налогов и комиссий.
- Метод orders.refund в Google Play не может вернуть деньги за заказы старше 3 лет, а параметр revoke=true сразу лишает клиента доступа к подписке или товару.
- В Play Console вариант «Вернуть деньги и отозвать доступ» (Refund and revoke) применяется к самому последнему заказу в подписке, а «Только вернуть деньги» (Refund only) применяется к более старому заказу и оставляет подписку активной.
- Запросы на возврат в течение 48 часов после покупки Google Play обрабатывает сам. После 48 часов он направляет клиентов к разработчику, и именно тогда номер заказа обычно попадает в вашу почту поддержки.
Прежде чем возвращать деньги клиенту Google Play, посмотрите на конец номера заказа. GPA.1234-5678-9012-34567 это первое списание по подписке. GPA.1234-5678-9012-34567..2 это третье. У них общая основа, но это разные платежи, и Play Console обрабатывает их по-разному при возврате. Номер заказа Google Play это единственный идентификатор, который видит клиент, поэтому именно он оказывается в вашей почте поддержки. Прочитайте его правильно, и вы вернете деньги именно за то списание, которым клиент недоволен, и ровно один раз.
Что сообщает номер заказа Google Play
Документация Play Billing Library от Google описывает формат на примере. Номер заказа начинается с GPA, за которым идут группы цифр. Для подписок каждое продление получает базовый номер заказа плюс две точки и счетчик, начинающийся с нуля. Значит, у исходной покупки суффикса нет, первое продление это ..0, второе ..1 и так далее.
Поэтому по суффиксу сразу видно, как долго человек платит. Клиент, который пишет о GPA.3333-4137-0319-36762..11, продлевался двенадцать раз. Клиент, называющий только базовый номер, либо совершил разовую покупку, либо говорит о самом первом платеже.
| Номер заказа | Что это |
|---|---|
| GPA.1234-5678-9012-34567 | Разовая покупка или первое списание по подписке |
| GPA.1234-5678-9012-34567..0 | Первое продление этой подписки |
| GPA.1234-5678-9012-34567..1 | Второе продление |
| null в Billing Library | Покупка еще в состоянии PENDING, до того как Google обработает платеж |
Где появляется номер заказа и какую его версию вы получаете
Здесь команды чаще всего и ошибаются. Разные источники дают разные формы одного и того же номера.
- Чек Google Play у клиента показывает номер заказа того списания, к которому он относится, включая продления.
- В приложении Purchase.getOrderId() из Play Billing Library для продлений подписки возвращает номер исходного заказа. Пример самого Google: вместо GPA.1234-5678-9012-34567..0 вы получаете GPA.1234-5678-9012-34567.
- На сервере purchases.subscriptionsv2 отдает для каждой позиции latestSuccessfulOrderId, номер последнего успешного заказа по этому товару. Google добавил это поле 21 мая 2025 года.
- В Voided Purchases API orderId однозначно определяет разовую покупку, покупку подписки или продление подписки. Документация Google рекомендует различать продления по orderId, а не по токену покупки.
Для чего тогда нужен токен покупки
Токен покупки (purchaseToken) идентифицирует покупку целиком. У подписки один токен охватывает исходное списание и все последующие продления. Поэтому он подходит как ключ для прав доступа и не подходит для возврата. Возвраты и чарджбэки касаются одного списания, а одно списание обозначает только номер заказа.
Как найти заказ Google Play
В Play Console
Раздел «Управление заказами» (Order management) принимает в строке поиска номер заказа или полный адрес электронной почты клиента. У каждого заказа один из статусов: «Обработан» (Processed), «Отменен» (Cancelled), «Ожидает» (Pending), «Ожидает возврата» (Pending refund), «Возвращен» (Refunded), «Ожидает частичного возврата» (Pending partial refund) или «Частично возвращен» (Partially refunded). Если клиент прислал адрес почты вместо чека, ищите по почте, выберите списание по дате и проверьте суффикс, прежде чем что-то делать.
Через Orders API
С 21 мая 2025 года ресурс Orders в Google Play Developer API предоставляет orders.get для одного заказа и orders.batchget для списка. На практике важны несколько ограничений:
- batchget принимает от 1 до 1000 номеров заказов за запрос, и они должны быть уникальными.
- Если хотя бы один номер заказа не найден или не относится к пакету, весь запрос batchget завершается ошибкой.
- Вызовы Orders API расходуют квоту Play Developer API, которая по умолчанию составляет 200 000 вызовов в день.
Самое полезное это возвращаемый Order. В нем есть состояние заказа, его purchaseToken, createTime и lastEventTime, общая сумма и налог, salesChannel, например IN_APP или PLAY_STORE, а также orderHistory с событиями обработки, отмены, возврата и частичного возврата. Еще там есть developerRevenueInBuyerCurrency, который Google определяет как вашу выручку в валюте покупателя за вычетом частичных возвратов, налогов и комиссий. Когда продавцом (merchant of record) выступает Google, в адресе покупателя указана только страна.
| Состояние заказа | Что говорит справочник Google |
|---|---|
| PENDING | Создан и ожидает обработки |
| PROCESSED | Успешно обработан |
| CANCELED | Отменен до обработки |
| PENDING_REFUND | Запрошенный возврат ожидает обработки |
| PARTIALLY_REFUNDED | Возвращена часть суммы заказа |
| REFUNDED | Возвращена полная сумма заказа |
Возврат за правильный заказ
Когда вы поняли, какое списание имеет в виду клиент, Play Console предлагает выбор, который зависит от того, где этот заказ находится в подписке.
| Вариант | Применяется к | Что происходит |
|---|---|---|
| Вернуть деньги и отозвать доступ (Refund and revoke) | Самому последнему заказу в подписке | Возврат оформлен, подписка сразу удалена, будущие продления отменены |
| Только вернуть деньги (Refund only) | Более старому заказу в подписке | Возврат оформлен, подписка остается активной |
| Частичный возврат (Partial refund) | Покупкам в приложении и подпискам, оформленным после марта 2018 года, но не платным приложениям | Любой процент меньше 100% или сумма без налога меньше итога заказа |
| Отменить подписку (Cancel subscription) | Активной подписке | Без возврата, доступ сохраняется до конца текущего расчетного периода |
Через API метод orders.refund принимает имя пакета и номер заказа. Заказы старше 3 лет вернуть нельзя. Необязательный параметр revoke со значением true сразу прекращает доступ к подписке или товару в приложении. В справке Google также отмечено, что оформленный возврат нельзя отменить, поэтому переданный номер заказа окончателен.
Почему у подписчика появляется заказ на 0,00 $?
Это объясняется в документации Google о жизненном цикле подписки. Когда пользователь снова оформляет в вашем приложении тот же базовый план до истечения подписки, Google Play создает заказ на 0,00 $. Деньги не списываются, потому что текущий период уже оплачен, а обычные списания возобновляются в исходную дату продления. Это не бесплатный пробный период и не акция. Возвращать по такому заказу нечего. Если клиент хочет вернуть деньги, найдите оплаченный заказ перед ним.
Во что обходится возврат за не тот заказ
Возврат возвращает цену. Частичные возвраты работают так же, пропорционально. Пример Google: частичный возврат 50% забирает и 50% вашей выплаты, и 50% сервисной комиссии. Не возвращается все, что вы потратили на обслуживание этого клиента: вычисления, вызовы сторонних API, хранение, партнерские выплаты. Вернете деньги не за тот заказ, и заплатите за это дважды.
Вот как это происходит. Клиент с месячным планом пишет о списании ..4, том, что было на прошлой неделе. Кто-то из команды ищет по почте, видит первый заказ вверху списка и нажимает «Только вернуть деньги» на базовом заказе многомесячной давности. Теперь клиент получил деньги за период, которым пользовался. Списание, на которое он жаловался, осталось нетронутым, и подписка продолжает продлеваться. Он по-прежнему может попросить банк отменить списание прошлой недели.

Путь через банк теперь самый дорогой. Для заказов, оформленных после 3 августа 2026 года, Google указывает, что при удовлетворении чарджбэка разработчик отвечает за цену покупки за вычетом сервисной комиссии Play, плюс комиссии за чарджбэк, которые берет банк. Чарджбэки в банке окончательны. Один неверно прочитанный суффикс может обернуться потерей суммы двух возвратов, плюс комиссии.
Какие возвраты до вашей почты не доходят
Большинству возвратов в Google Play не нужны ни вы, ни номер заказа. Политика возвратов Google гласит, что клиент может получить возврат через Google Play в течение 48 часов после покупки, а после 48 часов должен обращаться к разработчику. Google также возвращает деньги и отзывает подписки, которые вы не подтвердили в течение трех дней. Об этом вы узнаете постфактум из Voided Purchases API, который сообщает voidedSource (0 для User, 1 для Developer, 2 для Google) и voidedReason, например Remorse, Chargeback или Unacknowledged_purchase.
Только один сценарий возврата в Google Play спрашивает вашу позицию. Когда чарджбэк требует проверки разработчиком, у вас есть 24 часа, чтобы ответить через orders.reviewrefund с предпочтением APPROVE, DECLINE или NEUTRAL и доказательствами использования покупки. RefundHalt отвечает на такую проверку за вас в пределах срока, используя данные об использовании, которые у вас уже есть, так что спорный заказ получает ваши доказательства, а не молчание.
Короткий чек-лист для обращений с номером заказа
- Попросите полный номер заказа из чека Google Play, вместе с суффиксом.
- Найдите его в Play Console или через orders.get и сначала проверьте состояние.
- Убедитесь, что дата списания совпадает с тем, что описывает клиент.
- Используйте «Вернуть деньги и отозвать доступ» только для самого последнего заказа, а «Только вернуть деньги» для более старых.
- Запишите номер заказа, за который вернули деньги, чтобы последующий чарджбэк по другому заказу было легко заметить.
Частые вопросы
- Что означает ..0 в конце номера заказа Google Play?
- Это первое продление подписки. Google Play присваивает каждому продлению базовый номер заказа подписки плюс две точки и счетчик, начинающийся с нуля, поэтому GPA.1234-5678-9012-34567..0 это первое продление, а ..1 второе. Базовый номер без суффикса обозначает исходное списание.
- Почему getOrderId() в моем приложении возвращает не тот номер заказа, что в чеке клиента?
- Потому что Play Billing Library для продлений подписки возвращает номер исходного заказа. Пример Google: вместо GPA.1234-5678-9012-34567..0 для первого продления getOrderId() возвращает GPA.1234-5678-9012-34567. Чтобы получить собственный номер продления, используйте на сервере latestSuccessfulOrderId из purchases.subscriptionsv2.
- Как найти заказ Google Play по номеру заказа?
- Найдите его в разделе «Управление заказами» в Play Console, который принимает номер заказа или полный адрес почты клиента, либо вызовите orders.get в Google Play Developer API. orders.batchget ищет от 1 до 1000 уникальных номеров заказов за раз, и весь запрос завершается ошибкой, если хотя бы один из них не найден.
- Можно ли вернуть деньги за заказ Google Play старше года?
- Да, в пределах 3 лет. Справочник Google по orders.refund говорит, что заказы старше 3 лет вернуть нельзя. Для более старого заказа в подписке вариант «Только вернуть деньги» в Play Console возвращает деньги и оставляет подписку активной.
- Почему у подписчика есть заказ Google Play на 0,00 $?
- Он появляется, когда пользователь снова оформляет в вашем приложении тот же базовый план до истечения подписки. С пользователя ничего не списывается, потому что текущий период уже оплачен, а обычные списания возобновляются в исходную дату продления. По словам Google, это не означает, что был предоставлен бесплатный пробный период или акционная скидка.
Источники и дополнительное чтение
- Android Developers: Purchase (Play Billing Library), getOrderId
- Google Play Developer API: REST Resource orders
- Google Play Developer API: orders.batchget
- Google Play Developer API: orders.refund
- Google Play Developer API release notes
- Google Play Developer API: purchases.voidedpurchases
- Play Console Help: Issue refunds or cancel orders
- Google Play Billing: Subscription lifecycle
- Google Play Help: Apps, games and in-app purchases refund policies
- Google 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, что подписывает каждый магазин и во что обходится поддельный или ошибочно отклоненный возврат.