Wszystkie artykuły
Poradnik8 min czytania

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.

iPhone, telefon z Androidem i laptop obok siebie na biurku, każde urządzenie zalogowane na to samo konto wieloplatformowej subskrypcji

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łaconoKto decyduje o zwrocieSkąd Twój serwer się o nim dowiadujeKto może zatrzymać odnowienia
App StoreApplePowiadomienie REFUND w App Store Server Notifications V2Klient, w ustawieniach subskrypcji App Store lub na ekranie zarządzania otwieranym przez Twoją aplikację
Google PlayGoogle przez pierwsze 48 godzin, potem Ty lub GoogleVoided Purchases API i powiadomienia dla deweloperów w czasie rzeczywistymKlient albo Ty przez purchases.subscriptionsv2.cancel
Twoja stronaTyWebhooki Twojego operatora płatnościTy

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ępuKto za to płaci
Moc obliczeniowa serwera dla każdej sesji na Androidzie lub w sieciTy
Wywołania API u zewnętrznych dostawców wykonywane przez Twoje funkcjeTy
Miejsce na pliki i historię użytkownikaTy
Wypłaty dla twórców za użycie lub wyświetlenieTy
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
Dłoń trzymająca smartfon obok otwartego laptopa, z drugim telefonem leżącym ekranem w dół, codzienny zestaw użytkownika wieloplatformowej subskrypcji

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

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