Усі статті
Deep dive9 хв читання

Прочитайте код причини повернення коштів, який ваш сервер уже отримує, і він підкаже, чи виправляти застосунок, чи боротися з клієнтом

Кожне повернення коштів, яке 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 StoreGoogle Play
Де живе кодrevocationReason у підписаній транзакції сповіщення REFUNDvoidedReason у 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 лишається на транзакції щоразу, коли ви робите запит.

Джерела та додаткове читання

RefundHalt

Автопілот повернень для App Store і Google Play

Читайте далі

Deep dive8 хв читання

Несанкціоновані покупки в застосунках, які роблять діти, майже завжди повертають батькам, а витрати несете ви

Коли дитина купує набір монет на телефоні батьків, і Apple, і Google повертають кошти, і жоден із них не питає вас першим. Регулятори збудували це саме так. Ось як ці повернення за несанкціоновані покупки в застосунках працюють у кожному магазині, вікно у 15 хвилин, куди йдуть гроші, і скільки одна така покупка насправді вам коштує.

Deep dive8 хв читання

Ви ніколи не володіли податком у поверненні коштів за застосунок, тож повернення коштує вам вашу частку, а не суму на чеку

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

Наступний запит на повернення вже в дорозі.

Налаштуйте RefundHalt за час, потрібний, щоб прочитати черговий лист у підтримку про повернення, яке ви не встигли оскаржити.