Якщо не підтвердити покупку в 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 повертає гроші покупцю й скасовує покупку, щоразу. Це одне з небагатьох повернень у будь-якому з магазинів, якому цілком запобігає саме ваша інтеграція, і один із найтихіших способів втрачати дохід.
Це не проблема шахрайства й не суперечка щодо політики. Це пропущений зворотний виклик. Виправлення невелике, а ціна його пропуску, це реальні гроші, тож варто знати точне правило, чому покупки прослизають без підтвердження і що насправді забирає із собою кожен втрачений продаж.
Що насправді каже правило трьох днів
Документація Play Billing від Google говорить про це прямо. Після того як ваш застосунок надасть право доступу й повідомить користувача, що покупка вдалася, він має сповістити 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 і obfuscated account ID від Google, щоб зв'язати цей патерн докупи.
Скасування доступу після повернення коштів: крок, який Apple і Google не роблять за вас
І Apple, і Google можуть оформити повернення коштів так, що покупка залишиться в клієнта. Тут точно пояснено, коли доступ скасовується автоматично, коли це має зробити ваш сервер, і яке саме сповіщення майже ніхто не обробляє.