Сповіщення про анульовану покупку дозволяє вашому серверу Google Play відкликати доступ у ту саму мить, коли надходить повернення коштів
Google Play може надіслати вашому серверу сповіщення про анульовану покупку в ту мить, коли покупку повертають, оскаржують через чарджбек або анулюють. Воно містить purchaseToken, orderId, productType та refundType і означає одне, відкликати доступ. Ось як його читати та підключити.

Головне
- Сповіщення про анульовану покупку це Real-time Developer Notification, яке Google Play надсилає до вашого топіка Cloud Pub/Sub у мить, коли покупку повертають, оскаржують через чарджбек або анулюють іншим чином. Це push-сигнал, а не те, що доводиться опитувати.
- Сповіщення містить рівно чотири поля: `purchaseToken`, `orderId`, `productType` та `refundType`. Цього достатньо, щоб знайти саме ту покупку у вашій базі даних і відкликати прив'язаний до неї доступ.
- `productType` дорівнює `1` для анульованої підписки та `2` для анульованої разової покупки. `refundType` дорівнює `1` для повного повернення та `2` для часткового повернення за кількістю, яке застосовується лише до разових покупок із кількома одиницями.
- Сповіщення про анульовану покупку означає, що клієнт уже отримав свої гроші назад. Власна рекомендація Google це відкликати доступ до пов'язаного контенту, оскільки покупець більше не повинен володіти доступом.
- Сповіщення про анульовані покупки вимкнені, доки ви їх не увімкнете. У Play Console в розділі Monetization setup ви обираєте або підписки разом з усіма анульованими покупками, або те саме плюс події разових продуктів. Обидва варіанти включають анульовані покупки.
- Сповіщення про анульовану покупку не є одним із двох процесів повернення, які просять у вас докази. Це повідомлення постфактум. Єдині процеси, що приймають ваш внесок, це CONSUMPTION_REQUEST від Apple з вікном у 12 годин та розгляд чарджбеку в Google Play через orders.reviewrefund з вікном у 24 години.
- Починаючи з August 3, 2026, Google перекладає на розробника ціну покупки плюс банківську комісію за чарджбек. Сповіщення про анульовану покупку часто є першим способом, у який ваш сервер дізнається, що анулювання через чарджбек відбулося, тож його підключення дає вам змогу припинити обслуговувати клієнта, за якого вам більше не платять.
Повернення коштів у Google Play не мусить бути тим, що ви виявляєте пізніше у звіті. Google Play може надіслати вашому серверу сповіщення про анульовану покупку в мить, коли покупку анулюють, незалежно від того, чи оформив покупець самостійне повернення, чи його надав агент підтримки, чи банк примусово провів чарджбек, чи ви самі повернули кошти за замовлення з увімкненим прапорцем відкликання. Повідомлення крихітне, воно називає саме ту покупку і несе одну вказівку, поверніть доступ, бо гроші вже пішли.
Що насправді таке сповіщення про анульовану покупку
Сповіщення про анульовану покупку це один із типів Real-time Developer Notifications, або RTDN, від Google Play. RTDN це push-канал. Google публікує повідомлення в топік Cloud Pub/Sub, яким ви володієте, і ваш бекенд отримує його за мить після події, а не дізнається про неї під час наступного запланованого опитування. У цьому й весь сенс сповіщення про анульовану покупку порівняно зі старим шляхом опитування: ви дізнаєтеся про повернення, коли воно відбувається, а не за кілька годин.
Шлях опитування досі існує і досі має значення. Voided Purchases API дозволяє вашому серверу за власним графіком запитувати список покупок, анульованих у певному діапазоні часу. Ці два підходи доповнюють один одного. Сповіщення повідомляє вас у мить, коли одна покупка змінює статус; API дозволяє звіряти дані масово та заповнювати все, що пропущене повідомлення залишило б поза увагою.
Воно передається всередині Real-time Developer Notification
Сповіщення про анульовану покупку ніколи не надходить саме собою. Воно міститься всередині обгортки DeveloperNotification, і ця обгортка доставляється як єдиний рядок у кодуванні base64 у полі data повідомлення Pub/Sub. Ваш обробник декодує цей рядок у JSON, перш ніж зможе щось прочитати. Обгортка завжди називає застосунок і час події та містить рівно один об'єкт сповіщення з п'яти, які визначає Google. Вони взаємовиключні, тож повідомлення, що несе voidedPurchaseNotification, не нестиме також події підписки чи разової покупки.
| Поле обгортки | Що воно містить |
|---|---|
version | Версія схеми сповіщення, наприклад 1.0 |
packageName | Застосунок, якому належить подія, наприклад com.acme.app |
eventTimeMillis | Коли сталася подія, у мілісекундах від epoch |
| Один із п'яти об'єктів сповіщення | oneTimeProductNotification, subscriptionNotification, voidedPurchaseNotification, pendingRefundReviewNotification або testNotification. У кожному повідомленні присутній лише один |
Чотири поля, які воно несе
Зніміть обгортку, і саме сповіщення про анульовану покупку це чотири поля. Це навмисно скупо. Позиція Google така: якщо все, що вам потрібно, це знайти правильну покупку та скоригувати доступ, цих чотирьох достатньо, і вам не доведеться звертатися до жодного API, щоб діяти.
| Поле | Що це | Як ви його використовуєте |
|---|---|---|
purchaseToken | Токен, переданий пристрою в момент купівлі товару | Ваш первинний ключ. Зіставте його із записом про покупку, який ви зберегли під час надання доступу |
orderId | Ідентифікатор замовлення, показаний покупцеві, наприклад GS.0000-0000-0000 | Читабельний для людини другий ключ для підтримки та звірки |
productType | Чи був анульований товар підпискою, чи разовою покупкою | Спрямовує до правильного шляху відкликання |
refundType | Чи було анулювання повним поверненням, чи частковим за кількістю | Вирішує, відкликати все чи лише повернуту кількість |
productType повідомляє, що було анульовано
productType це невелике ціле число, і воно вирішує, який із ваших шляхів відкликання обрати. Анулювання підписки має згорнути тривалий доступ; анулювання разової покупки просто прибирає один окремий доступ.
| Значення `productType` | Константа | Значення |
|---|---|---|
1 | PRODUCT_TYPE_SUBSCRIPTION | Було анульовано покупку підписки |
2 | PRODUCT_TYPE_ONE_TIME | Було анульовано разову покупку |
refundType повідомляє, скільки повернулося
refundType відрізняє чисте повне повернення від часткового. Частковий випадок вузький. Він з'являється лише тоді, коли для разової покупки з кількома одиницями повернули частину, але не всю кількість.
| Значення `refundType` | Константа | Значення |
|---|---|---|
1 | REFUND_TYPE_FULL_REFUND | Покупку анульовано повністю |
2 | REFUND_TYPE_QUANTITY_BASED_PARTIAL_REFUND | Частину покупки з кількома одиницями анульовано |
Спершу увімкніть його, інакше воно ніколи не надійде
Сповіщення про анульовані покупки не надходять за замовчуванням. Ви один раз вмикаєте RTDN у Play Console і спрямовуєте його на топік Pub/Sub, який ви контролюєте. Перемикач розташований у розділі Monetize, далі Monetization setup, у секції Real-time developer notifications вгорі сторінки. Позначте Enable real-time notifications, потім вставте повну назву топіка у форматі projects/{project_id}/topics/{topic_name} і скористайтеся Send Test Message, щоб переконатися, що канал працює, перш ніж йому довіряти.
Перемикач вмісту це місце, де люди пропускають анульовані покупки. Обидва варіанти їх включають, тож ви не можете випадково відмовитися від повернень, зберігши підписки.
- Отримувати сповіщення про підписки та всі анульовані покупки. Ви отримуєте події підписок і кожну анульовану покупку, але не події купівлі разових продуктів.
- Отримувати всі сповіщення про підписки та разові продукти. Ви отримуєте зазначене вище плюс події разових продуктів, як-от
ONE_TIME_PRODUCT_PURCHASEDтаONE_TIME_PRODUCT_CANCELED.

Чого це коштує вам, у грошах
Анулювання це збиток, який уже зафіксовано на момент, коли сповіщення сягає вас. Ціна продажу зникла, як і все, що ви витратили на обслуговування цього клієнта. Якщо він генерував зображення, робив виклики до ваших моделей, споживав сховище чи спричинив виплату третій стороні, ці витрати були оплачені реальними грошима і не повертаються разом із поверненням. Сповіщення не може відновити нічого з цього. Що воно може зробити, це зупинити кровотечу відтепер, і саме в цьому вся причина діяти швидко.
Кровотеча найгірша на підписках і найгірша на чарджбеках. Підписка, яку ви не відкликали, продовжує коштувати вам на обслуговування, місяць за місяцем, для клієнта, який більше не платить. А чарджбек це найдорожчий вид анулювання. Починаючи з August 3, 2026, документація Google зазначає, що чарджбек перекладає на розробника ціну покупки плюс банківську комісію. Сповіщення про анульовану покупку часто є першим місцем, де ваші власні системи чують, що чарджбек завершився, тож обробник, який відкликає доступ на місці, це те, що не дає втраченому продажу перетворитися на втрачений продаж плюс тижні безкоштовного обслуговування.
Як обробити сповіщення про анульовану покупку, крок за кроком
Перевірте повідомлення та усуньте дублікати
- Підтвердьте, що повідомлення Pub/Sub надійшло від Google і спрямоване на топік, який ви налаштували, потім декодуйте поле
dataу base64, щоб отримати JSONDeveloperNotification. - Використовуйте
messageIdз Pub/Sub, щоб відкидати дублікати. Google попереджає, що те саме сповіщення може бути доставлене більш ніж один раз, тож сприймайте повтор як норму і зробіть свій обробник ідемпотентним. - Підтверджуйте повідомлення лише після того, як безпечно його зафіксували, щоб збій посеред роботи обробника не втратив подію.
Знайдіть покупку
- Зіставте
purchaseTokenіз покупкою, яку ви зберегли, коли вперше надали доступ. ВикористовуйтеorderIdяк запасний варіант для пошуку підтримкою та ручної звірки. - Прочитайте
productType, щоб обрати шлях відкликання для підписки чи разової покупки, і прочитайтеrefundType, щоб вирішити між повним відкликанням і частковим.
Відкличте та зафіксуйте
- Приберіть доступ. Для повного повернення відріжте доступ до товару. Для часткового повернення за кількістю зменшіть надану кількість на суму повернення, а решту залиште недоторканою.
- Запишіть, що ви зробили і коли, за ключами
purchaseTokenтаorderId. Саме цей запис дає вам змогу пізніше відповісти на звернення до підтримки і дозволяє Voided Purchases API чисто звірятися з вашим власним станом.
Де воно стоїть серед інших сигналів про повернення
Сповіщення про анульовану покупку це повідомлення, а не перемовини. Воно повідомляє вам про наслідок, який уже вирішено. Варто розглянути його поряд із сигналами, які з ним легко сплутати, адже лише деякі з них взагалі запитують вашу версію подій.
| Сигнал | Напрямок | Чи приймає він ваш внесок |
|---|---|---|
| Сповіщення про анульовану покупку (RTDN) | Google надсилає на ваш сервер | Ні. Воно повідомляє про анулювання, яке вже сталося |
| Voided Purchases API | Ваш сервер запитує в Google | Ні. Це список минулих анулювань лише для читання |
pendingRefundReviewNotification (RTDN) | Google надсилає на ваш сервер | Так, опосередковано. Воно позначає чарджбек, який ви потім оскаржуєте через orders.reviewrefund протягом 24 годин |
| Apple CONSUMPTION_REQUEST | Apple запитує ваш сервер | Так. Ви відповідаєте через Send Consumption Information протягом 12 годин |
Головна думка проста. В обох магазинах є рівно два процеси повернення, де розробник має право голосу, це CONSUMPTION_REQUEST від Apple та розгляд чарджбеку в Google Play. Сповіщення про анульовану покупку не є жодним із них. На момент, коли воно сягає вас, рішення вже позаду, і єдине, що лишається у ваших руках, це те, наскільки швидко ви відкликаєте доступ.
Поширені запитання
- Що означає сповіщення про анульовану покупку в Google Play?
- Це означає, що покупку повернули, оскаржили через чарджбек або анулювали іншим чином, і клієнт отримав свої гроші назад. Рекомендація Google це відкликати доступ до пов'язаного контенту, оскільки покупець більше не повинен володіти доступом. Сповіщення називає саме ту покупку через її `purchaseToken` та `orderId`.
- Які поля містить сповіщення Google Play про анульовану покупку?
- Чотири: `purchaseToken`, `orderId`, `productType` та `refundType`. `productType` дорівнює `1` для підписки та `2` для разової покупки. `refundType` дорівнює `1` для повного повернення та `2` для часткового повернення за кількістю в покупці з кількома одиницями.
- Як увімкнути сповіщення про анульовані покупки?
- У Play Console відкрийте Monetize, потім Monetization setup, і в секції Real-time developer notifications позначте Enable real-time notifications, потім введіть назву вашого топіка Cloud Pub/Sub. Обидва варіанти вмісту, підписки разом з усіма анульованими покупками та те саме плюс події разових продуктів, включають анульовані покупки.
- У чому різниця між сповіщенням про анульовану покупку та Voided Purchases API?
- Сповіщення це push-сигнал, доставлений у реальному часі через Cloud Pub/Sub у мить, коли покупку анулюють. Voided Purchases API це шлях опитування, який ваш сервер запитує за власним графіком, щоб перелічити анулювання за певний діапазон часу. Використовуйте сповіщення, щоб реагувати миттєво, а API, щоб звіряти та заповнювати прогалини.
- Чи дозволяє сповіщення про анульовану покупку оскаржити повернення?
- Ні. Це повідомлення постфактум про рішення, яке вже ухвалене. Єдиний процес Google Play, що приймає ваш внесок, це розгляд чарджбеку через `orders.reviewrefund`, на який ви маєте 24 години для відповіді, а в Apple це CONSUMPTION_REQUEST з вікном у 12 годин.
Джерела та додаткове читання
- Android Developers: Real-time developer notifications reference guide
- Google Play Developer API: Voided Purchases API
- Google Play Developer API: REST Resource purchases.voidedpurchases
- Android Developers: Purchase lifecycle and RTDNs
- Google Play Console Help: refund protection and chargeback cost responsibility
- Google Play Developer API: Method orders.reviewrefund
RefundHalt
Автопілот повернень для App Store і Google Play
Читайте далі
Ви можете самостійно повернути кошти за замовлення Google Play, і зробивши це до зворотного платежу, ви заощаджуєте банківську комісію
Ви можете повернути кошти за будь-яке замовлення Google Play, молодше за three years, одним викликом API, з відкликанням доступу або без нього. Зробивши це самостійно, перш ніж суперечка перетвориться на зворотний платіж, ви заощаджуєте банківську комісію, яка з August 3, 2026 лягає на розробників. Ось як працює orders.refund.
Apple Send Consumption Information тепер запитує п'ять полів, а не дванадцять, і ось кожне з них
Коли клієнт просить Apple про повернення коштів, корисне навантаження Send Consumption Information це ваша відповідь. Apple скоротило його з дванадцяти полів до п'яти, три обов'язкові та два необов'язкові. Ось кожне поле, значення, які приймає кожне з них, і 12-годинне вікно, протягом якого ви його надсилаєте.