Apple i Google zwracają pieniądze tylko we własnym sklepie, więc Twoja wieloplatformowa subskrypcja musi odebrać dostęp wszędzie indziej
Gdy Apple lub Google zwraca pieniądze za wieloplatformową subskrypcję, Twoja aplikacja na Androida, aplikacja na iPhone'a i strona internetowa same się o tym nie dowiedzą. Oto jak powiązać każdy zakup w sklepie z jednym kontem, odebrać właściwe uprawnienie i przestać płacić za obsługę użytkowników, którzy dostali zwrot.

Najważniejsze wnioski
- Wytyczna Apple App Review Guideline 3.1.3(b) pozwala aplikacjom działającym na wielu platformach udostępniać użytkownikom treści i subskrypcje kupione na innych platformach lub na stronie dewelopera, o ile te same pozycje są dostępne również jako zakupy w aplikacji.
- Apple i Google zwracają pieniądze tylko za zakupy z własnego sklepu, więc zwrot od Apple za wieloplatformową subskrypcję nie dociera do rozliczeń klienta w Google Play ani w sieci. Serwer dewelopera musi odebrać przyznany dostęp na każdej platformie.
- Apple wysyła powiadomienie REFUND przez App Store Server Notifications V2, gdy zwraca pieniądze za produkt konsumpcyjny, niekonsumpcyjny, subskrypcję nieodnawialną lub subskrypcję odnawianą automatycznie, i zaznacza, że to deweloper odpowiada za przechowywanie, monitorowanie i obsługę każdej zwróconej transakcji.
- appAccountToken od Apple to UUID, który deweloper dołącza do zakupu w aplikacji. Endpoint Set App Account Token w App Store Server API pozwala dodać go później do zakupów dokonanych poza aplikacją, na przykład po realizacji kodu promocyjnego.
- setObfuscatedAccountId w Google Play wiąże zakup z kontem w aplikacji dewelopera, ma limit 64 znaków i powoduje blokowanie zakupów, jeśli zawiera dane osobowe w postaci jawnej, na przykład adres e-mail.
- Voided Purchases API w Google Play zgłasza zakupy zwrócone i objęte chargebackiem, podając orderId oraz voidedSource o wartości 0 dla użytkownika, 1 dla dewelopera lub 2 dla Google.
- W przypadku zamówień w Google Play złożonych po 3 sierpnia 2026 r. deweloper po uznaniu chargebacku płaci cenę zakupu pomniejszoną o opłatę serwisową Play oraz opłaty banku za chargeback.
Twój subskrybent zapłacił Apple, tego samego popołudnia otworzył Twoją aplikację na Androida, a teraz korzysta z Twojej strony w pracy. Potem Apple zwraca mu pieniądze. Google Play o tym nie wie. Twój system rozliczeń w sieci o tym nie wie. Jeśli Twój własny serwer nie odbierze dostępu, zwrócona wieloplatformowa subskrypcja działa dalej na każdym ekranie, który odczytuje Twoją bazę kont. Sklepy zwracają pieniądze osobno, każdy w swoim sklepie, a Twój system kont to jedyne miejsce, w którym istnieje cała subskrypcja. Dlatego tylko on może ją zakończyć.
Dlaczego zwrot w jednym sklepie nie kończy wieloplatformowej subskrypcji
Apple wprost dopuszcza taki model. App Review Guideline 3.1.3(b), Multiplatform Services, stanowi, że aplikacje działające na wielu platformach mogą dawać użytkownikom dostęp do treści, subskrypcji lub funkcji kupionych w Twojej aplikacji na innych platformach lub na Twojej stronie, pod warunkiem że te pozycje są dostępne również jako zakupy w aplikacji.
Przewodnik Apple o oferowaniu jednej subskrypcji w kilku aplikacjach opisuje, jak to działa w praktyce. Twój serwer przyznaje dostęp na podstawie wspólnej bazy kont, a każda aplikacja z niej czyta. Ten sam przewodnik ostrzega, że jeśli zakup nie zostanie przekazany do pozostałych aplikacji, użytkownik może zapłacić za tę samą usługę więcej niż raz.
Taka architektura ma konsekwencję, którą łatwo przeoczyć. Uprawnienie jest zapisane w Twojej bazie, ale każdy sklep zna tylko własne potwierdzenia zakupu. Apple może zwrócić pieniądze za zakup na iPhonie i poinformować o tym Twój serwer. Nie może jednak nic przekazać Twojej aplikacji na Androida ani stronie. Jeśli obsługa zwrotów aktualizuje tylko klienta iOS, klient odzyskuje pieniądze i zachowuje subskrypcję wszędzie indziej.
| Gdzie zapłacono | Kto decyduje o zwrocie | Skąd Twój serwer się o nim dowiaduje | Kto może zatrzymać odnowienia |
|---|---|---|---|
| App Store | Apple | Powiadomienie REFUND w App Store Server Notifications V2 | Klient, w ustawieniach subskrypcji App Store lub na ekranie zarządzania otwieranym przez Twoją aplikację |
| Google Play | Google przez pierwsze 48 godzin, potem Ty lub Google | Voided Purchases API i powiadomienia dla deweloperów w czasie rzeczywistym | Klient albo Ty przez purchases.subscriptionsv2.cancel |
| Twoja strona | Ty | Webhooki Twojego operatora płatności | Ty |
Jak odebrać dostęp na każdej platformie po zwrocie
Powiąż każdy zakup w sklepie z jednym kontem
Najtrudniejsze jest przypisanie zwrotu do konkretnej osoby, bo każdy sklep identyfikuje kupującego na swój sposób. Oba udostępniają pole na Twój własny identyfikator konta. Używaj go przy każdym zakupie.
- W Apple ustaw appAccountToken, czyli wygenerowany przez Ciebie UUID, w momencie rozpoczęcia zakupu. App Store zwraca ten sam UUID w informacjach o transakcji i odnowieniu. Apple podaje, że jedną wartość możesz używać dla wszystkich transakcji tego samego klienta.
- Jeśli klient kupił poza Twoją aplikacją, na przykład realizując kod promocyjny w App Store, transakcja nie ma tokenu. Dodaje go endpoint Set App Account Token. W przypadku subskrypcji odnawianej automatycznie obejmuje on bieżące i kolejne odnowienia, a nie wcześniejsze transakcje, i nie działa dla zakupów udostępnianych w ramach Chmury rodzinnej.
- W Google Play przekaż zanonimizowany identyfikator konta przez setObfuscatedAccountId przy uruchamianiu procesu płatności. Ma on limit 64 znaków. Google podaje, że dane osobowe w postaci jawnej, na przykład adres e-mail, powodują blokowanie zakupów, i zaleca szyfrowanie lub jednokierunkowy hash.
Nasłuchuj obu sklepów i zapisuj jedno uprawnienie
Apple wysyła REFUND, gdy zwraca pieniądze za dowolny typ produktu, w tym subskrypcje odnawiane automatycznie. Wysyła REFUND_REVERSED, gdy cofa przyznany już zwrot z powodu sporu zgłoszonego przez klienta. W Google Play Voided Purchases API wymienia zakupy zwrócone i objęte chargebackiem, każdy z orderId wskazującym dokładny zakup lub odnowienie. Twój operator płatności w sieci wysyła własne zdarzenie zwrotu. Wszystkie trzy powinny trafiać do tej samej procedury obsługi i zmieniać ten sam rekord.
Odbierz uprawnienie, nie konto
Zwrot anuluje zakup, a nie osobę. Usuń dostęp wynikający ze zwróconego zakupu, a potem przelicz, co konto nadal posiada. Jeśli klient ma też aktywną subskrypcję z innego sklepu, zachowuje dostęp dzięki niej. Jeśli nie, każdy klient aplikacji traci funkcje premium przy najbliższym sprawdzeniu na Twoim serwerze.
Gdy ta sama osoba subskrybuje w dwóch sklepach
Podwójne subskrypcje to druga połowa problemu. Ktoś subskrybuje na Androidzie, kupuje nowego iPhone'a, nie loguje się i subskrybuje ponownie. Teraz płaci dwa razy za jedną usługę, a jedno z tych obciążeń zwykle kończy się prośbą o zwrot. Zespół Apple ds. handlu, odpowiadając deweloperowi na Apple Developer Forums, ujął to prosto: system kont aplikacji powinien zawierać logikę, która zapobiega podwójnemu zakupowi na innej platformie.
Sprawdź każdy sklep przed pokazaniem paywalla
Zaloguj użytkownika przed paywallem, sprawdź na serwerze wszystkie jego aktywne zakupy i pomiń ofertę, jeśli którykolwiek z nich obejmuje tę platformę. To jedno sprawdzenie zapobiega większości podwójnych obciążeń, zanim do nich dojdzie.
Za który zakup zwrócić pieniądze, jeśli do tego już doszło?
Za ten, o którym decydujesz Ty. W Google Play możesz sam przyznać zwrot w Play Console, a purchases.subscriptionsv2.cancel z DEVELOPER_REQUESTED_STOP_PAYMENTS zatrzymuje kolejną płatność. Subskrypcję w sieci możesz po prostu zwrócić sam. O zwrotach w App Store decyduje Apple, więc jeśli duplikat jest na iPhonie, klient składa wniosek do Apple, a Twoja aplikacja może otworzyć ten wniosek za pomocą API do żądania zwrotu w StoreKit.
Ile kosztuje Cię zwrot, który pominął jakąś platformę
Zwrócona cena to dopiero pierwsza strata. Klient, którego zwrot od Apple nigdy nie dotarł do Twojej aplikacji na Androida ani strony, dalej korzysta z tego, za czego utrzymanie płacisz. Każda sesja nadal zużywa moc obliczeniową. Każda funkcja AI nadal wykonuje wywołania API u zewnętrznych dostawców, za które dostajesz rachunek. Jego pliki nadal zajmują miejsce, a jeśli Twoja aplikacja płaci twórcom za wyświetlenie lub użycie, te wypłaty nadal wychodzą. Przy planie rocznym może to oznaczać cały rok kosztów obsługi konta, które już nic nie płaci.
Droga przez bank pogarsza sprawę. W przypadku zamówień w Google Play złożonych po 3 sierpnia 2026 r. Google podaje, że po uznaniu chargebacku deweloper odpowiada za cenę zakupu pomniejszoną o opłatę serwisową Play oraz za opłaty za chargeback naliczone przez instytucję finansową. Chargeback jest w banku ostateczny. Klient, który zrobił chargeback i nadal ma dostęp, kosztuje Cię jednocześnie cenę, opłaty i koszty obsługi.
| Co działa dalej po pominiętym odebraniu dostępu | Kto za to płaci |
|---|---|
| Moc obliczeniowa serwera dla każdej sesji na Androidzie lub w sieci | Ty |
| Wywołania API u zewnętrznych dostawców wykonywane przez Twoje funkcje | Ty |
| Miejsce na pliki i historię użytkownika | Ty |
| Wypłaty dla twórców za użycie lub wyświetlenie | Ty |
| Opłaty za chargeback przy zamówieniu w Google Play po 3 sierpnia 2026 r. | Ty, oprócz ceny zakupu pomniejszonej o opłatę serwisową Play |

Korzystanie na wielu platformach to nadal dowód
Jedno konto na wszystkich platformach pomaga też wtedy, gdy sklep pyta o Twoje stanowisko. Informacje o zużyciu w Apple dotyczą tego, jaką część produktu konsumpcyjnego, niekonsumpcyjnego lub subskrypcji nieodnawialnej klient wykorzystał. W przypadku subskrypcji odnawianych automatycznie nie wysyłasz wartości procentowej, bo Apple wylicza ją na podstawie upływu czasu. Weryfikacja chargebacków w Google Play przyjmuje do 1000 zdarzeń użycia, z których każde może zawierać zanonimizowany identyfikator konta. Użycie zapisane pod jednym identyfikatorem konta, niezależnie od urządzenia, to użycie, które możesz wykazać.
Przy których zwrotach nikt nie pyta o Twoje stanowisko
O większości zwrotów decyduje się bez Ciebie. Google Play może zwrócić pieniądze za zakup w ciągu 48 godzin we własnym procesie zwrotów. Zwroty przez wsparcie sklepu, anulowane zakupy i automatyczny zwrot Google za zakupy, których nigdy nie potwierdzisz, po około 72 godzinach, następują najpierw, a zgłaszane są dopiero później. W takich przypadkach opisana wyżej logika odbierania dostępu to całe zadanie.
Tylko dwa procesy proszą o dowody. CONSUMPTION_REQUEST od Apple daje Ci 12 godzin na przesłanie informacji o zużyciu. Weryfikacja chargebacków w Google Play daje Ci 24 godziny od PendingRefundReviewNotification na odpowiedź przez orders.reviewrefund, a Google uwzględnia tylko Twoje pierwsze wywołanie. RefundHalt odpowiada w obu przypadkach w terminie, na podstawie danych o użyciu, które już zbierasz, przypisanych do tego samego konta we wszystkich Twoich aplikacjach.
Krótka lista kontrolna dla zwrotów wieloplatformowych
- Ustawiaj appAccountToken przy zakupach w Apple i zanonimizowany identyfikator konta przy zakupach w Google Play.
- Uzupełniaj brakujące tokeny Apple przez Set App Account Token przy realizacji kodów promocyjnych.
- Kieruj REFUND i REFUND_REVERSED od Apple, anulowane zakupy z Google Play i zwroty w sieci do jednej procedury obsługi.
- Zapisuj każdy zakup razem z jego źródłem i wyliczaj dostęp na podstawie wszystkich aktywnych zakupów.
- Sprawdzaj zakupy we wszystkich sklepach, zanim pokażesz paywall na dowolnej platformie.
Często zadawane pytania
- Czy mogę dać użytkownikom iPhone'a dostęp do subskrypcji kupionej na Androidzie lub na mojej stronie?
- Tak. App Review Guideline 3.1.3(b) od Apple pozwala aplikacjom działającym na wielu platformach dawać użytkownikom dostęp do treści, subskrypcji lub funkcji kupionych na innych platformach lub na Twojej stronie, o ile te pozycje są dostępne również jako zakupy w aplikacji na iPhone'a.
- Jeśli Apple zwróci pieniądze subskrybentowi, czy Google Play lub moje rozliczenia w sieci się o tym dowiedzą?
- Nie. Apple informuje Twój serwer przez powiadomienie REFUND w App Store Server Notifications V2 i nikogo więcej. Twój serwer musi odebrać dostęp, który ten zakup przyznał na Androidzie, w sieci i wszędzie tam, gdzie konto się loguje.
- Jak przypisać zwrot w App Store do konta użytkownika?
- Użyj appAccountToken, czyli UUID, który Twoja aplikacja dołącza do zakupu, a App Store zwraca w informacjach o transakcji. W przypadku zakupów poza aplikacją, na przykład realizacji kodu promocyjnego, endpoint Set App Account Token od Apple dodaje lub zastępuje token. Nie obsługuje transakcji z Chmury rodzinnej.
- Klient ma subskrypcję zarówno w App Store, jak i w Google Play. Którą powinienem zwrócić?
- Tę, o której decydujesz Ty. Zamówienie w Google Play możesz zwrócić w Play Console, a kolejną płatność zatrzymać przez purchases.subscriptionsv2.cancel. O zwrotach w App Store decyduje Apple, więc duplikat na iPhonie przechodzi przez wniosek o zwrot do Apple, który Twoja aplikacja może otworzyć za pomocą StoreKit.
- Czy korzystanie z mojej strony lub aplikacji na Androida liczy się jako dowód przy weryfikacji zwrotu?
- Użycie zapisane pod jednym kontem może wesprzeć Twoją odpowiedź. Informacje o zużyciu w Apple dotyczą tego, jaka część produktu konsumpcyjnego, niekonsumpcyjnego lub subskrypcji nieodnawialnej została wykorzystana, a weryfikacja chargebacków w Google Play przyjmuje do 1000 zdarzeń użycia, które mogą zawierać zanonimizowany identyfikator konta.
Źródła i materiały dodatkowe
- Apple: App Review Guidelines, 3.1.3(b) Multiplatform Services
- Apple Developer Documentation: Offering a subscription across multiple apps
- Apple Developer Documentation: Handling refund notifications
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: Set App Account Token
- Android Developers: BillingFlowParams.Builder, setObfuscatedAccountId
- Google Play Developer API: purchases.voidedpurchases
- Google 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.