Wszystkie artykuły
Deep dive8 min czytania

Zwroty za subskrypcje nie działają jak zwroty za zakupy jednorazowe, a to sklep, w którym jesteś, decyduje, ile masz do powiedzenia

Zwrot za subskrypcję cofa cały okres rozliczeniowy, nie pojedynczą sprzedaż. W App Store decyduje Apple, a Twój serwer poznaje jedynie wynik. W Google Play sam wybierasz zwrot pełny lub proporcjonalny. Oto jak każdy sklep obsługuje zwroty za subskrypcje i ile kosztuje Cię jeden z nich.

Kalendarz ścienny z zakreślonymi cyklicznymi miesięcznymi datami rozliczeń, karta kredytowa w poprzek niego i monety wepchnięte częściowo z powrotem, ilustrujące, jak zwroty za subskrypcje cofają okres rozliczeniowy

Najważniejsze wnioski

  • Zwrot za subskrypcję to nie to samo co zwrot jednorazowy. Jednostką, która się cofa, jest okres rozliczeniowy, a w obu sklepach zwrot za zamówienie subskrypcji anuluje subskrypcję i odcina dostęp.
  • W App Store Apple decyduje o każdym zwrocie za subskrypcję. Klient zwraca się do Apple na reportaproblem.apple.com, Apple orzeka, a Twój serwer poznaje wynik jedynie przez powiadomienie REFUND, REFUND_DECLINED lub REFUND_REVERSED.
  • Gdy Apple przyzna zwrot za subskrypcję, transakcja otrzymuje revocationDate, a autoRenewStatus subskrypcji zostaje ustawiony na false, więc przestaje się odnawiać, a klient traci dostęp.
  • Apple mierzy subskrypcję automatycznie odnawialną upływem czasu, nie Twoimi wskaźnikami użycia. Ktoś sześć miesięcy w planie rocznym zużył około 50 procent, a GRANT_PRORATED to jedyna refundPreference, jaką możesz dla niej wyrazić.
  • W Google Play sam wydajesz zwrot. purchases.subscriptionsv2.revoke przyjmuje albo fullRefund, który zwraca cały bieżący okres, albo proratedRefund, który zwraca jedynie niewykorzystany czas uprawnienia.
  • To, które zamówienie zwrócisz w Google Play, zmienia wynik. Zwróć najnowsze zamówienie, a subskrypcja zostaje natychmiast usunięta, z anulowanymi przyszłymi odnowieniami. Zwróć starsze zamówienie, a subskrypcja pozostaje aktywna.
  • Limity w Google Play są surowe. Zamówień starszych niż trzy lata nie można zwrócić, zwroty częściowe działają tylko dla zamówień złożonych po marcu 2018, nie dotyczą płatnych aplikacji, a żadnego zwrotu nie da się cofnąć po jego wydaniu.

Zwrot za subskrypcję i zwrot za pojedynczy zakup w aplikacji sprawiają wrażenie tego samego przycisku. Nie są. Zakup jednorazowy to jedno obciążenie, które oddajesz. Subskrypcja to obciążenie cykliczne z przypisanym żywym uprawnieniem, więc zwroty za subskrypcje muszą odpowiedzieć na dwa pytania, których zwrot jednorazowy nigdy nie zadaje: ile bieżącego okresu oddajesz i czy subskrypcja działa dalej. App Store i Google Play odpowiadają na te dwa pytania w przeciwny sposób, a ta różnica decyduje, ile masz kontroli i ile pieniędzy opuszcza Twoje konto.

Oto krótka mapa. W App Store to Apple jest właścicielem decyzji, a Ty dowiadujesz się po fakcie. W Google Play trzymasz stery i sam wybierasz pełny lub proporcjonalny. To przeprowadza przez oba sklepy, dokładne pola i powiadomienia, których każdy używa, które zamówienie ruszasz, gdy subskrypcja była rozliczana wiele razy, i ile zwrot za subskrypcję faktycznie kosztuje, gdy doliczysz obliczenia, które już wydałeś.

Czym zwroty za subskrypcje różnią się od zwrotów jednorazowych

Oba sklepy traktują zwrot jako cofnięcie konkretnego zamówienia. Dla zakupu jednorazowego jest tylko jedno zamówienie, więc nie ma czego wybierać. Subskrypcja to łańcuch zamówień, po jednym na okres rozliczeniowy, z uprawnieniem, które jest aktywne albo nie. Ta struktura sprawia, że zwrot za subskrypcję niesie wybory, których zwrot jednorazowy nie ma.

Jednostką, która się cofa, jest okres rozliczeniowy

Gdy zwracasz subskrypcję, nie oddajesz płatności z całego życia. Działasz na jednym zamówieniu w łańcuchu, zwykle najnowszym, które jest pojedynczym okresem rozliczeniowym. Zwrot pełny oddaje cały ten okres. Zwrot proporcjonalny oddaje tylko tę część okresu, której klient jeszcze nie wykorzystał. Tak czy inaczej sprzedaż, którą cofasz, to cena jednego okresu, nie cała historia klienta z aplikacją.

Kto decyduje, to prawdziwa różnica

Ostrzejszy podział to władza. W App Store Apple decyduje, czy zwrot za subskrypcję w ogóle nastąpi, a Ty dostarczasz co najwyżej kontekst. W Google Play decydujesz Ty, a API robi dokładnie to, co mu każesz. Ten sam wynik dla klienta, zupełnie inne miejsce dla dewelopera, i to zmienia, co budujesz, aby obsłużyć każdy z nich.

Jak App Store obsługuje zwrot za subskrypcję

Po stronie Apple jesteś widzem z małym mikrofonem. Klient rozmawia z Apple, Apple podejmuje decyzję, a Twój serwer odczytuje wynik.

Klient pyta Apple, a Apple orzeka

Klient App Store żąda zwrotu za subskrypcję na reportaproblem.apple.com, nie u Ciebie. Apple ocenia żądanie na podstawie własnych sygnałów i decyduje. Ty go nie zatwierdzasz i nie ma przycisku w konsoli Apple, który pozwoliłby Ci wydać zwrot za subskrypcję tak, jak umożliwia to Google Play. Apple ma do 90 dni od zakupu na przyjęcie żądania do rozpatrzenia, a gdy już orzeknie, decyzja należy do Apple.

Co widzi Twój serwer, gdy zwrot dociera

Wynik poznajesz przez App Store Server Notifications V2. Przyznany zwrot przychodzi jako powiadomienie REFUND, a transakcja niesie teraz revocationDate oznaczające, kiedy dostęp ma się zakończyć. autoRenewStatus subskrypcji zostaje ustawiony na false, więc przestaje się odnawiać, a klient traci uprawnienie. Jeśli Apple odrzuci żądanie, dostajesz REFUND_DECLINED, a jeśli Apple później cofnie już przyznany zwrot, dostajesz REFUND_REVERSED i subskrypcja wraca. Twoim zadaniem jest odczytać je i przełączyć dostęp, nie oddawać głosu.

PowiadomienieCo oznaczaCo robisz
REFUNDApple przyznał zwrot; transakcja otrzymuje revocationDateOdbierz dostęp, traktuj autoRenewStatus jako false
REFUND_DECLINEDApple odrzucił żądanie zwrotu klientaNic się nie zmienia; subskrypcja pozostaje
REFUND_REVERSEDApple cofnął przyznany zwrotPrzywróć dostęp i sprzedaż

Apple mierzy subskrypcję czasem, nie Twoimi wskaźnikami

Dla produktu zużywalnego możesz powiedzieć Apple, ile zostało zużyte, przez dane o konsumpcji. Dla subskrypcji automatycznie odnawialnej Apple sam oblicza konsumpcję z upływu czasu. Własny przykład Apple to klient sześć miesięcy w subskrypcji rocznej, który zużył około 50 procent. Twoje wskaźniki użycia nie ustalają więc liczby dla subskrypcji. Jedyną dźwignią, którą możesz pociągnąć, jest refundPreference, a dla subskrypcji istotną wartością jest GRANT_PRORATED, który mówi, że wolałbyś, aby Apple zwrócił tylko niewykorzystaną część. To preferencja, nie decyzja. Apple i tak orzeka.

Jak Google Play obsługuje zwrot za subskrypcję

Google Play składa decyzję w Twoje ręce. Jest ekran Play Console i zestaw metod API, które pozwalają zwrócić subskrypcję bezpośrednio, wybrać ile, i zdecydować, czy dostęp się kończy. To postawa przeciwna do Apple, i niesie wybory, które musisz trafnie podjąć.

Pełny czy proporcjonalny, i to Twoja decyzja

Obecny sposób na zwrot i odwołanie subskrypcji to purchases.subscriptionsv2.revoke, wywoływany z revocationContext. Przekaż fullRefund, a Google Play zakończy subskrypcję i zwróci pełną kwotę bieżącego okresu rozliczeniowego. Przekaż proratedRefund, a Google Play zakończy subskrypcję i zwróci jedynie pozostały, niewykorzystany czas uprawnienia. Starsza metoda potrafiła tylko zwroty pełne, co jest powodem, by używać nowszej. Odwołanie proporcjonalne to ciało z dwóch linii, revocationContext otaczający proratedRefund, a wymieniasz na fullRefund dla całego okresu. Każde odwołanie wyzwala powiadomienie deweloperskie w czasie rzeczywistym SUBSCRIPTION_REVOKED, które jest Twoim sygnałem, by odciąć dostęp.

To, które zamówienie zwrócisz, zmienia to, co się dzieje

Google Play pozwala też zwrócić zamówienie bez odwoływania, przez orders.refund, i tutaj gryzie subtelna reguła. Jeśli zwrócisz najnowsze zamówienie subskrypcji, zamówienie zostaje zwrócone, subskrypcja natychmiast usunięta, a przyszłe cykle anulowane. Jeśli zwrócisz starsze zamówienie w łańcuchu, to zamówienie zostaje zwrócone, ale subskrypcja pozostaje aktywna. W orders.refund parametr revoke odwołuje tylko wtedy, gdy zamówienie jest najnowsze, więc aby zakończyć dostęp przy aktywnej subskrypcji, używasz zamiast tego purchases.subscriptionsv2.revoke.

DziałanieZwrócone zamówienieCo dzieje się z subskrypcją
Zwrot najnowszego zamówieniaOstatni okres rozliczeniowyUsunięta natychmiast, przyszłe odnowienia anulowane
Zwrot starszego zamówieniaMiniony okres rozliczeniowyPozostaje aktywna, odnawia się dalej
subscriptionsv2.revoke, pełny lub proporcjonalnyBieżący okresZakończona teraz, wysłane SUBSCRIPTION_REVOKED
Dwa smartfony obok siebie na ciemnym biurku pokazujące ekrany płatności za subskrypcję, z częściowym stosem zwróconych monet między nimi, ilustrujące zwrot pełny kontra proporcjonalny za subskrypcję w App Store i Google Play

Limity, o które potykają się deweloperzy

Kilka twardych krawędzi łapie ludzi, i żadna z nich nie leży na szczęśliwej ścieżce.

  • Zamówień starszych niż trzy lata w ogóle nie można zwrócić.
  • Zwroty częściowe działają tylko dla zamówień złożonych po marcu 2018 i nigdy dla zakupów płatnych aplikacji.
  • Możesz nakładać wiele zwrotów częściowych na jedno zamówienie, ale nie do wysokości sumy zamówienia ani ponad nią.
  • Zwrotu nie da się cofnąć po jego wydaniu.

Google Play zwykle zwraca decyzję o zwrocie w ciągu dnia, choć może to potrwać do czterech. Zaplanuj to opóźnienie, gdy zwrot musi odzwierciedlić się w Twoich własnych kontrolach dostępu.

Ile naprawdę kosztuje Cię zwrot za subskrypcję

Zwrócone obciążenie nigdy nie jest całym rachunkiem. W chwili, gdy zamówienie subskrypcji zostało dostarczone, wydałeś już na nie prawdziwe pieniądze: obliczenia, wywołania API modelu, magazyn i wszelkie wypłaty powiązane z tym okresem. Zwrot oddaje sprzedaż. Nie oddaje tego, co wydałeś, aby ją obsłużyć. Przy subskrypcji kształt straty zależy od tego, który zwrot wydajesz.

Pełny kontra proporcjonalny to decyzja o pieniądzach

Zwrot pełny w Google Play oddaje cały bieżący okres, więc tracisz cały przychód okresu, zachowując każdy koszt, który już w tym okresie poniosłeś. Zwrot proporcjonalny oddaje tylko niewykorzystany plasterek, więc zachowujesz przychód za część, którą klient faktycznie miał. Jeśli klient jest w 60 procentach przez okres miesięczny w planie za 10 dolarów, zwrot pełny kosztuje Cię pełne 10 dolarów, a zwrot proporcjonalny kosztuje około 4 dolarów, niewykorzystane 40 procent. Apple stosuje po swojej stronie tę samą logikę upływu czasu, gdy ustala wielkość zwrotu za subskrypcję.

Rodzaj zwrotuCo klient odzyskujeCo zachowujesz
Zwrot pełnyCały bieżący okres, 10.00Nic z tego okresu
Zwrot proporcjonalnyNiewykorzystane 40 procent, około 4.00Wykorzystane 60 procent, około 6.00

Koszty, które nigdy nie wracają

Który zwrot byś nie wydał, dalsze koszty tego okresu przepadły. Wywołanie API modelu, za które zapłaciłeś, wyrenderowane wideo, przygotowany magazyn, wypłata dla twórcy, którą już wysłałeś, nic z tego nie cofa się, gdy zwrot za subskrypcję przechodzi. Ustal wielkość zwrotu na tym, co klient faktycznie wykorzystał, nigdy na tym, jak dawno się zapisał, bo upływ czasu nie jest kosztem i żaden sklep tak go nie traktuje. A po 3 sierpnia 2026, jeśli obciążenie za subskrypcję Google Play kończy się chargebackiem bankowym zamiast zwrotem, który wydajesz, ponosisz dodatkowo opłatę chargeback banku, której unika zwrot przyznany przez Ciebie najpierw.

Jak obsługiwać zwroty za subskrypcje bez czuwającej osoby

Nic z tego nie powinno czekać na kogoś czytającego pulpit. Powiadomienia przychodzą o każdej godzinie, a dostęp powinien przełączyć się w chwili, gdy zwrot dociera, nie następnego ranka.

Odczytaj wynik i odbierz dostęp w obu sklepach

W App Store nasłuchuj REFUND, REFUND_DECLINED i REFUND_REVERSED, i użyj revocationDate oraz autoRenewStatus, aby automatycznie zakończyć lub przywrócić dostęp. W Google Play nasłuchuj SUBSCRIPTION_REVOKED i sygnałów o unieważnionych zakupach i zrób to samo. To hydraulika, którą RefundHalt prowadzi za Ciebie: powiadomienie wchodzi, konto dopasowane, dostęp przełączony, żadnej osoby w pętli.

Miej dowody gotowe przed sporem

Wąskie okna, które faktycznie proszą o Twój wkład, 12-godzinny CONSUMPTION_REQUEST Apple dla produktów zużywalnych i 24-godzinny przegląd chargeback Google Play, pomagają tylko wtedy, gdy dowód już istnieje. Dołącz do każdego zakupu identyfikator konta, appAccountToken UUID w Apple i zahaszowany setObfuscatedAccountId o długości 64 znaków lub mniej w Google Play, i rejestruj, co dostarczył każdy opłacony okres. Wtedy gdy token dociera, sprawa jest już zbudowana, a odpowiedź w oknie to zadanie maszyny, nie panika.

Często zadawane pytania

Czy zwrot za subskrypcję różni się od zwrotu za zakup jednorazowy?
Tak. Zakup jednorazowy to pojedyncze zamówienie, które oddajesz. Subskrypcja to łańcuch zamówień z żywym uprawnieniem, więc zwrot za subskrypcję działa na jednym okresie rozliczeniowym i zarazem decyduje, czy subskrypcja działa dalej. Zarówno w App Store, jak i w Google Play zwrot za zamówienie subskrypcji anuluje subskrypcję i kończy dostęp, a często możesz wybrać między zwrotem całego okresu a jedynie niewykorzystanej części.
Czy deweloper może wydać zwrot za subskrypcję App Store bezpośrednio?
Nie. O zwrotach za subskrypcje App Store decyduje Apple. Klient żąda go na reportaproblem.apple.com, Apple orzeka, a Ty poznajesz wynik przez powiadomienie REFUND, REFUND_DECLINED lub REFUND_REVERSED. Jedynym wkładem, jaki możesz zaoferować, jest refundPreference, taka jak GRANT_PRORATED, a Apple traktuje ją jako preferencję, nie decyzję.
Jak wydać proporcjonalny zwrot za subskrypcję w Google Play?
Wywołaj purchases.subscriptionsv2.revoke z revocationContext ustawionym na proratedRefund. Google Play zakończy subskrypcję i zwróci jedynie pozostały, niewykorzystany czas uprawnienia, a następnie wyśle powiadomienie SUBSCRIPTION_REVOKED. Przekaż zamiast tego fullRefund, aby zwrócić cały bieżący okres. Starsza metoda revoke potrafiła tylko zwroty pełne.
Dlaczego mój zwrot w Google Play nie anulował subskrypcji?
Bo zwróciłeś starsze zamówienie w łańcuchu. W Google Play zwrot najnowszego zamówienia usuwa subskrypcję natychmiast i anuluje przyszłe odnowienia, ale zwrot starszego zamówienia zwraca ten okres, podczas gdy subskrypcja pozostaje aktywna. Parametr revoke w orders.refund odwołuje tylko wtedy, gdy zamówienie jest najnowsze, więc aby zakończyć aktywną subskrypcję, użyj purchases.subscriptionsv2.revoke.
Jak daleko wstecz można zwrócić zamówienie subskrypcji?
W Google Play zamówień starszych niż trzy lata nie można zwrócić. Zwroty częściowe działają tylko dla zamówień złożonych po marcu 2018 i nigdy dla płatnych aplikacji, a żadnego zwrotu nie da się cofnąć po jego wydaniu. W App Store Apple przyjmuje żądania zwrotu od klientów do 90 dni od zakupu i decyduje o każdym samodzielnie.

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