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

Главное
- Google Play автоматически возвращает деньги покупателю и отзывает покупку, если ваше приложение не подтвердит её в течение трёх дней. Это сбой интеграции, а не решение клиента, и его полностью можно предотвратить на стороне сервера.
- Трёхдневный отсчёт начинается, когда состояние покупки становится PURCHASED, а не когда начинается оформление заказа. Покупка, находящаяся в состоянии PENDING, не запустила отсчёт и не должна пока подтверждаться.
- Требованию удовлетворяют два вызова. И потребление расходуемого товара через purchases.products.consume, и подтверждение нерасходуемого товара или подписки через purchases.products.acknowledge или purchases.subscriptions.acknowledge считаются подтверждением.
- Подтверждения требует только первоначальная покупка подписки. Продления не требуют, и Google автоматически помечает их как ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED.
- Предоплаченные планы короче одной недели должны быть подтверждены в течение половины срока плана, что является более жёстким сроком, чем стандартные три дня.
- Возврат отзывает цену продажи, но вычисления, вызовы API модели, хранилище и выплаты авторам, которые вы уже потратили на доставку продукта, не возвращаются. Деньги, которые вы теряете, больше этой позиции.
- У Apple нет аналога. Незавершённая транзакция StoreKit доставляется повторно, пока вы её не завершите, но Apple никогда не возвращает её автоматически. Этот тип сбоя присущ только Google Play.
Клиент покупает ваш продукт, платёж проходит, и через три дня Google Play тихо возвращает деньги и забирает обратно то, что вы доставили. Никто не просил этого возврата. Клиент его не запрашивал, и ни один агент поддержки его не одобрял. Он сработал, потому что ваш сервер так и не сообщил Google, что покупка обработана. Если вы не подтвердите покупку в Google Play в течение трёх дней, Google возвращает деньги покупателю и отзывает покупку, каждый раз. Это один из немногих возвратов в любом из магазинов, предотвращение которого целиком в вашей интеграции, и один из самых тихих способов утечки дохода.
Это не проблема мошенничества и не спор о политике. Это пропущенный обратный вызов. Исправление небольшое, а цена его пропуска, это реальные деньги, поэтому стоит знать правило точно, почему покупки проскальзывают неподтверждёнными и что на самом деле уносит с собой каждая потерянная продажа.
Что на самом деле говорит правило трёх дней
Документация Google Play Billing прямолинейна на этот счёт. После того как ваше приложение предоставило право и сообщило пользователю об успешной покупке, оно должно уведомить Google, что покупка обработана. Словами Google, это "должно быть сделано в течение трёх дней, чтобы покупка не была автоматически возвращена и право не было отозвано." Страница о разовом товаре повторяет это без смягчения: "Если вы не подтвердите покупку в течение трёх дней, пользователь автоматически получает возврат, а Google Play отзывает покупку." Подписки несут то же самое правило для первоначальной покупки.
Подтверждение, это сигнал, а не формальность. Оно сообщает Google, что право дошло до пользователя. Google трактует отсутствие этого сигнала как доставку, которой никогда не было, и отменяет транзакцию от имени клиента. Со стороны покупателя это выглядит как бесплатный возврат, о котором он никогда не просил. С вашей стороны это выглядит как испарившаяся продажа.
Отсчёт начинается на PURCHASED, а не на оформлении заказа
Трёхдневное окно начинается не тогда, когда пользователь нажимает купить. Оно начинается, когда состояние покупки переходит в PURCHASED. Покупка может сначала находиться в состоянии PENDING, что происходит с наличными платежами, медленными банковскими переводами или когда родитель одобряет запрос ребёнка. Google выражается прямо: "Трёхдневное окно подтверждения начинается только тогда, когда состояние покупки переходит из PENDING в PURCHASED."
Из этого два следствия. Предоставляйте право только когда состояние PURCHASED, никогда на PENDING, иначе вы раздаёте продукт за платёж, который может так и не завершиться. И не подтверждайте покупку в состоянии PENDING тоже. Вы вызываете enablePendingPurchases() при создании BillingClient, ждёте перехода и только тогда запускаете трёхдневный отсчёт подтверждения у себя в голове.
Подтвердить или потребить, и что именно вы должны
Есть два способа удовлетворить требование, и какой вы используете, зависит от продукта. Оба закрывают трёхдневный срок. Разница в том, что ещё они делают.
Для расходуемого товара вы его потребляете. На защищённом бэкенде это purchases.products.consume, или на стороне клиента consumeAsync() в Play Billing Library. Потребление и подтверждает покупку, и делает продукт снова доступным для покупки, что как раз то, что вам нужно для монет, кредитов или разовой генерации. Для нерасходуемого товара или подписки вы её подтверждаете: purchases.products.acknowledge или purchases.subscriptions.acknowledge на бэкенде, или acknowledgePurchase() на стороне клиента. Подтверждение закрывает срок, не освобождая продукт для повторной покупки.
| Тип покупки | Вызов, удовлетворяющий сроку | Что ещё он делает | Срок |
|---|---|---|---|
| Расходуемый | purchases.products.consume или consumeAsync() | Также делает продукт доступным для повторной покупки | 3 дня с PURCHASED |
| Нерасходуемый | purchases.products.acknowledge или acknowledgePurchase() | Помечает право предоставленным, без повторной покупки | 3 дня с PURCHASED |
| Подписка, первоначальная покупка | purchases.subscriptions.acknowledge или acknowledgePurchase() | Подтверждает новую подписку | 3 дня с PURCHASED |
| Продление подписки | Ничего не требуется | Автоматически помечается Google как подтверждённое | Неприменимо |
| Предоплаченный план короче недели | Подтвердить как выше | Подтверждает право | Половина срока плана |
Продления уже обработаны, первоначальные покупки нет
Вы обязаны подтверждением только на первой покупке подписки. Google прямо заявляет, что "вам не нужно подтверждать продления подписки," и сам ставит на продления отметку ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED. Новая покупка приходит как ACKNOWLEDGEMENT_STATE_PENDING и остаётся вашей ответственностью, пока вы её не закроете. Перед подтверждением проверьте acknowledgementState на бэкенде или isAcknowledged() на стороне клиента, чтобы не подтвердить дважды.
У предоплаченных планов фитиль короче
Предоплаченные планы подписок сужают окно. Правило Google: предоплаченные планы длительностью в неделю или дольше должны быть подтверждены в течение трёх дней, но "предоплаченные планы длительностью короче одной недели должны быть подтверждены в течение половины срока плана." Трёхдневный предоплаченный план даёт вам полтора дня, а не три дня. Если вы продаёте короткие предоплаченные пополнения, ваш путь подтверждения должен быть быстрым и управляемым сервером, а не зависеть от повторного открытия приложения пользователем.
Почему покупки вообще остаются неподтверждёнными
Никто не собирается пропускать подтверждение. Оно проскальзывает, потому что код, который подтверждает, находится не в том месте. Распространённый антипаттерн, это клиент, который подтверждает только когда поток покупки возвращается на передний план. Это работает для пользователя, который завершает покупку и продолжает пользоваться приложением. Для всех остальных это не срабатывает.
Разработчики сталкиваются с этим постоянно. Треды в собственном сообществе разработчиков Google каждый раз читаются одинаково, тот или иной вариант "пользователю автоматически вернули деньги после покупки в моём приложении через три дня" и "почему платежи автоматически возвращаются через три дня." Ответ почти всегда один и тот же: вызов подтверждения так и не сработал, потому что приложение так и не оказалось в состоянии его сработать.
Бесплатный пробный период и пользователь, который так и не вернулся
Худший вариант, это бесплатный пробный период или покупка прямо перед тем, как пользователь закрывает приложение навсегда. Если ваше подтверждение зависит от следующего открытия приложения, а следующего открытия нет, покупка устаревает. На третий день Google возвращает деньги и отзывает её. За пробный период, который перешёл бы в платную подписку, вы теряете первое списание, которое так и не собрали, плюс право клиента, которое тихо исчезло. Ни одно из этих событий не проявляется как обращение в поддержку. Оно проявляется как отменённая покупка, которую вам приходится искать.
Во что на самом деле обходится неподтверждённый возврат
Строка возврата преуменьшает потерю. Когда Google отменяет продажу, вы возвращаете цену, и это видимая цифра. Это не весь счёт.
Подумайте о расходуемом товаре, который запускает реальную работу в момент покупки. Пакет генераций изображений, серия вызовов к API поставщика модели, экспорт видео, выплата автору. Вы заплатили за эти вычисления, эти вызовы API, это хранилище и эти выплаты в момент использования. Возврат возвращает клиенту цену продажи. Он не возвращает вам счёт поставщика. Вы доставили реальную стоимость и не получили за неё ничего взамен.
Для подписок и пробных периодов потеря, это первое списание, которое вы так и не собрали, и отношения с клиентом, которые закончились, не начавшись. И начиная с 3 августа 2026 года, Google Play перекладывает цену покупки при возвратном платеже и банковские сборы на разработчиков для заказов, размещённых после этой даты, что делает закрытие любой предотвратимой утечки дохода стоящим сейчас, а не позже. Неподтверждённый возврат, это не возвратный платёж, но это тот же урок: деньги, которые вы уже потратили, не являются автоматически деньгами, которые вы оставляете себе.

Как подтвердить покупку в Google Play на стороне сервера
Надёжный подход убирает приложение из критического пути. Делайте это на своём бэкенде, движимом уведомлениями, а не повторным открытием экрана пользователем.
- Слушайте Real-time developer notifications. Покупка ONE_TIME_PRODUCT или событие SUBSCRIPTION_PURCHASED сообщает вашему серверу о существовании покупки в тот же миг, как о ней узнаёт Google, независимо от того, открыто приложение или нет.
- Проверьте токен покупки через Play Developer API и подтвердите, что состояние PURCHASED, а не PENDING.
- Предоставьте право в собственных записях, привязанное к пользователю.
- Подтвердите или потребите немедленно. Потребляйте расходуемые товары, подтверждайте нерасходуемые и первоначальные подписки. Сначала проверьте acknowledgementState, чтобы никогда не подтвердить дважды.
- Дополняйте и на клиенте тоже. Вызывайте queryPurchasesAsync() в onResume(), чтобы любая покупка, завершившаяся пока приложение было закрыто, всё равно была обработана. Это страховочная сетка, а не основной путь.
Суть в том, что подтверждение срабатывает от события, которое присылает вам Google, а не от действия пользователя, на которое вы не можете рассчитывать. Пользователь, который покупает и никогда не возвращается, полностью прикрыт, потому что ваш сервер действовал в момент поступления покупки.
Сеть сверки для тех, что проскальзывают
Даже чистый конвейер выигрывает от проверки. Voided Purchases API перечисляет покупки, которые были возвращены, отозваны или опротестованы, и называет случай, когда причина в том, что покупка "так и не была подтверждена разработчиком и поэтому может не существовать в записях разработчика." Опрашивайте его, и вы сможете отозвать право, которое предоставили за что-либо, уже отменённое Google. Обратите внимание на ограничение: API возвращает только отменённые покупки за последние 30 дней, поэтому сверка должна выполняться по расписанию, а не раз в квартал.
У Apple нет аналога, и это важно
Это проблема именно Google Play. У StoreKit от Apple тоже есть завершающий шаг, завершение транзакции, но при сбое он делает противоположное. Если вы никогда не завершаете транзакцию StoreKit, Apple держит её в очереди и доставляет повторно при каждом запуске вашего приложения или подключении наблюдателя, так что вы получаете ещё один шанс предоставить право. Apple не возвращает незавершённую транзакцию. В App Store нет трёхдневного автоматического возврата.
Поэтому ментальная модель должна оставаться платформозависимой. В Google Play необработанная покупка, это возврат, который вот-вот произойдёт, и срок, с которым вы гоняетесь наперегонки. В App Store необработанная покупка, это повторная доставка, которая вот-вот произойдёт, и никакого отсчёта вовсе. Перенос допущения Apple на Android, это то, как команды в итоге получают стену неподтверждённых возвратов, которую не могут объяснить.
Именно поэтому RefundHalt подтверждает покупки в Google Play автоматически в тот момент, когда приходит уведомление магазина, и сверяется с Voided Purchases API, чтобы право, предоставленное за покупку, которую Google позже отменил, не оставалось активным. Правило трёх дней перестаёт быть гонкой, которую можно проиграть, и становится шагом, который уже произошёл.
Частые вопросы
- Почему моя покупка в Google Play была автоматически возвращена через три дня?
- Потому что ваше приложение не подтвердило её вовремя. Google Play автоматически возвращает деньги покупателю и отзывает любую покупку, которая не подтверждена в течение трёх дней после достижения состояния PURCHASED. Это не запрос клиента и не штраф Google, это отсутствующий вызов подтверждения, и подтверждение на стороне сервера из уведомления магазина устраняет его.
- В чём разница между подтверждением и потреблением покупки?
- Оба удовлетворяют трёхдневному требованию. Вы потребляете расходуемый товар через purchases.products.consume или consumeAsync(), что также делает продукт снова доступным для покупки. Вы подтверждаете нерасходуемый товар или подписку через purchases.products.acknowledge, purchases.subscriptions.acknowledge или acknowledgePurchase(), что подтверждает право, не освобождая продукт для повторной покупки.
- Нужно ли мне подтверждать продления подписки в Google Play?
- Нет. Подтверждения требует только первоначальная покупка подписки. Google не требует подтверждать продления и помечает их как ACKNOWLEDGEMENT_STATE_ACKNOWLEDGED автоматически. Новая покупка приходит как ACKNOWLEDGEMENT_STATE_PENDING и остаётся вашей ответственностью, пока вы её не закроете.
- Могу ли я подтвердить покупку, пока она ещё в состоянии PENDING?
- Нет. Вам следует подтверждать только когда состояние покупки PURCHASED. Покупка в состоянии PENDING, например наличный платёж или запрос на одобрение родителем, ещё не запустила трёхдневный отсчёт. Предоставляйте право и подтверждайте только после перехода состояния из PENDING в PURCHASED.
- Возвращает ли Apple покупки, которые я не завершаю?
- Нет. StoreKit от Apple доставляет незавершённую транзакцию повторно при каждом запуске вашего приложения, пока вы её не завершите, но никогда не возвращает её автоматически. Трёхдневный автоматический возврат за неподтверждённые покупки присущ только Google Play, поэтому две платформы требуют разной обработки.
- Как мне восстановиться, если покупка уже была возвращена из-за того, что осталась неподтверждённой?
- Вы не можете отменить возврат, но можете сверить. Опрашивайте Voided Purchases API, который перечисляет возвращённые и отозванные покупки за последние 30 дней и отмечает те, что были отменены из-за того, что так и не были подтверждены, затем отзовите предоставленное вами право. В дальнейшем подтверждайте из уведомления магазина, чтобы следующая не проскользнула.
Источники и дополнительное чтение
- Google Play Billing: Process purchases (three-day acknowledgement, acknowledge and consume)
- Google Play Billing: One-time product purchase lifecycle
- Google Play Billing: Subscription purchase lifecycle (initial vs renewal, prepaid plans)
- Google Play Billing: Real-time developer notifications reference
- Google Play Developer API: Voided Purchases
- Apple Developer: Finishing a transaction (StoreKit)
- Google Play Help: Learn about Google Play refund policies
RefundHalt
Автопилот возвратов для App Store и Google Play
Читайте дальше
Серийные злоупотребления возвратами обходятся вам дважды, вот как магазины позволяют дать отпор
Клиент, который снова и снова оформляет возврат, это не случайность. Злоупотребление возвратами стоит вам возвращённых денег плюс тех вычислений, которые вы уже потратили, и оба магазина дают вам сигнал идентичности, appAccountToken от Apple и обфусцированный идентификатор аккаунта от Google, чтобы связать этот паттерн воедино.
Отзыв доступа после возврата средств: шаг, который Apple и Google не делают за вас
И Apple, и Google могут оформить возврат средств, пока клиент сохраняет доступ к покупке. Здесь точно объясняется, когда доступ отзывается автоматически, когда это должен делать ваш сервер, и какое уведомление почти никто не обрабатывает.