Powody anulowania subskrypcji zwykle docierają do ciebie przed prośbą o zwrot, a Google Play przekazuje ich znacznie więcej niż Apple
Google Play zapisuje powody anulowania subskrypcji z ankiety rezygnacji, a Apple wysyła tylko kod wygaśnięcia. Co mówi każdy sklep, które sygnały zapowiadają zwrot lub obciążenie zwrotne i ile każdy z nich cię kosztuje.

Najważniejsze wnioski
- Google Play pyta subskrybentów przy anulowaniu, dlaczego odchodzą, a odpowiedź trafia do dewelopera przez canceledStateContext.userInitiatedCancellation.cancelSurveyResult w purchases.subscriptionsv2.
- Ankieta rezygnacji w Google Play ma pięć odpowiedzi, które deweloper może odczytać: za mało użytkowania, problemy techniczne, koszty, znaleziono lepszą aplikację i inne. Wolny tekst w reasonUserInput pojawia się tylko, gdy użytkownik wybierze inne.
- Powiadomienie SUBSCRIPTION_CANCELED z Google Play zawiera tylko token zakupu. Powód anulowania trzeba pobrać przez purchases.subscriptionsv2.get, a Google czyści wszystkie pola anulowania, jeśli użytkownik przywróci subskrypcję.
- App Store Server API od Apple nie ma ankiety rezygnacji. Pole expirationIntent podaje jeden z pięciu kodów: klient anulował, błąd płatności, brak zgody na podwyżkę ceny lub konwersję oferty, produkt niedostępny albo inne.
- Powiadomienie Apple DID_CHANGE_RENEWAL_STATUS z podtypem AUTO_RENEW_DISABLED może oznaczać, że App Store wyłączył automatyczne odnawianie po prośbie klienta o zwrot, a nie tylko, że klient sam je wyłączył.
- Powód anulowania nigdy nie daje deweloperowi głosu w sprawie zwrotu. O dowody proszą tylko CONSUMPTION_REQUEST od Apple, z odpowiedzią w ciągu 12 godzin, oraz przegląd obciążenia zwrotnego w Google Play przez orders.reviewrefund, z odpowiedzią w ciągu 24 godzin.
- Subskrybent Google Play, który anuluje z powodu problemów technicznych, najczęściej chce odzyskać pieniądze. Dla zamówień złożonych po 3 sierpnia 2026 wygrane przez niego obciążenie zwrotne kosztuje dewelopera cenę zakupu pomniejszoną o opłatę serwisową Play plus opłaty banku.
Większość subskrybentów, którzy w końcu dostają zwrot, najpierw anuluje. To anulowanie ma powód, a oba sklepy przekazują go w bardzo różnym zakresie. Google Play przeprowadza krótką ankietę i wysyła odpowiedź na twój serwer, razem z wolnym tekstem. Apple wysyła kod liczbowy, który mówi, jak subskrypcja się zakończyła, a nie dlaczego klient chciał odejść. Czytaj oba poprawnie, a zobaczysz nadchodzące prośby o zwrot, póki jeszcze możesz coś z nimi zrobić.
Co Google Play mówi o powodach anulowania subskrypcji
Gdy użytkownik anuluje w centrum subskrypcji Play, Google pyta go o powód. Odpowiedź trafia do zasobu subskrypcji, który dostajesz z purchases.subscriptionsv2.get, w polu canceledStateContext. Ten obiekt istnieje tylko, gdy subskrypcja jest anulowana lub wygasła, i mówi, kto ją zakończył: użytkownik, system Google, ty albo zamiana, na przykład zmiana planu.
Jeśli zrobił to użytkownik, obiekt userInitiatedCancellation zawiera dwa pola. cancelTime mówi, kiedy anulował. cancelSurveyResult zawiera odpowiedź z ankiety.
| Powód w ankiecie | Opis Google | Co często sygnalizuje |
|---|---|---|
| CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGE | Za mało korzystania z subskrypcji | Niskie użycie, więc niewielkie koszty na koncie |
| CANCEL_SURVEY_REASON_TECHNICAL_ISSUES | Problemy techniczne podczas korzystania z aplikacji | Najsilniejszy sygnał zwrotu i obciążenia zwrotnego |
| CANCEL_SURVEY_REASON_COST_RELATED | Powody związane z kosztami | Wrażliwość na cenę, czasem nieoczekiwane odnowienie |
| CANCEL_SURVEY_REASON_FOUND_BETTER_APP | Użytkownik znalazł lepszą aplikację | Wygrał konkurent, rzadko spór |
| CANCEL_SURVEY_REASON_OTHERS | Inne powody | Przeczytaj reasonUserInput, słowa samego użytkownika |
| CANCEL_SURVEY_REASON_UNSPECIFIED | Nieokreślony powód w ankiecie | Brak odpowiedzi, z którą można pracować |
Prawa kolumna to nasza interpretacja, nie Google. Dwie pierwsze kolumny pochodzą wprost z dokumentacji API.
Powiadomienie nie zawiera powodu
Anulowana subskrypcja wywołuje powiadomienie dla deweloperów w czasie rzeczywistym SUBSCRIPTION_CANCELED, typ 3. Google wyraźnie zaznacza, że te powiadomienia mówią tylko o zmianie stanu zakupu. Ładunek daje ci token zakupu i nic więcej przydatnego, więc twój handler musi wywołać purchases.subscriptionsv2.get, żeby odczytać odpowiedź z ankiety.
Widok w Play Console
Do sum nie potrzebujesz kodu. Raporty subskrypcji w Play Console mają kartę Anulowania, która dzieli odpływ na dobrowolny, niedobrowolny i inny, oraz kartę odpowiedzi z ankiety rezygnacji dla użytkowników, którzy zechcieli odpowiedzieć. Odpowiedzi tekstowe od użytkowników, którzy wybrali inne, pobierzesz jako CSV z karty Inne odpowiedzi. To pobranie wymaga uprawnienia View financial data, tego samego, które dałbyś narzędziu czytającemu twoje zamówienia.
Co mówi Apple, a co pomija
Apple nie prowadzi ankiety rezygnacji, której wyniki trafiają do deweloperów. Najbliższe jest pole expirationIntent w podpisanych informacjach o odnowieniu. Opisuje ono, jak subskrypcja się skończyła, a nie co myślał klient.
| expirationIntent | Znaczenie według Apple | Odpowiadający podtyp EXPIRED |
|---|---|---|
| 1 | Klient anulował subskrypcję | VOLUNTARY |
| 2 | Błąd płatności, np. nieprawidłowe dane płatnicze | BILLING_RETRY |
| 3 | Brak wymaganej zgody na podwyżkę ceny lub konwersję oferty | PRICE_INCREASE |
| 4 | Produkt nie był dostępny do kupienia przy odnowieniu | PRODUCT_NOT_FOR_SALE |
| 5 | Inny powód | Brak podtypu |
Kod 1 jako jedyny opisuje decyzję klienta i nic nie mówi o motywie. Klient, który odszedł, bo aplikacja ciągle się wysypywała, i ten, który po prostu skończył projekt, wyglądają tak samo.
Sygnał ukryty w AUTO_RENEW_DISABLED
Jedno powiadomienie Apple warto obejrzeć dokładniej. DID_CHANGE_RENEWAL_STATUS z podtypem AUTO_RENEW_DISABLED zwykle oznacza, że klient wyłączył automatyczne odnawianie. Dokumentacja Apple dodaje drugi przypadek: App Store też wyłącza automatyczne odnawianie, gdy klient poprosi o zwrot.
Na iOS zdarzenie wyłączenia odnawiania może więc być pierwszym śladem prośby o zwrot. Jeśli zakup to produkt konsumpcyjny albo subskrypcja odnawiana automatycznie, może pojawić się CONSUMPTION_REQUEST, a od tej chwili masz 12 godzin na wysłanie danych o konsumpcji. Gdy takie zdarzenie przychodzi bez widocznej akcji w aplikacji, potraktuj je jako ostrzeżenie i przygotuj dane o użyciu tego konta.
Apple i Google obok siebie
| Google Play | Apple App Store | |
|---|---|---|
| Pyta użytkownika o powód | Tak, ankieta rezygnacji | Brak ankiety widocznej dla dewelopera |
| Gdzie jest powód | canceledStateContext w purchases.subscriptionsv2 | expirationIntent w informacjach o odnowieniu |
| Wolny tekst | reasonUserInput, tylko dla inne | Brak |
| Kto anulował | Użytkownik, system, deweloper lub zamiana | Wnioskowane z kodu i podtypu |
| Powiadomienie | SUBSCRIPTION_CANCELED, potem wywołanie get | DID_CHANGE_RENEWAL_STATUS, EXPIRED |
| Tracone po ponownej subskrypcji | Tak, czyszczone przy przywróceniu | Informacje o odnowieniu pokazują bieżący stan |
| Panel | Karta odpowiedzi z ankiety rezygnacji | Brak dla powodów |

Kiedy anulowanie zamienia się w zwrot
Anulowanie zatrzymuje następną płatność. Nie oddaje ostatniej. To, czy pieniądze wrócą, zależy od tego, do której ścieżki zwrotu klient trafi dalej, a większość z nich działa bez twojego udziału.
- W Google Play kupujący może sam uzyskać zwrot w ciągu 48 godzin od zakupu, a decyzję podejmuje Google.
- O zwrotach przez wsparcie Google lub Apple decyduje sklep.
- CONSUMPTION_REQUEST od Apple prosi o twoje dane o konsumpcji, z terminem 12 godzin.
- Przegląd obciążenia zwrotnego w Google Play prosi o dowody przez orders.reviewrefund, z terminem 24 godzin. Decyzja banku w sprawie obciążenia zwrotnego jest ostateczna.
Powód anulowania nie zmienia żadnej z tych zasad. Zmienia to, jak wcześnie wiesz, który klient jest niezadowolony, i czy twoje dowody są gotowe, gdy nadejdzie jedna z dwóch ścieżek, które o nie proszą.
Ile kosztuje cię każdy powód
Odpowiedź z ankiety to też przybliżona wskazówka, ile już kosztowała obsługa konta. To właśnie te pieniądze zostają po twojej stronie przy zwrocie.
Problemy techniczne
To najdroższy przypadek. Klient używał produktu na tyle, by trafić na problemy, więc zapłaciłeś za moc obliczeniową jego sesji, wywołania API modelu z jego zapytań, przechowywanie wszystkiego, co stworzył, i ewentualne wypłaty dla twórców, z których treści korzystał. Jeśli potem dostanie zwrot, cena wraca, a te koszty zostają u ciebie. Jeśli w Google Play pójdzie do banku, zamówienie złożone po 3 sierpnia 2026 kosztuje cię cenę zakupu pomniejszoną o opłatę serwisową Play, plus opłaty banku.
Koszty
Skarga na cenę kosztuje mniej, niż się wydaje, chyba że kryje nieoczekiwane odnowienie. To klasyczny scenariusz obciążenia zwrotnego, więc sprawdź, czy anulowanie nastąpiło tuż po opłacie za odnowienie i czy przypomnienia o odnowieniu zostały wysłane.
Za mało użytkowania
Niskie użycie to niskie koszty obsługi, więc zwrot oddaje tu głównie pieniądze, na które wydałeś niewiele. To też powód, przy którym uczciwe dane o konsumpcji, jeśli Apple o nie poprosi, pokazują dokładnie, z czego klient korzystał, a z czego nie.
Znaleziono lepszą aplikację
Ci klienci rzadko cokolwiek kwestionują. Odeszli do konkurencji. Ten powód przydaje się przy decyzjach produktowych i prawie nigdy przy obronie przed zwrotami.
Rutyna czytania powodów anulowania
- Przy każdym SUBSCRIPTION_CANCELED z Google Play wywołaj purchases.subscriptionsv2.get i zapisz canceledStateContext razem z tokenem zakupu i cancelTime.
- Zapisuj reasonUserInput dosłownie, gdy powód to inne. To jedyny wolny tekst, jaki daje którykolwiek ze sklepów.
- Przy każdym DID_CHANGE_RENEWAL_STATUS z Apple z AUTO_RENEW_DISABLED zaloguj zdarzenie i pobierz dane o użyciu tego konta, na wypadek gdyby pojawił się CONSUMPTION_REQUEST.
- Przy każdym powiadomieniu EXPIRED z Apple zapisz podtyp i expirationIntent, żeby dobrowolny odpływ i błędy płatności się nie mieszały.
- Przy anulowaniach w Google Play z powodu problemów technicznych sprawdź logi błędów tego konta i odezwij się, zanim klient pójdzie do banku.
- Prowadź logi użycia dla każdego konta, żeby CONSUMPTION_REQUEST dostał odpowiedź w ciągu 12 godzin, a przegląd obciążenia zwrotnego w ciągu 24.
Często zadawane pytania
- Jak sprawdzić, dlaczego subskrybent Google Play anulował?
- Wywołaj purchases.subscriptionsv2.get i odczytaj canceledStateContext.userInitiatedCancellation.cancelSurveyResult. Pole reason zawiera odpowiedź z ankiety, a reasonUserInput zawiera wolny tekst, gdy użytkownik wybrał inne. Play Console pokazuje też sumy na karcie odpowiedzi z ankiety rezygnacji.
- Czy Apple mówi deweloperom, dlaczego klient anulował subskrypcję?
- Nie. Apple nie ma ankiety rezygnacji widocznej dla dewelopera. Pole expirationIntent mówi, jak subskrypcja się zakończyła, z kodami dla anulowania przez klienta, błędu płatności, braku zgody na podwyżkę ceny, niedostępności produktu lub innego powodu, ale nie podaje motywu klienta.
- Czy powiadomienie SUBSCRIPTION_CANCELED zawiera powód anulowania?
- Nie. Powiadomienia dla deweloperów w czasie rzeczywistym w Google Play mówią tylko, że zmienił się stan zakupu. Pobierz subskrypcję przez purchases.subscriptionsv2.get, żeby odczytać powód, i zapisz go od razu, bo Google czyści pola anulowania, jeśli użytkownik przywróci subskrypcję.
- Czy powiadomienie Apple AUTO_RENEW_DISABLED może oznaczać prośbę o zwrot?
- Tak. Według dokumentacji Apple podtyp AUTO_RENEW_DISABLED obejmuje zarówno klienta wyłączającego automatyczne odnawianie, jak i App Store wyłączający je po prośbie klienta o zwrot.
- Czy mogę odebrać dostęp, gdy subskrybent anuluje?
- Nie w Google Play, dopóki nadal ma do niego prawo. Google mówi, że anulowany subskrybent zachowuje dostęp do końca okresu rozliczeniowego, a wcześniejsze odebranie dostępu narusza zasady subskrypcji Google Play. Użyj expiryTime, aby ustalić, kiedy dostęp się kończy.
Źródła i materiały dodatkowe
- Google Play Developer API: purchases.subscriptionsv2
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Play Console Help: Review in-app subscription performance
- Apple Developer: expirationIntent
- Apple Developer: notificationType
- Apple Developer: Send Consumption Information
- Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
Nadmierne prośby o zwrot mogą kosztować więcej niż same zwroty, bo oba sklepy z aplikacjami traktują je jako sygnał jakości
Wytyczna 5.6.4 Apple wprost wskazuje nadmierne prośby o zwrot jako oznakę, że aplikacja nie spełnia standardów jakości, a umowa dystrybucyjna Google pozwala usuwać aplikacje nowych deweloperów z powodu wskaźnika zwrotów. Oto co piszą oba sklepy, ile kosztuje usunięcie i jak trzymać się z dala od kłopotów.
Weryfikuj powiadomienia serwera App Store, zanim zareagujesz na zwrot, bo każdy może wysłać żądanie na Twój adres webhooka
Powiadomienie o zwrocie to tylko żądanie HTTPS, dopóki nie sprawdzisz jego podpisu. Oto jak weryfikować powiadomienia serwera App Store i wiadomości RTDN z Google Play, co podpisuje każdy ze sklepów i ile kosztuje Cię sfałszowany lub błędnie odrzucony zwrot.