Wszystkie artykuły
Poradnik8 min czytania

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.

Programista przy biurku o świcie sprawdza ekran subskrypcji w telefonie obok notesu pełnego kresek i sortuje powody anulowania subskrypcji

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 ankiecieOpis GoogleCo często sygnalizuje
CANCEL_SURVEY_REASON_NOT_ENOUGH_USAGEZa mało korzystania z subskrypcjiNiskie użycie, więc niewielkie koszty na koncie
CANCEL_SURVEY_REASON_TECHNICAL_ISSUESProblemy techniczne podczas korzystania z aplikacjiNajsilniejszy sygnał zwrotu i obciążenia zwrotnego
CANCEL_SURVEY_REASON_COST_RELATEDPowody związane z kosztamiWrażliwość na cenę, czasem nieoczekiwane odnowienie
CANCEL_SURVEY_REASON_FOUND_BETTER_APPUżytkownik znalazł lepszą aplikacjęWygrał konkurent, rzadko spór
CANCEL_SURVEY_REASON_OTHERSInne powodyPrzeczytaj reasonUserInput, słowa samego użytkownika
CANCEL_SURVEY_REASON_UNSPECIFIEDNieokreślony powód w ankiecieBrak 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.

expirationIntentZnaczenie według AppleOdpowiadający podtyp EXPIRED
1Klient anulował subskrypcjęVOLUNTARY
2Błąd płatności, np. nieprawidłowe dane płatniczeBILLING_RETRY
3Brak wymaganej zgody na podwyżkę ceny lub konwersję ofertyPRICE_INCREASE
4Produkt nie był dostępny do kupienia przy odnowieniuPRODUCT_NOT_FOR_SALE
5Inny powódBrak 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 PlayApple App Store
Pyta użytkownika o powódTak, ankieta rezygnacjiBrak ankiety widocznej dla dewelopera
Gdzie jest powódcanceledStateContext w purchases.subscriptionsv2expirationIntent w informacjach o odnowieniu
Wolny tekstreasonUserInput, tylko dla inneBrak
Kto anulowałUżytkownik, system, deweloper lub zamianaWnioskowane z kodu i podtypu
PowiadomienieSUBSCRIPTION_CANCELED, potem wywołanie getDID_CHANGE_RENEWAL_STATUS, EXPIRED
Tracone po ponownej subskrypcjiTak, czyszczone przy przywróceniuInformacje o odnowieniu pokazują bieżący stan
PanelKarta odpowiedzi z ankiety rezygnacjiBrak dla powodów
Wydrukowane karty ankiet posortowane w małe stosy na drewnianym stole obok telefonu i filiżanki kawy, tak jak deweloper grupuje powody anulowania subskrypcji

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

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