Все статьи
Руководство8 мин чтения

У каждого продления свой номер заказа Google Play, и именно его нужно проверить, прежде чем кому-то возвращать деньги

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

Разработчик за столом сверяет чек из письма на Android-телефоне со списком заказов на ноутбуке, сопоставляя номер заказа Google Play с нужным списанием

Главное

  • Номер заказа 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, том, что было на прошлой неделе. Кто-то из команды ищет по почте, видит первый заказ вверху списка и нажимает «Только вернуть деньги» на базовом заказе многомесячной давности. Теперь клиент получил деньги за период, которым пользовался. Списание, на которое он жаловался, осталось нетронутым, и подписка продолжает продлеваться. Он по-прежнему может попросить банк отменить списание прошлой недели.

Руки держат Android-телефон над распечатанной банковской выпиской и ручкой, момент, когда клиент сопоставляет списание с номером заказа Google Play

Путь через банк теперь самый дорогой. Для заказов, оформленных после 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, это не означает, что был предоставлен бесплатный пробный период или акционная скидка.

Источники и дополнительное чтение

RefundHalt

Автопилот возвратов для App Store и Google Play

Читайте дальше

Руководство8 мин чтения

Чрезмерные запросы на возврат обходятся дороже самих возвратов: оба магазина приложений считают их сигналом качества

Правило 5.6.4 Apple прямо называет чрезмерные запросы на возврат признаком того, что приложение не соответствует стандартам качества, а соглашение Google о распространении позволяет удалять приложения новых разработчиков по доле возвратов. Разбираем, что пишет каждый магазин, во что обходится удаление и как не попасть под удар.

Подробный разбор8 мин чтения

Проверяйте серверные уведомления App Store, прежде чем реагировать на возврат, ведь отправить запрос на ваш URL вебхука может кто угодно

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

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

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