Прочитайте код причини повернення коштів, який ваш сервер уже отримує, і він підкаже, чи виправляти застосунок, чи боротися з клієнтом
Кожне повернення коштів, яке Apple та Google надсилають на ваш сервер, несе код причини. Google Play проставляє одну з дев'яти причин і джерело на кожному анулюванні, а Apple позначає, чи звинувачує повернення ваш застосунок. Ось що означає кожен код, як розсортувати їх на виправити, боротися чи прийняти, і скільки вони коштують у грошах.

Головне
- Кожне повернення коштів, яке Apple чи Google надсилає на ваш сервер, несе код причини повернення, і це єдина частина повернення, яку ви можете прочитати після того, як гроші вже пішли. Він каже, чому сталося повернення, а це каже, що робити далі.
- Voided Purchases API від Google Play проставляє два числа на кожному анулюванні: voidedReason від 0 до 8 (інше, передумав, не отримано, дефект, випадкова покупка, шахрайство, дружнє шахрайство, зворотний платіж, непідтверджена покупка) і voidedSource: 0 користувач, 1 розробник або 2 Google.
- Apple дає вужчий, але чіткий сигнал. На поверненій транзакції revocationReason дорівнює 1, коли App Store повернув кошти через реальну чи уявну проблему всередині вашого застосунку, і 0, коли повернення сталося з іншої причини, наприклад через випадкову покупку.
- Коди сортуються на три купи. Дефект, не отримано, непідтверджена і код Apple про проблему в застосунку вказують на ваш продукт, тож ви їх виправляєте. Шахрайство, дружнє шахрайство і зворотний платіж, це спори, які ви оскаржуєте або яким запобігаєте. Передумав і випадкова покупка ніколи не були вашими, щоб їх зупинити.
- voidedReason 8, непідтверджена покупка, це повернення, яке ви виставили самі собі. Google автоматично повертає кошти й анулює будь-яку покупку, яку ваш застосунок не підтвердив протягом трьох днів, і цей код, це те, як ви знаходите цю помилку у власній інтеграції.
- voidedReason 7, зворотний платіж, це дорогий код. Для замовлень Google Play, зроблених August 3, 2026 або пізніше, програний зворотний платіж коштує розробнику ціну покупки за вирахуванням комісії Play плюс банківську комісію за зворотний платіж, тож підрахунок ваших анулювань із кодом зворотного платежу, це підрахунок реальних додаткових витрат.
- Voided Purchases API дивиться назад лише на 30 днів і фільтрує за тим, коли Google бачить анулювання, а не коли сталася покупка, тож код причини, який ви не захопили в цьому вікні, це код причини, який ви втрачаєте назавжди.
Коли Apple чи Google повертає кошти одному з ваших клієнтів, гроші зазвичай зникають ще до того, як ви отримаєте право голосу. Те, що потрапляє на ваш сервер після цього, виглядає як квитанція, і більшість команд ставляться до цього саме так. Це більше, ніж квитанція. Кожне повернення несе код причини повернення, і це єдина частина повернення, яку ви ще можете прочитати після того, як рішення ухвалене. Google Play каже вам, що повернення було зворотним платежем, чи проханням через передумав, чи покупкою, яку ваш власний застосунок так і не підтвердив. Apple каже вам, чи звинувачувало повернення щось усередині вашого застосунку. Прочитайте цей код, і повернення перестає бути рядком у звіті й стає інструкцією: виправ це, борися з цим або відпусти це. Ось що означає кожен код, як їх сортувати і скільки кожен коштує.
Що насправді таке код причини повернення
Код причини повернення, це власна позначка магазину про те, чому покупку скасували. Ви його не задаєте і не можете з ним сперечатися. Він надходить прикріпленим до повернення постфактум, і два магазини розкривають його в різних формах і з дуже різним способом вирішення.
Google Play проставляє причину та джерело на кожному анулюванні
Voided Purchases API від Google Play повертає один запис на кожну скасовану покупку, і кожен запис несе два цілих числа, які мають значення. voidedReason каже, чому покупку анулювали. voidedSource каже, хто це запустив. Разом вони перетворюють голе повернення на речення: це замовлення анулювали через зворотний платіж, ініційований Google, або анулювали як передумав, ініційований користувачем. Ви читаєте їх, опитуючи API або підписавшись на сповіщення розробника в реальному часі, яке спрацьовує, коли надходить анулювання. У будь-якому разі ці два числа, це payload, який варто зберегти.
Apple дає вужчий сигнал, але чіткий
Apple не дає вам причину з дев'ятьма варіантами. На поверненій транзакції Apple встановлює revocationReason в одне з двох значень. 1 означає, що App Store повернув кошти за транзакцію через реальну чи уявну проблему всередині вашого застосунку. 0 означає, що повернення сталося з іншої причини, наприклад через випадкову покупку. Поле з'являється лише на транзакціях, які повернули або анулювали, поряд із revocationDate, усередині підписаної інформації про транзакцію в REFUND App Store Server Notification. Два значення, це небагато, але те, що має значення, 1, це Apple каже вам, що повернення стосувалося вашого продукту, а не сумнівів клієнта.
Дев'ять причин, які дає вам Google Play
voidedReason від Google, багатший із двох, і кожне значення варто знати з першого погляду, бо кожне вказує кудись інде. Ось повний набір, прямо з ресурсу VoidedPurchase, із тим, що кожен код насправді каже вам робити.
| voidedReason | Позначка Google | Що каже вам код |
|---|---|---|
| 0 | Інше | Конкретна причина не зафіксована. Складіть у купу й стежте за обсягом, а не за окремим випадком. |
| 1 | Передумав | Клієнт передумав. Із вашим застосунком нічого не було не так. |
| 2 | Не отримано | Клієнт каже, що так і не отримав те, за що заплатив. Проблема з доставкою, яку треба перевірити. |
| 3 | Дефект | Покупка не працювала. Помилка продукту і найдієвіший код у цьому списку. |
| 4 | Випадкова покупка | Промах або ненавмисна покупка. Розгляньте чіткіший крок підтвердження. |
| 5 | Шахрайство | Google позначив транзакцію як шахрайську. Не ваш клієнт і не ваш дохід, щоб його лишати. |
| 6 | Дружнє шахрайство | Покупець оскаржив платіж, який сам зробив і отримав. Докази ще можуть це зачепити. |
| 7 | Зворотний платіж | Банк скасував платіж. Найдорожчий шлях, тепер із доданою комісією. |
| 8 | Непідтверджена покупка | Ваш застосунок так і не підтвердив покупку, тож Google повернув кошти автоматично. Помилка у вашому коді. |
voidedSource каже вам, хто натиснув на курок
Поряд із причиною стоїть voidedSource, і він відповідає на інше питання: хто скасував це. 0 означає, що це зробив користувач, через самообслуговування або банк. 1 означає, що це зробив розробник, тобто ви чи ваш власний інструментарій, оформивши повернення. 2 означає, що це зробив Google, на власний розсуд, включно з автоматичним поверненням за непідтверджену покупку. Коли ви бачите сплеск анулювань, джерело, це перший зріз. Стіна з source 2, це Google, який діє з вашим обліковим записом, і це зазвичай сигнал, що вказує назад на вашу інтеграцію, а не на ваших клієнтів.
Розсортуйте кожне повернення на виправити, боротися чи прийняти
Причина, чому код корисний, у тому, що він каже, якої з трьох реакцій заслуговує повернення. Більшість команд ставляться до всіх повернень однаково й марнують зусилля на ті, які ніколи не виграти. Коди діляться чітко.
Виправити: повернення, які спричинив ваш продукт
Деякі коди, це звіти про помилки в одязі повернення. Дефект (3) і не отримано (2) у Google, і revocationReason 1 в Apple, усі кажуть те саме: клієнт заплатив, а ваш застосунок не доставив. Непідтверджена покупка (8), найгостріший із них, бо провина повністю у вашому коді білінгу. Це найдешевші повернення для усунення, бо ви усуваєте їх, виправляючи те, чим володієте, а не переконуючи когось. Зростання лічильника в цій купі, це дефект продукту з доларовою цифрою, прикріпленою до нього.
Боротися: повернення, над якими хтось працює
Шахрайство (5), дружнє шахрайство (6) і зворотний платіж (7), це спори. Чисте шахрайство (5), це не ваш клієнт і не дохід, який ви коли-небудь збиралися лишати. Дружнє шахрайство (6), де покупець отримав саме те, за що заплатив, а потім оскаржив це, це єдиний спір, який ваші докази ще можуть зрушити, а зворотний платіж (7), це де ці докази подають. Коли одне з цих надходить, ви відкликаєте доступ, якщо ще цього не зробили, і там, де відкрите вікно розгляду, ви відповідаєте на нього тим, що знаєте про обліковий запис.
Прийняти: повернення, які ніколи не були вашими, щоб їх зупинити
Передумав (1) і випадкова покупка (4), це власна зміна думки клієнта. revocationReason 0 від Apple теж тут. Жодна функція не підвела і жодного шахрайства не сталося. Ви можете пом'якшити купу випадкових покупок чіткішим підтвердженням покупки, але ви не можете оскаржити повернення через передумав, і час, витрачений на спроби, це час, відібраний у купи виправити, де насправді лежать гроші.
| Купа | Коди Google | Сигнал Apple | Ваш хід |
|---|---|---|---|
| Виправити | 2 не отримано, 3 дефект, 8 непідтверджена | revocationReason 1 | Знайдіть першопричину помилки продукту чи білінгу за цим |
| Боротися | 5 шахрайство, 6 дружнє шахрайство, 7 зворотний платіж | (з'являється через REFUND, а не через причину) | Відкличте доступ, відповідайте на вікно розгляду доказами |
| Прийняти | 1 передумав, 4 випадкова покупка | revocationReason 0 | Зафіксуйте, налаштуйте процес покупки, рухайтеся далі |

Пастка 30 днів, через яку коди причин легко втратити
На боці Google є жорстке обмеження, яке перетворює це зі звітної функції на дедлайн. Якщо ви не захоплюєте коди безперервно, ви їх втрачаєте.
Voided Purchases API дивиться назад лише на 30 днів
Google прямо каже, що API може показати лише скасовані покупки за останні 30 днів. Старіші анулювання не повертаються, хоч би який startTime ви передали, а саме значення startTime не можна встановити раніше, ніж 30 днів тому. Гірше для наївної інтеграції, вікно 30 днів вимірюється тим, коли системи Google бачать покупку як анульовану, а не коли покупку зробили чи навіть за voidedTimeMillis у записі. Тож код причини повернення, який ви не витягнете в цьому вікні, зникає, а щомісячне завдання експорту з будь-яким розривом мовчки відкине анулювання, які воно не встигло захопити.
Скільки коди причин коштують у грошах
Два коди несуть конкретну ціну, і читання їх, це те, як ви ставите число на проблеми, які інакше ховаються всередині сукупного рівня повернень.
Один код, це рахунок, який ви виписали самі собі
voidedReason 8, непідтверджена покупка, це найчистіший приклад повернення, яке ви спричинили. Google Play вимагає, щоб ваш застосунок підтвердив покупку протягом трьох днів після надання доступу, і якщо ви цього не робите, Google автоматично повертає кошти за замовлення й анулює товар. Кожне анулювання, позначене 8, це реальний продаж клієнту, який хотів продукт, повернутий назад, бо виклик для підтвердження покупки так і не спрацював. Втрачена сума, це повна ціна продажу плюс обчислення, виклики API і сховище, які ви вже витратили на доставку. Це не повернення, про яке ви торгуєтеся. Це помилка, яку ви закриваєте, і код, це те, як ви її знаходите.
Код зворотного платежу тепер несе комісію
voidedReason 7, зворотний платіж, змінив вартість August 3, 2026. Для замовлень Google Play, зроблених того дня або пізніше, програний зворотний платіж коштує розробнику ціну покупки за вирахуванням комісії Play, плюс банківську комісію за зворотний платіж, тоді як Google покриває лише власну комісію. Оскільки комісії за зворотний платіж фіксовані, а ціни продуктів ні, на дешевій покупці в застосунку сама комісія може перевищити те, що заплатив клієнт. Підрахунок ваших анулювань із кодом 7 тепер, це підрахунок статті витрат, а не просто втраченого продажу, і саме тому купа зворотних платежів заслуговує на власний рядок у будь-якому звіті про повернення, який ви будуєте.
| Код причини | Що він вам коштує | Чому код має значення |
|---|---|---|
| 8 Непідтверджена покупка | Повна ціна продажу плюс вартість доставки, на продажу, який клієнт хотів | Це самозаподіяне, тож код, це трекер помилок |
| 7 Зворотний платіж (замовлення від Aug 3, 2026) | Ціна продажу за вирахуванням комісії Play, плюс банківська комісія за зворотний платіж | Єдиний код, що додає комісію поверх втраченого продажу |
| 3 Дефект | Ціна продажу плюс вартість доставки, повторена для кожного клієнта, який натрапив на помилку | Обсяг у цьому коді оцінює дефект продукту в доларах |
| 1 Передумав | Ціна продажу і вартість доставки, яку ви вже витратили | Реальна вартість, але не та, яку може повернути зміна коду |
Як Apple і Google співвідносяться
Два магазини відповідають на те саме питання з різною роздільністю, тож міжмагазинний звіт про повернення має нормалізувати їх, а не очікувати, що вони збігатимуться.
| Питання | App Store | Google Play |
|---|---|---|
| Де живе код | revocationReason у підписаній транзакції сповіщення REFUND | voidedReason у Voided Purchases API та його сповіщенні |
| Скільки причин | Дві: 1 проблема у вашому застосунку, 0 інше | Дев'ять, від 0 інше до 8 непідтверджена покупка |
| Хто це зробив | Не розбито окремо | voidedSource: 0 користувач, 1 розробник, 2 Google |
| Наскільки далеко назад можна читати | Доступний на транзакції щоразу, коли ви робите запит | Лише за останні 30 днів анулювань |
| Найгостріший сигнал | 1 означає, що повернення стосується вашого продукту | Коди 3, 8 і 7 кожен вказує на окрему, виправну вартість |
Магазини ніколи не дадуть вам той самий код за те саме повернення, і це нормально. Що має значення, це те, що обидва дають вам машиночитану причину, і обидва винагороджують команду, яка її читає. Один біт Apple каже вам, коли повернення, це провина вашого продукту. Дев'ять причин Google і його прапорець джерела кажуть вам, яка саме помилка продукту, який спір і який самозаподіяний розрив у білінгу ви розглядаєте. Жоден код не зупиняє повернення. Обидва кажуть вам, що робити, щоб наступне не сталося.
RefundHalt захоплює код причини на кожному поверненні тієї миті, коли воно надходить, в обох магазинах, і тримає його з комфортним запасом усередині 30-денного вікна Google, тож нічого не вислизає. Він сортує кожне анулювання на виправити, боротися чи прийняти, тож сплеск коду 3 дефект доходить до вас як сповіщення про продукт, а сплеск коду 8 непідтверджена доходить до вас як помилка інтеграції, а не як розмите падіння доходу. Він відповідає на CONSUMPTION_REQUEST від Apple протягом 12 годин і на розгляд зворотного платежу Google Play протягом 24, і відкликає доступ тієї миті, коли надходить повернення чи зворотний платіж. Ви не можете змінити код, який магазин ставить на повернення. Ви можете переконатися, що читаєте кожен, і дієте за тими, які насправді ваші, щоб їх виправити.
Поширені запитання
- Що таке код причини повернення в App Store і Google Play?
- Це власна позначка магазину про те, чому покупку скасували, доставлена на ваш сервер разом із поверненням. Voided Purchases API від Google Play повертає voidedReason від 0 до 8 і voidedSource: 0 користувач, 1 розробник або 2 Google. Apple встановлює revocationReason у 1, коли повернення сталося через проблему всередині вашого застосунку, або 0 з іншої причини, наприклад через випадкову покупку. Ви не задаєте код і не можете його змінити, але читання його каже вам, чи вказує повернення на ваш продукт, на спір чи на зміну думки клієнта.
- Які значення має voidedReason у Google Play?
- Їх дев'ять: 0 інше, 1 передумав, 2 не отримано, 3 дефект, 4 випадкова покупка, 5 шахрайство, 6 дружнє шахрайство, 7 зворотний платіж і 8 непідтверджена покупка. Кожне повертається на скасовану покупку через Voided Purchases API поряд із voidedSource, який каже, хто ініціював анулювання. Коди 2, 3 і 8 вказують на проблеми у вашому власному застосунку, коди 5, 6 і 7, це спори, а коди 1 і 4, це власне рішення клієнта.
- Що означає revocationReason 1 в Apple?
- Це означає, що App Store повернув кошти за транзакцію через реальну чи уявну проблему всередині вашого застосунку, на відміну від значення 0, яке означає, що повернення сталося з іншої причини, наприклад через випадкову покупку. Поле з'являється лише на повернених чи анульованих транзакціях, разом із revocationDate, усередині підписаної інформації про транзакцію в REFUND App Store Server Notification. 1, це Apple каже вам, що повернення стосувалося вашого продукту.
- Чому Google повернув кошти за покупку з кодом причини непідтверджена?
- Бо ваш застосунок не підтвердив покупку вчасно. Google Play вимагає, щоб ви підтвердили покупку протягом трьох днів після надання доступу, і якщо ви цього не робите, Google автоматично повертає кошти за замовлення й анулює товар, ставлячи на анулювання voidedReason 8. Це повернення, яке ви спричинили помилкою білінгу, а не запит клієнта, тож виправлення у вашому коді обробки покупок, а не в жодних переговорах.
- Наскільки далеко назад я можу читати коди причин повернення?
- У Google Play, лише 30 днів. Voided Purchases API повертає анулювання за останні 30 днів і ігнорує будь-який startTime, старіший за це, і вимірює вікно тим, коли Google бачить анулювання, а не коли зробили покупку. Код, який ви не захопите протягом 30 днів, втрачено, тож вам варто підписатися на сповіщення про скасовану покупку в реальному часі або опитувати за розкладом із гарним запасом усередині вікна. revocationReason від Apple лишається на транзакції щоразу, коли ви робите запит.
Джерела та додаткове читання
- Google Play Developer API: REST Resource purchases.voidedpurchases (voidedReason and voidedSource values)
- Google Play Developer API: Method purchases.voidedpurchases.list (30-day lookback window)
- Google Play: Voided Purchases API overview
- Apple Developer: revocationReason (App Store Server Notifications)
- Apple Developer: Transaction.RevocationReason (StoreKit)
- Apple Developer: Handling refund notifications (revocationDate and revocationReason on REFUND)
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility (August 3, 2026)
- Google Play Billing: Integrate the Google Play Billing Library (acknowledge within three days or auto-refund)
RefundHalt
Автопілот повернень для App Store і Google Play
Читайте далі
Несанкціоновані покупки в застосунках, які роблять діти, майже завжди повертають батькам, а витрати несете ви
Коли дитина купує набір монет на телефоні батьків, і Apple, і Google повертають кошти, і жоден із них не питає вас першим. Регулятори збудували це саме так. Ось як ці повернення за несанкціоновані покупки в застосунках працюють у кожному магазині, вікно у 15 хвилин, куди йдуть гроші, і скільки одна така покупка насправді вам коштує.
Ви ніколи не володіли податком у поверненні коштів за застосунок, тож повернення коштує вам вашу частку, а не суму на чеку
Поверніть кошти за покупку в застосунку, і чек покаже, що назад ідуть ціна плюс податок. Цей податок ніколи не був вашими грошима. Apple і Google збирають і перераховують його як продавець-платник, а потім скасовують під час повернення, не торкаючись вашої частки. Ось скільки насправді коштує повернення і єдине налаштування, за якого податок стає вашим.