Wszystkie artykuły
Deep dive9 min czytania

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.

Odbity pieczątką kod na papierowej etykiecie obok lupy, symbolizujący kod powodu zwrotu, który Twój serwer otrzymuje przy każdym zwrocie

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ć.

voidedReasonEtykieta GoogleCo ten kod Ci mówi
0InnyNie odnotowano konkretnego powodu. Wrzuć do kubełka i obserwuj wolumen, nie pojedynczy przypadek.
1Remorse (zmiana zdania)Klient zmienił zdanie. Nic nie było nie tak z Twoją aplikacją.
2Nie otrzymanoKlient mówi, że nigdy nie dostał tego, za co zapłacił. Problem z dostarczeniem do sprawdzenia.
3WadliwyZakup nie zadziałał. Błąd produktu i najbardziej działaniowy kod na tej liście.
4Przypadkowy zakupKliknięcie przez pomyłkę lub niezamierzony zakup. Rozważ wyraźniejszy krok potwierdzenia.
5OszustwoGoogle oznaczyło transakcję jako oszukańczą. Nie Twój klient i nie Twój przychód do zatrzymania.
6Friendly fraudKupujący zakwestionował obciążenie, którego dokonał i które otrzymał. Dowody wciąż mogą dotknąć tego przypadku.
7ChargebackBank odwrócił obciążenie. Najdroższa ścieżka, teraz z doliczoną opłatą.
8Niepotwierdzony zakupTwoja 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.

GrupaKody GoogleSygnał AppleTwój ruch
Napraw2 nie otrzymano, 3 wadliwy, 8 niepotwierdzonyrevocationReason 1Znajdź przyczynę źródłową błędu produktu lub rozliczeń za nim
Walcz5 oszustwo, 6 friendly fraud, 7 chargeback(pojawia się przez REFUND, nie przez powód)Cofnij dostęp, odpowiedz na okno przeglądu dowodami
Zaakceptuj1 remorse, 4 przypadkowy zakuprevocationReason 0Zapisz, dostrój ścieżkę zakupu, idź dalej
Trzy oznaczone tace sortujące na stole warsztatowym łapią posortowane metalowe żetony, jedna taca oświetlona jaśniej, symbolizujące triażowanie zwrotów według kodu powodu na napraw, walcz i zaakceptuj

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 powoduIle Cię kosztujeDlaczego ten kod ma znaczenie
8 Niepotwierdzony zakupPeł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 chargebackJedyny kod, który dokłada opłatę ponad utraconą sprzedaż
3 WadliwyCena sprzedaży plus koszt dostarczenia, powtarzany dla każdego klienta trafiającego na błądWolumen w tym kodzie wycenia wadę produktu w dolarach
1 RemorseCena 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ą.

PytanieApp StoreGoogle Play
Gdzie mieszka kodrevocationReason w signed transaction powiadomienia REFUNDvoidedReason w Voided Purchases API i jego powiadomieniu
Ile powodówDwa: 1 problem w Twojej aplikacji, 0 innyDziewięć, od 0 inny do 8 niepotwierdzony zakup
Kto to zrobiłNie wyszczególnionevoidedSource: 0 użytkownik, 1 deweloper, 2 Google
Jak daleko wstecz można czytaćDostępne na transakcji, kiedykolwiek odpytaszTylko ostatnie 30 dni voidów
Najostrzejszy sygnałWartość 1 oznacza, że zwrot dotyczy Twojego produktuKody 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

RefundHalt

Autopilot zwrotów dla App Store i Google Play

Czytaj dalej

Kolejny wniosek o zwrot jest już w drodze.

Skonfiguruj RefundHalt w czasie potrzebnym na przeczytanie kolejnej wiadomości od pomocy technicznej o zwrocie, którego nie udało Ci się zakwestionować.