Apple może cofnąć zwrot, który już przyznał, a cofnięty zwrot, który Twój serwer ignoruje, blokuje dostęp klientowi, który zapłacił
Gdy App Store cofa zwrot, który już przyznał, oczekuje, że Twój serwer przywróci dostęp, który odebrałeś. Oto jak działają powiadomienia o zwrocie, odrzuceniu zwrotu i cofnięciu zwrotu w App Store i Google Play oraz ile kosztuje każde z nich, gdy je zignorujesz.

Najważniejsze wnioski
- App Store wysyła powiadomienie REFUND_REVERSED, gdy cofa wcześniej przyznany zwrot, ponieważ klient go zakwestionował, a instrukcja Apple jest jednoznaczna: jeśli Twoja aplikacja odebrała treści lub usługi, musi je przywrócić.
- Powiadomienie REFUND oznacza, że App Store już zwrócił środki za transakcję, więc Twój serwer powinien odebrać uprawnienie. Powiadomienie REFUND_DECLINED oznacza, że Apple odrzuciło wniosek, a klient zachowuje zarówno dostęp, jak i obciążenie.
- Jeśli odbierasz dostęp przy zwrocie, ale nigdy nie obsługujesz cofnięcia, klient, którego obciążenie zostaje przywrócone, pozostaje zablokowany. To zgłoszenie do pomocy technicznej, jednogwiazdkowa recenzja, a w Google Play frustracja, która może przerodzić się w chargeback, który teraz kosztuje Cię pieniądze.
- Pole revocationReason firmy Apple mówi Ci, dlaczego doszło do zwrotu: value 1 oznacza, że Apple zwróciło środki z powodu rzeczywistego lub domniemanego problemu w Twojej aplikacji, value 0 oznacza inny powód, taki jak przypadkowy zakup.
- Google Play nie ma powiadomienia o cofnięciu. Wysyła VoidedPurchaseNotification, gdy zakup zostaje unieważniony, oraz osobne PendingRefundReviewNotification dla chargebacków, a resztę uzgadniasz za pomocą modelu pull Voided Purchases API.
- Google Play daje Ci 24 hours na odpowiedź na PendingRefundReviewNotification przez wywołanie orders.reviewrefund i rejestruje tylko Twoje pierwsze wywołanie. Od 3 sierpnia 2026 przegrany chargeback kosztuje dewelopera cenę pomniejszoną o opłatę serwisową Google plus opłatę banku.
- Obsługuj powiadomienia o zwrotach z App Store idempotentnie. Zduplikowane dostarczenia są normalne, więc powiąż każde odebranie i przywrócenie z id transakcji i spraw, aby powtórzone powiadomienie nie miało żadnego efektu.
Zwrot nie zawsze jest ostatnim słowem. App Store może cofnąć zwrot, który już przyznał, po tym jak klient go zakwestionuje, a gdy ten cofnięty zwrot trafia na Twój serwer, niesie jedną instrukcję: oddaj dostęp. Większość zespołów podłącza jedynie zwykłe powiadomienie REFUND, odcina klienta i na tym poprzestaje. Nigdy nie budują drugiej połowy. Więc gdy przychodzi cofnięcie, nic się nie uruchamia, a klient, który znów płaci, siedzi zablokowany bez dostępu do tego, co kupił. Oto jak działa pełen zestaw powiadomień o zwrotach w App Store i Google Play oraz ile kosztuje każde z nich, gdy je zignorujesz.
App Store wysyła trzy powiadomienia o zwrotach, nie jedno
Większość obsługi zwrotów jest zbudowana pod jedno zdarzenie: pieniądze wróciły, odetnij klienta. Strumień App Store Server Notifications V2 w rzeczywistości niesie trzy odrębne wyniki zwrotu i wymagają one trzech różnych rzeczy. Dwa z nich zmieniają to, do czego klient ma dostęp. Jedno z nich cofa pierwsze. Oto pełen zestaw, słowami samego Apple.
| Powiadomienie | Co oznacza | Co robi Twój serwer |
|---|---|---|
| CONSUMPTION_REQUEST | Klient poprosił o zwrot, a Apple chce danych o zużyciu | Wyślij payload zużycia w ciągu 12 hours |
| REFUND | App Store zwrócił środki za transakcję | Odbierz uprawnienie dla tej transakcji |
| REFUND_DECLINED | App Store odrzucił wniosek o zwrot | Nic; klient zachowuje dostęp i obciążenie |
| REFUND_REVERSED | App Store cofnął zwrot, który przyznał | Przywróć treść lub usługę, którą odebrałeś |
REFUND, to które obsługuje każdy zespół
Gdy App Store przetwarza zwrot, wysyła powiadomienie REFUND na skonfigurowany przez Ciebie URL, a definicja Apple jest jasna: 'wskazuje, że App Store pomyślnie zwrócił środki za transakcję dotyczącą konsumowalnego In-App Purchase, niekonsumowalnego In-App Purchase, subskrypcji z automatycznym odnawianiem lub subskrypcji nieodnawialnej.' Zapisujesz zwróconą transakcję, odbierasz to, co zostało za nią kupione, a Apple prosi, abyś poinformował klienta o zmianie za pomocą kontekstowego komunikatu w aplikacji. To powiadomienie, które wszyscy podłączają jako pierwsze, i często jedyne.
REFUND_DECLINED, to które niczego od Ciebie nie wymaga
REFUND_DECLINED oznacza dokładnie to, co mówi: 'App Store odrzucił wniosek o zwrot.' Klient poprosił, Apple odmówiło, a transakcja pozostaje w mocy. Nic w dostępie klienta się nie zmienia, więc Twoja logika uprawnień nic tu nie robi. Wartość tego powiadomienia to ewidencja. Zamyka pętlę wniosku o zwrot, na który mogłeś odpowiedzieć powiadomieniem CONSUMPTION_REQUEST, i potwierdza, że klient nadal ma to, za co zapłacił. Traktuj je jako zapis, nie jako działanie.
REFUND_REVERSED, to które zaskakuje zespoły
To powiadomienie, którego większość potoków zwrotów nigdy nie obsługuje. Definicja Apple jest jednoznaczna: REFUND_REVERSED 'wskazuje, że App Store cofnął wcześniej przyznany zwrot z powodu sporu zgłoszonego przez klienta. Jeśli Twoja aplikacja odebrała treści lub usługi w wyniku powiązanego zwrotu, musi je przywrócić.' Przeczytaj to dwa razy. Apple przyznało klientowi zwrot, Ty odebrałeś dostęp, potem Apple zdecydowało, że zwrot nie powinien obowiązywać, i go wycofało. Obciążenie znów jest aktywne. Klient zapłacił, a jeśli Twój serwer umie tylko odbierać, wciąż jest zablokowany. Cofnięty zwrot to jedyne zdarzenie zwrotu, które dodaje dostęp z powrotem, i jest to zdarzenie, pod które prawie nikt nie buduje.
Ile naprawdę kosztuje Cię cofnięty zwrot
Przeoczone cofnięcie to nie błąd zaokrąglenia. Prześledź pieniądze w obu kierunkach, bo pomyłka w którejkolwiek z połówek ma swoją cenę.
Przegap cofnięcie, a utrzymasz płacącego klienta w blokadzie. Apple przywróciło obciążenie, więc klient znów jest stratny, a Twoja aplikacja odmawia mu tego, co kupił. Bezpośrednim kosztem jest czas pomocy technicznej i zwrot z dobrej woli, który teraz możesz wystawić sam, tym razem bez prowizji sklepu wracającej, by go złagodzić. Wolniejszym kosztem jest recenzja i odejście klienta, a w Google Play ta sama frustracja z blokady to dokładnie to, co przeradza się w chargeback.
Przegap pierwotny zwrot, a nadal obsługujesz klienta, który nic nie zapłacił. Lustrzanym błędem jest w ogóle nieodbieranie dostępu. Klient po zwrocie, który wciąż generuje obrazy, wywołuje Twoje API i zapełnia Twoją pamięć, generuje realny koszt wobec sprzedaży, która została cofnięta. Obliczenia, wywołania zewnętrzne i pamięć to pieniądze, które już wydałeś, i żadne z nich nie wraca wraz ze zwrotem.
- Koszt wsparcia: człowiek odpowiadający na zgłoszenie o dostęp, który Twój własny kod usunął i nigdy nie przywrócił.
- Zwroty z dobrej woli: ponowne wystawienie pieniędzy klientowi, którego błędnie zablokowałeś, bez prowizji sklepu zwracanej przy ręcznym geście.
- Zmarnowane wydatki: obliczenia, wywołania API i pamięć zużyte przez konto po zwrocie, którego nigdy nie odciąłeś.
- Ryzyko chargebacku: w Google Play klient, który czuje się obciążony podwójnie, może zakwestionować obciążenie, a przegrany spór teraz spada na Ciebie.
Cofnięty zwrot i zwykły zwrot to ten sam strumień webhook wskazujący w przeciwnych kierunkach. Obsłuż jeden, a pomiń drugi, a zapłacisz na obu końcach.

Dlaczego Apple cofa zwrot i jak czytać revocationReason
Cofnięcie nie jest przypadkowe. Apple wiąże je z 'sporem zgłoszonym przez klienta', czyli klientem kwestionującym decyzję o zwrocie po fakcie. Gdy zwrot został pierwotnie przyznany, transakcja niosła revocationDate i revocationReason, i warto przeczytać ten powód, zanim cokolwiek dalej w potoku na nim zadziała.
- revocationReason 1: App Store zwrócił środki 'z powodu rzeczywistego lub domniemanego problemu w Twojej aplikacji.' To sygnał o Twoim produkcie, nie tylko o tym kliencie.
- revocationReason 0: App Store zwrócił środki 'z innych powodów, na przykład przypadkowego zakupu.' Brak dołączonego sygnału o jakości aplikacji.
Gdy REFUND_REVERSED przychodzi dla tej transakcji, odebranie jest cofane. Twoja logika przywracania powinna odszukać oryginalny id transakcji, potwierdzić, że go odebrałeś, i przywrócić uprawnienie dokładnie takie, jakie było.
Google Play nie wysyła cofnięcia, więc zamiast tego uzgadniasz
Model Google Play jest inny, a różnica ma znaczenie, jeśli obsługujesz oba sklepy przez jeden handler webhook. Nie ma odpowiednika REFUND_REVERSED w Google. Powiadomienia dla deweloperów w czasie rzeczywistym Google dzielą zdarzenia zwrotów na dwie wiadomości, a cofnięcia są obsługiwane przez uzgadnianie, a nie przez push.
Powiadomienie o unieważnionym zakupie
Gdy zakup w Google Play zostaje unieważniony, Twój serwer otrzymuje VoidedPurchaseNotification. Podaje ono purchaseToken i orderId, productType typu subscription lub one-time oraz refundType, który jest albo pełnym unieważnieniem, albo częściowym zwrotem opartym na ilości przy zakupach wieloilościowych. Google mówi, że te dane wystarczą, aby znaleźć właściwy zakup i skorygować uprawnienie. Po więcej kieruje Cię do Voided Purchases API, modelu pull, który wymienia unieważnione zamówienia w zakresie znaczników czasu, o który pytasz.
Przegląd chargebacku i jego 24-godzinny zegar
Chargebacki przychodzą inną wiadomością, PendingRefundReviewNotification. Gdy klient kwestionuje obciążenie w swoim banku, Google Play wysyła to powiadomienie i uruchamia zegar. Masz 24 hours na wywołanie orders.reviewrefund z preferencją zwrotu i wszelkimi dowodami użytkowania, aby Google mogło zakwestionować w Twoim imieniu nieuprawniony chargeback. Google rejestruje Twoje pierwsze wywołanie i ignoruje resztę. To odpowiednik Google dla CONSUMPTION_REQUEST firmy Apple, jedyne okno, w którym liczy się Twoja strona sporu.
Ponieważ nie ma pusha o cofnięciu, chargeback, który Google zakwestionuje i wygra, nie przychodzi jako schludne zdarzenie przywrócenia. Uzgadniasz go z Voided Purchases API i własnymi zapisami. Wniosek jest taki sam jak w App Store: unieważnione zamówienie nie zawsze jest trwałe, a stan Twoich uprawnień musi umieć poruszać się wstecz, nie tylko naprzód.
| Zdarzenie zwrotu | App Store | Google Play |
|---|---|---|
| Zwrot przyznany | Powiadomienie REFUND | VoidedPurchaseNotification |
| Zwrot odrzucony | Powiadomienie REFUND_DECLINED | Brak osobnej wiadomości |
| Zwrot cofnięty | Powiadomienie REFUND_REVERSED | Brak pusha; uzgodnij przez Voided Purchases API |
| Okno na dowody sporu | CONSUMPTION_REQUEST, 12 hours | PendingRefundReviewNotification, 24 hours |
| Kto może wystawić zwrot | Tylko Apple | Google lub Ty z karty Orders |
Jak obsłużyć każde powiadomienie o zwrocie, nie blokując nikomu dostępu
Nie potrzebujesz osobnych potoków na każdy sklep. Potrzebujesz handlera, który potrafi przesuwać uprawnienie w obu kierunkach i traktuje każdą wiadomość jako możliwie zduplikowaną.
- Zbuduj przywracanie, nie tylko odbieranie. Dla każdej ścieżki, która usuwa dostęp przy REFUND, napisz odwrotność, która go przywraca przy REFUND_REVERSED, powiązaną z tym samym id transakcji.
- Uczyń to idempotentnym. Oba sklepy mogą dostarczyć to samo powiadomienie więcej niż raz, więc powiąż każde odebranie i przywrócenie z id transakcji lub zamówienia i spraw, aby powtórzenie nie miało żadnego efektu.
- Przeczytaj powód, zanim zadziałasz. Użyj revocationReason, aby odróżnić zwrot z powodu jakości aplikacji od przypadkowego, i kieruj te dotyczące jakości aplikacji do osoby odpowiedzialnej za jakość produktu.
- Odpowiadaj na okna dowodowe na czas. Wyślij dane o zużyciu Apple w ciągu 12 hours od CONSUMPTION_REQUEST i wywołaj orders.reviewrefund w ciągu 24 hours od PendingRefundReviewNotification.
- Zapisuj każde zdarzenie. Przechowuj REFUND_DECLINED i surowe powiadomienia, aby cofnięcie, które przyjdzie później, można było dopasować do zwrotu, który odwraca.
Nic z tego nie zmienia tego, czy zwrot się wydarzy. Zmienia to, czy klient po drugiej stronie cofniętego zwrotu w ogóle zauważy, że Twój serwer się pomylił.
Często zadawane pytania
- Czym jest powiadomienie REFUND_REVERSED w App Store?
- To App Store informujący Twój serwer, że cofnął wcześniej przyznany zwrot, ponieważ klient go zakwestionował. Instrukcja Apple jest jednoznaczna: jeśli Twoja aplikacja odebrała treści lub usługi w wyniku tego zwrotu, musi je przywrócić. Obciążenie znów jest aktywne, więc klient powinien odzyskać dostęp.
- Co powinienem zrobić, gdy otrzymam powiadomienie REFUND_DECLINED?
- Nic z dostępem klienta. REFUND_DECLINED oznacza, że App Store odrzucił wniosek o zwrot, więc transakcja pozostaje w mocy, a klient zachowuje to, za co zapłacił. Traktuj je jako zapis zamykający wniosek o zwrot, często ten, na który odpowiedziałeś powiadomieniem CONSUMPTION_REQUEST.
- Czy Google Play wysyła powiadomienie, gdy zwrot lub chargeback zostaje cofnięty?
- Nie. Google Play nie ma odpowiednika REFUND_REVERSED firmy Apple. Wysyła VoidedPurchaseNotification, gdy zakup zostaje unieważniony, oraz PendingRefundReviewNotification dla chargebacków, ale zakwestionowany chargeback, który Google wygrywa, nie jest do Ciebie odsyłany pushem. Uzgadniasz go za pomocą Voided Purchases API i własnych zapisów.
- Ile mam czasu na odpowiedź na chargeback w Google Play?
- 24 hours. Gdy Google Play wysyła PendingRefundReviewNotification, masz 24 hours na wywołanie orders.reviewrefund z preferencją zwrotu i dowodami użytkowania. Google rejestruje tylko Twoje pierwsze wywołanie. Od 3 sierpnia 2026 przegrany chargeback kosztuje dewelopera cenę pomniejszoną o opłatę serwisową Google plus opłatę banku.
- Co mówi mi revocationReason przy zwróconej transakcji w App Store?
- Mówi Ci, dlaczego Apple zwróciło środki. Value 1 oznacza, że Apple zwróciło środki z powodu rzeczywistego lub domniemanego problemu w Twojej aplikacji, co jest sygnałem produktowym. Value 0 oznacza inny powód, taki jak przypadkowy zakup. Odczytanie tego pozwala oddzielić zwroty wskazujące na błąd od rutynowych.
Źródła i materiały dodatkowe
- Apple Developer: App Store Server Notifications V2 notificationType
- Apple Developer: Handling refund notifications
- Apple Developer: revocationReason (App Store Server API)
- Android Developers: Real-time developer notifications reference
- Google Play Developer API: Method orders.reviewrefund
- Play Console Help: Updates to refund protection and chargeback cost responsibility
- Google Play Developer: Voided Purchases API
RefundHalt
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
Kto płaci za zwrot w twojej aplikacji, to głównie ty, ale nie za prowizję, którą, jak myślisz, tracisz
Gdy klient otrzymuje zwrot, zarówno Apple, jak i Google oddają swoją prowizję, więc udział sklepu to nie to, co tracisz. Oto kto płaci za zwrot w twojej aplikacji, co naprawdę znika z twojej wypłaty i dlaczego chargeback kosztuje więcej niż zwykły zwrot.
Anulowanie subskrypcji i uzyskanie zwrotu to dwie różne rzeczy, i tylko jedna oddaje pieniądze Twojemu klientowi
Gdy anulujesz subskrypcję, sklep po prostu wstrzymuje kolejne obciążenie, klient zachowuje dostęp do końca okresu, a pieniądze się nie ruszają. Zwrot cofa płatność, która już przeszła, i zabiera z nią dostęp. Oto gdzie te dwie ścieżki się rozchodzą, ile każda Cię kosztuje i dlaczego tylko zwrot dociera do Twojego serwera.