Odczytaj kod powodu zwrotu, który Twój serwer już otrzymuje, a powie Ci, czy naprawić aplikację, czy walczyć z klientem
Każdy zwrot, który Apple i Google wysyłają do Twojego serwera, niesie kod powodu. Google Play oznacza każdy void jednym z dziewięciu powodów i źródłem, Apple sygnalizuje, czy zwrot obciąża Twoją aplikację. Oto co oznacza każdy kod, jak posortować je na napraw, walcz lub zaakceptuj, i ile są warte w pieniądzu.

Najważniejsze wnioski
- Każdy zwrot, który Apple lub Google wysyła do Twojego serwera, niesie kod powodu zwrotu, i jest to jedyny element zwrotu, który możesz odczytać po tym, jak pieniądze już się przemieściły. Mówi, dlaczego zwrot nastąpił, co mówi Ci, co robić dalej.
- Voided Purchases API od Google Play oznacza każdy void dwiema liczbami: voidedReason od 0 do 8 (other, remorse, not received, defective, accidental purchase, fraud, friendly fraud, chargeback, unacknowledged purchase) oraz voidedSource 0 użytkownik, 1 deweloper lub 2 Google.
- Apple daje Ci węższy, ale ostry sygnał. Na zwróconej transakcji revocationReason wynosi 1, gdy App Store dokonał zwrotu z powodu rzeczywistego lub domniemanego problemu wewnątrz Twojej aplikacji, i 0, gdy zwrot nastąpił z innego powodu, na przykład przypadkowego zakupu.
- Kody dzielą się na trzy grupy. Defective, not received, unacknowledged oraz kod problem-w-aplikacji od Apple wskazują na Twój produkt, więc je naprawiasz. Fraud, friendly fraud i chargeback to spory, z którymi walczysz lub którym zapobiegasz. Remorse i przypadkowy zakup nigdy nie były czymś, co mógłbyś powstrzymać.
- voidedReason 8, unacknowledged purchase, to zwrot, który sam sobie wystawiłeś. Google automatycznie zwraca i cofa każdy zakup, którego Twoja aplikacja nie potwierdzi w ciągu trzech dni, i ten kod to sposób, w jaki znajdujesz ten błąd we własnej integracji.
- voidedReason 7, chargeback, to ten kosztowny. W przypadku zamówień Google Play złożonych 3 sierpnia 2026 lub później przegrany chargeback kosztuje dewelopera cenę zakupu pomniejszoną o opłatę serwisową Play plus opłatę bankową za chargeback, więc liczenie voidów oznaczonych jako chargeback to liczenie realnego dodatkowego kosztu.
- Voided Purchases API sięga wstecz tylko 30 dni i filtruje według tego, kiedy Google widzi voida, a nie kiedy nastąpił zakup, więc kod powodu, którego nie przechwycisz w tym oknie, to kod powodu utracony na zawsze.
Gdy Apple lub Google zwraca pieniądze jednemu z Twoich klientów, pieniądze zwykle znikają, zanim zdążysz zabrać głos. To, co ląduje potem na Twoim serwerze, wygląda jak paragon i większość zespołów tak to traktuje. To coś więcej. Każdy zwrot niesie kod powodu zwrotu, i jest to jedyna część zwrotu, którą wciąż możesz odczytać po podjęciu decyzji. Google Play mówi Ci, że zwrot był chargebackiem, albo prośbą remorse, albo zakupem, którego Twoja własna aplikacja nigdy nie potwierdziła. Apple mówi Ci, czy zwrot obciążył coś wewnątrz Twojej aplikacji. Odczytaj ten kod, a zwrot przestaje być wierszem w raporcie i staje się instrukcją: napraw to, walcz z tym albo odpuść ten jeden. Oto co oznacza każdy kod, jak je triażować i ile każdy kosztuje.
Czym właściwie jest kod powodu zwrotu
Kod powodu zwrotu to własna etykieta sklepu określająca, dlaczego zakup został cofnięty. Nie ustawiasz go i nie możesz się z nim spierać. Przychodzi dołączony do zwrotu po fakcie, a oba sklepy udostępniają go w innych postaciach i z bardzo różną rozdzielczością.
Google Play oznacza każdy void powodem i źródłem
Voided Purchases API od Google Play zwraca jeden rekord na każdy cofnięty zakup, a każdy rekord niesie dwie istotne liczby całkowite. voidedReason mówi, dlaczego zakup został unieważniony. voidedSource mówi, kto to zapoczątkował. Razem zamieniają nagi zwrot w zdanie: to zamówienie zostało unieważnione z powodu chargebacku, zainicjowanego przez Google, albo unieważnione jako remorse, zainicjowane przez użytkownika. Odczytujesz je, odpytując API lub subskrybując powiadomienie deweloperskie w czasie rzeczywistym, które uruchamia się, gdy void wpada. Tak czy inaczej, te dwie liczby to payload wart zachowania.
Apple daje Ci węższy sygnał, ale ostry
Apple nie wręcza Ci dziewięciokierunkowego powodu. Na zwróconej transakcji Apple ustawia revocationReason na jedną z dwóch wartości. Wartość 1 oznacza, że App Store zwrócił pieniądze za transakcję z powodu rzeczywistego lub domniemanego problemu wewnątrz Twojej aplikacji. Wartość 0 oznacza zwrot z innego powodu, na przykład przypadkowego zakupu. To pole pojawia się tylko na transakcjach zwróconych lub cofniętych, obok revocationDate, wewnątrz signed transaction info powiadomienia REFUND App Store Server Notification. Dwie wartości to niewiele, ale ta, która się liczy, czyli 1, to Apple mówiące Ci, że zwrot dotyczył Twojego produktu, a nie wahań klienta.
Dziewięć powodów, które daje Ci Google Play
voidedReason od Google jest bogatszy z tych dwóch, a każda wartość warta jest rozpoznania na pierwszy rzut oka, bo każda wskazuje gdzie indziej. Oto pełny zestaw, prosto z zasobu VoidedPurchase, wraz z tym, co każdy kod faktycznie każe Ci zrobić.
| voidedReason | Etykieta Google | Co ten kod Ci mówi |
|---|---|---|
| 0 | Inny | Nie odnotowano konkretnego powodu. Wrzuć do kubełka i obserwuj wolumen, nie pojedynczy przypadek. |
| 1 | Remorse (zmiana zdania) | Klient zmienił zdanie. Nic nie było nie tak z Twoją aplikacją. |
| 2 | Nie otrzymano | Klient mówi, że nigdy nie dostał tego, za co zapłacił. Problem z dostarczeniem do sprawdzenia. |
| 3 | Wadliwy | Zakup nie zadziałał. Błąd produktu i najbardziej działaniowy kod na tej liście. |
| 4 | Przypadkowy zakup | Kliknięcie przez pomyłkę lub niezamierzony zakup. Rozważ wyraźniejszy krok potwierdzenia. |
| 5 | Oszustwo | Google oznaczyło transakcję jako oszukańczą. Nie Twój klient i nie Twój przychód do zatrzymania. |
| 6 | Friendly fraud | Kupujący zakwestionował obciążenie, którego dokonał i które otrzymał. Dowody wciąż mogą dotknąć tego przypadku. |
| 7 | Chargeback | Bank odwrócił obciążenie. Najdroższa ścieżka, teraz z doliczoną opłatą. |
| 8 | Niepotwierdzony zakup | Twoja aplikacja nigdy nie potwierdziła zakupu, więc Google automatycznie go zwróciło. Błąd w Twoim kodzie. |
voidedSource mówi Ci, kto pociągnął za spust
Obok powodu leży voidedSource i odpowiada na inne pytanie: kto to odwrócił. Wartość 0 oznacza, że zrobił to użytkownik, przez samoobsługę lub bank. Wartość 1 oznacza, że zrobił to deweloper, czyli Ty lub Twoje własne narzędzia wystawiające zwrot. Wartość 2 oznacza, że zrobiło to Google, z własnej oceny, w tym automatyczny zwrot za niepotwierdzony zakup. Gdy widzisz skok voidów, źródło to pierwsze cięcie. Ściana źródła 2 to Google działające na Twoim koncie, a to zwykle sygnał wskazujący z powrotem na Twoją integrację, a nie na Twoich klientów.
Posortuj każdy zwrot na napraw, walcz lub zaakceptuj
Powód, dla którego kod jest użyteczny, jest taki, że mówi Ci, na którą z trzech reakcji zasługuje zwrot. Większość zespołów traktuje wszystkie zwroty tak samo i marnuje wysiłek na te, których nigdy nie wygra. Kody dzielą się czysto.
Napraw: zwroty spowodowane przez Twój produkt
Niektóre kody to raporty o błędach w przebraniu zwrotu. Wadliwy (3) i nie otrzymano (2) w Google oraz revocationReason równy 1 w Apple mówią to samo: klient zapłacił, a Twoja aplikacja nie dostarczyła. Niepotwierdzony zakup (8) jest z nich najostrzejszy, bo wina leży w całości w Twoim kodzie rozliczeniowym. To najtańsze zwroty do wyeliminowania, bo eliminujesz je, naprawiając coś, co należy do Ciebie, a nie przekonując kogokolwiek. Rosnąca liczba w tej grupie to wada produktu z przyczepioną kwotą w dolarach.
Walcz: zwroty, które ktoś rozgrywa
Oszustwo (5), friendly fraud (6) i chargeback (7) to spory. Czyste oszustwo (5) to nie Twój klient i nie przychód, który kiedykolwiek miałeś zatrzymać. Friendly fraud (6), gdzie kupujący dostał dokładnie to, za co zapłacił, a potem to zakwestionował, to jedyny spór, który Twoje dowody wciąż mogą poruszyć, a chargeback (7) to miejsce, gdzie te dowody się składa. Gdy jeden z nich wpada, cofasz dostęp, jeśli jeszcze tego nie zrobiłeś, a tam, gdzie otwarte jest okno przeglądu, odpowiadasz na nie tym, co wiesz o koncie.
Zaakceptuj: zwroty, których nigdy nie było Ci dane powstrzymać
Remorse (1) i przypadkowy zakup (4) to własna zmiana zdania klienta. revocationReason równy 0 od Apple też tu należy. Żadna funkcja nie zawiodła i nie doszło do oszustwa. Możesz złagodzić kubełek przypadkowych zakupów wyraźniejszym potwierdzeniem zakupu, ale nie wykłócisz się o zwrot remorse, a czas spędzony na próbach to czas zabrany grupie napraw, gdzie faktycznie są pieniądze.
| Grupa | Kody Google | Sygnał Apple | Twój ruch |
|---|---|---|---|
| Napraw | 2 nie otrzymano, 3 wadliwy, 8 niepotwierdzony | revocationReason 1 | Znajdź przyczynę źródłową błędu produktu lub rozliczeń za nim |
| Walcz | 5 oszustwo, 6 friendly fraud, 7 chargeback | (pojawia się przez REFUND, nie przez powód) | Cofnij dostęp, odpowiedz na okno przeglądu dowodami |
| Zaakceptuj | 1 remorse, 4 przypadkowy zakup | revocationReason 0 | Zapisz, dostrój ścieżkę zakupu, idź dalej |

Pułapka 30 dni, przez którą kody powodów łatwo utracić
Po stronie Google jest twardy limit, który zamienia to z funkcji raportowej w termin ostateczny. Jeśli nie przechwytujesz kodów w sposób ciągły, tracisz je.
Voided Purchases API sięga wstecz tylko 30 dni
Google wprost mówi, że API może pokazać jedynie cofnięte zakupy z ostatnich 30 dni. Starsze voidy nie są zwracane bez względu na to, jaki startTime przekażesz, a sama wartość startTime nie może być ustawiona wcześniej niż 30 dni temu. Gorzej dla naiwnej integracji, okno 30 dni jest mierzone od momentu, gdy systemy Google widzą zakup jako cofnięty, a nie od momentu dokonania zakupu ani nawet od voidedTimeMillis w rekordzie. Więc kod powodu zwrotu, którego nie pobierzesz w tym oknie, przepada, a comiesięczne zadanie eksportu z jakąkolwiek luką po cichu odrzuci voidy, które zbyt wolno przechwyciło.
Ile kody powodów są warte w pieniądzu
Dwa kody niosą konkretną cenę, a ich odczytanie to sposób, w jaki nadajesz liczbę problemom, które inaczej kryją się w zagregowanej stopie zwrotów.
Jeden kod to rachunek, który sam sobie wystawiłeś
voidedReason 8, unacknowledged purchase, to najczystszy przykład zwrotu, który sam spowodowałeś. Google Play wymaga, by Twoja aplikacja potwierdziła zakup w ciągu trzech dni od nadania uprawnienia, a jeśli tego nie zrobisz, Google automatycznie zwraca zamówienie i cofa pozycję. Każdy void oznaczony 8 to realna sprzedaż, od klienta, który chciał produktu, oddana, bo wywołanie potwierdzające zakup nigdy się nie uruchomiło. Utracona kwota to pełna cena sprzedaży plus obliczenia, wywołania API i pamięć, które już wydałeś na dostarczenie. To nie jest zwrot, który negocjujesz. To błąd, który zamykasz, a kod to sposób, w jaki go znajdujesz.
Kod chargeback niesie teraz opłatę
voidedReason 7, chargeback, zmienił koszt 3 sierpnia 2026. W przypadku zamówień Google Play złożonych w tym dniu lub później przegrany chargeback kosztuje dewelopera cenę zakupu pomniejszoną o opłatę serwisową Play, plus opłatę bankową za chargeback, podczas gdy Google pokrywa jedynie własną opłatę serwisową. Ponieważ opłaty za chargeback są stałe, a ceny produktów nie, przy tanim zakupie w aplikacji sama opłata może przekroczyć to, co zapłacił klient. Liczenie Twoich voidów z kodem 7 to teraz liczenie pozycji kosztowej, a nie tylko utraconej sprzedaży, i właśnie dlatego grupa chargeback zasługuje na własny wiersz w każdym raporcie zwrotów, który budujesz.
| Kod powodu | Ile Cię kosztuje | Dlaczego ten kod ma znaczenie |
|---|---|---|
| 8 Niepotwierdzony zakup | Pełna cena sprzedaży plus koszt dostarczenia, przy sprzedaży, której klient chciał | Jest samozawiniony, więc kod to tropiciel błędów |
| 7 Chargeback (zamówienie 3 sierpnia 2026 lub później) | Cena sprzedaży pomniejszona o opłatę serwisową Play, plus opłata bankowa za chargeback | Jedyny kod, który dokłada opłatę ponad utraconą sprzedaż |
| 3 Wadliwy | Cena sprzedaży plus koszt dostarczenia, powtarzany dla każdego klienta trafiającego na błąd | Wolumen w tym kodzie wycenia wadę produktu w dolarach |
| 1 Remorse | Cena sprzedaży i koszt dostarczenia, który już poniosłeś | Realny koszt, ale nie taki, który zmiana kodu może odzyskać |
Jak Apple i Google się układają
Oba sklepy odpowiadają na to samo pytanie w różnych rozdzielczościach, więc międzysklepowy raport zwrotów musi je znormalizować, zamiast oczekiwać, że się zgodzą.
| Pytanie | App Store | Google Play |
|---|---|---|
| Gdzie mieszka kod | revocationReason w signed transaction powiadomienia REFUND | voidedReason w Voided Purchases API i jego powiadomieniu |
| Ile powodów | Dwa: 1 problem w Twojej aplikacji, 0 inny | Dziewięć, od 0 inny do 8 niepotwierdzony zakup |
| Kto to zrobił | Nie wyszczególnione | voidedSource: 0 użytkownik, 1 deweloper, 2 Google |
| Jak daleko wstecz można czytać | Dostępne na transakcji, kiedykolwiek odpytasz | Tylko ostatnie 30 dni voidów |
| Najostrzejszy sygnał | Wartość 1 oznacza, że zwrot dotyczy Twojego produktu | Kody 3, 8 i 7 każdy wskazują odrębny, naprawialny koszt |
Sklepy nigdy nie dadzą Ci tego samego kodu dla tego samego zwrotu i to jest w porządku. Liczy się to, że oba wręczają Ci powód czytelny dla maszyny i oba nagradzają zespół, który go czyta. Pojedynczy bit od Apple mówi Ci, kiedy zwrot jest winą Twojego produktu. Dziewięć powodów Google i jego flaga źródła mówią Ci, który błąd produktu, który spór i którą samozawinioną lukę rozliczeniową masz przed sobą. Żaden kod nie powstrzymuje zwrotu. Oba mówią Ci, co zrobić, by następny się nie wydarzył.
RefundHalt przechwytuje kod powodu przy każdym zwrocie w chwili, gdy dotrze, w obu sklepach, i trzyma go bezpiecznie w obrębie 30-dniowego okna Google, tak że nic nie umyka. Sortuje każdy void na napraw, walcz lub zaakceptuj, tak że skok kodu 3 wadliwy dociera do Ciebie jako alert produktowy, a skok kodu 8 niepotwierdzony dociera do Ciebie jako błąd integracji, a nie jako mglisty spadek przychodu. Odpowiada na CONSUMPTION_REQUEST od Apple w ciągu 12 godzin i na przegląd chargebacku Google Play w ciągu 24, i cofa dostęp w chwili, gdy zwrot lub chargeback wpada. Nie zmienisz kodu, którym sklep oznacza zwrot. Możesz zadbać, byś odczytał każdy z nich i zadziałał na te, które naprawdę należą do Ciebie.
Często zadawane pytania
- Czym jest kod powodu zwrotu w App Store i Google Play?
- To własna etykieta sklepu określająca, dlaczego zakup został cofnięty, dostarczana do Twojego serwera wraz ze zwrotem. Voided Purchases API od Google Play zwraca voidedReason od 0 do 8 oraz voidedSource 0 użytkownik, 1 deweloper lub 2 Google. Apple ustawia revocationReason na 1, gdy zwrot nastąpił z powodu problemu wewnątrz Twojej aplikacji, lub na 0 z innego powodu, na przykład przypadkowego zakupu. Nie ustawiasz kodu i nie możesz go zmienić, ale jego odczytanie mówi Ci, czy zwrot wskazuje na Twój produkt, spór, czy zmianę zdania klienta.
- Jakie są wartości voidedReason w Google Play?
- Jest ich dziewięć: 0 inny, 1 remorse, 2 nie otrzymano, 3 wadliwy, 4 przypadkowy zakup, 5 oszustwo, 6 friendly fraud, 7 chargeback i 8 niepotwierdzony zakup. Każda jest zwracana per cofnięty zakup przez Voided Purchases API obok voidedSource, który mówi, kto zainicjował void. Kody 2, 3 i 8 wskazują na problemy w Twojej własnej aplikacji, kody 5, 6 i 7 to spory, a kody 1 i 4 to własna decyzja klienta.
- Co oznacza revocationReason równy 1 od Apple?
- Oznacza, że App Store zwrócił pieniądze za transakcję z powodu rzeczywistego lub domniemanego problemu wewnątrz Twojej aplikacji, w przeciwieństwie do wartości 0, która oznacza zwrot z innego powodu, na przykład przypadkowego zakupu. To pole pojawia się tylko na transakcjach zwróconych lub cofniętych, wraz z revocationDate, wewnątrz signed transaction info powiadomienia REFUND App Store Server Notification. Wartość 1 to Apple mówiące Ci, że zwrot dotyczył Twojego produktu.
- Dlaczego Google zwróciło zakup z kodem powodu niepotwierdzony?
- Ponieważ Twoja aplikacja nie potwierdziła zakupu na czas. Google Play wymaga, byś potwierdził zakup w ciągu trzech dni od nadania uprawnienia, a jeśli tego nie zrobisz, Google automatycznie zwraca zamówienie i cofa pozycję, oznaczając void wartością voidedReason 8. To zwrot, który sam spowodowałeś błędem rozliczeniowym, a nie prośba klienta, więc naprawa jest w Twoim kodzie obsługi zakupu, a nie w jakichkolwiek negocjacjach.
- Jak daleko wstecz mogę odczytywać kody powodów zwrotu?
- W Google Play tylko 30 dni. Voided Purchases API zwraca voidy z ostatnich 30 dni i ignoruje każdy startTime starszy niż to, a okno mierzy od momentu, gdy Google widzi voida, a nie od momentu dokonania zakupu. Kod, którego nie przechwycisz w ciągu 30 dni, przepada, więc powinieneś subskrybować powiadomienie o cofniętym zakupie w czasie rzeczywistym lub odpytywać według harmonogramu bezpiecznie w obrębie okna. revocationReason od Apple pozostaje na transakcji, kiedykolwiek ją odpytasz.
Źródła i materiały dodatkowe
- 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
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
Nieautoryzowane zakupy w aplikacji dokonywane przez dzieci są niemal zawsze zwracane rodzicowi, a koszt ponosisz Ty
Gdy dziecko kupuje pakiet monet na telefonie rodzica, zarówno Apple, jak i Google zwracają pieniądze i żadne z nich nie pyta Cię o zgodę. Regulatorzy tak to zaprojektowali. Oto jak działają te zwroty za nieautoryzowane zakupy w aplikacji w każdym sklepie, 15-minutowe okno, w którym znikają pieniądze, i ile jeden taki zwrot naprawdę Cię kosztuje.
Nigdy nie należał do Ciebie podatek od zwrotu w aplikacji, więc zwrot kosztuje Cię Twoją część, a nie sumę na paragonie
Zwróć zakup w aplikacji, a paragon pokazuje cenę plus podatek wracające do klienta. Ten podatek nigdy nie był Twoimi pieniędzmi. Apple i Google pobierają go i odprowadzają jako merchant of record, a następnie odwracają przy zwrocie, nie naruszając Twojej części. Oto ile naprawdę kosztuje zwrot i jedyna konfiguracja, w której podatek staje się Twój.