Retention Messaging API od Apple umieszcza twoje słowa na ekranie anulowania, ale prośby o zwrot nigdy przez niego nie przechodzą
Retention Messaging API od Apple pozwala pokazać wiadomość, zmianę planu albo ofertę promocyjną, gdy subskrybent stuka Anuluj. Wyjaśniamy, jak to działa, ile kosztuje utrzymanie i dlaczego prośba o zwrot trafia do Apple, w ogóle nie dotykając tego ekranu.

Najważniejsze wnioski
- Retention Messaging API od Apple pozwala deweloperowi wybrać wiadomość, którą subskrybent na iPhonie zobaczy po stuknięciu Cancel Subscription. Do wyboru są cztery typy: tekst, tekst z obrazem, propozycja zmiany planu albo oferta promocyjna.
- Dokumentacja Apple nadal opisuje Retention Messaging API jako wersję przedpremierową, do której deweloperzy zgłaszają chęć dołączenia. Wersja 1.0 ukazała się 16 lipca 2025 r., a wersja 1.5 27 kwietnia 2026 r.
- W przepływie czasu rzeczywistego Apple wywołuje endpoint Get Retention Message dewelopera, gdy aktywny subskrybent ogląda stronę szczegółów subskrypcji z przyciskiem Anuluj. Endpoint musi odpowiedzieć w produkcji w ciągu 700 ms, inaczej Apple pokaże wiadomość domyślną.
- Wiadomość retencyjna wpływa tylko na przyszłe odnowienia. Prośba o zwrot trafia do Apple przez reportaproblem.apple.com albo okno zwrotu w aplikacji, a ekran anulowania z wiadomościami retencyjnymi nie leży na tej drodze.
- Gdy klient prosi o zwrot w aplikacji przez API próśb o zwrot w StoreKit, Apple sam wyłącza automatyczne odnawianie i wysyła DID_CHANGE_RENEWAL_STATUS z podtypem AUTO_RENEW_DISABLED, czyli ten sam typ i podtyp co przy anulowaniu na stronie ustawień Subscriptions.
- Jedyny wkład dewelopera w zwrot w Apple to CONSUMPTION_REQUEST, na który odpowiada się w ciągu 12 godzin przez Send Consumption Information, i tylko wtedy, gdy klient zgodził się na udostępnienie tych danych.
- Google Play nie ma udokumentowanego odpowiednika wiadomości wybranej przez dewelopera na ekranie anulowania. Deweloperzy dostają potem powiadomienie SUBSCRIPTION_CANCELED, a pole userInitiatedCancellation mówi, dlaczego subskrybent odszedł.
Subskrybentom, którzy stukają Anuluj na iPhonie, można teraz przed potwierdzeniem pokazać wybraną przez ciebie wiadomość, tańszy plan albo rabat. To Retention Messaging API od Apple i pierwszy raz deweloper ma coś do powiedzenia na własnym ekranie anulowania Apple. Wciąż jest to wersja przedpremierowa, do której trzeba się zgłosić. Ma też twardą granicę, ważną, jeśli zależy ci na zwrotach: przemawia do ludzi, którzy zaraz przestaną płacić, a nie do ludzi, którzy chcą odzyskać pieniądze. Takie prośby trafiają do Apple inną drogą.
Co robi Retention Messaging API od Apple
Retention Messaging API to usługa typu serwer-serwer. Z wyprzedzeniem przesyłasz do Apple teksty wiadomości i obrazy, Apple je sprawdza, a potem wybierasz, którą zatwierdzoną wiadomość zobaczy subskrybent, gdy zamierza anulować automatycznie odnawianą subskrypcję. Dokumentacja Apple wymienia cztery typy wiadomości:
- Wiadomość tekstowa, która może zawierać punkty.
- Wiadomość tekstowa z obrazem.
- Wiadomość o zmianie planu, która proponuje inną subskrypcję z tej samej grupy subskrypcji.
- Wiadomość z ofertą promocyjną, która proponuje obniżoną cenę na tym samym lub innym poziomie, z użyciem oferty promocyjnej skonfigurowanej w App Store Connect i podpisanej na twoim serwerze.
Wiadomość pojawia się, gdy klient stuknie Cancel Subscription (Anuluj subskrypcję) na stronie szczegółów subskrypcji. Następnie Apple pokazuje stronę Confirm Cancellation (Potwierdź anulowanie). Klient nadal może anulować, stuknąć Keep Subscription (Zachowaj subskrypcję) albo przyjąć zaproponowaną ofertę lub plan. Nie możesz ukryć wyjścia, a Apple każe deweloperom nie przesyłać treści wprowadzających w błąd ani nieprawdziwych.
Wiadomości domyślne i przepływ czasu rzeczywistego
Są dwa sposoby działania. Prostszy to wiadomości domyślne: tekst, z obrazem lub punktami albo bez nich, przypisany do każdego produktu i ustawienia regionalnego. Bogatszy to przepływ czasu rzeczywistego, w którym Apple wywołuje endpoint Get Retention Message na twoim serwerze, a ty odpowiadasz identyfikatorem wiadomości. Tylko przepływ czasu rzeczywistego może pokazać wiadomości o zmianie planu i z ofertą promocyjną.
W praktyce wiadomości domyślne nie są opcjonalne. Apple używa ich awaryjnie, gdy wywołanie w czasie rzeczywistym się nie powiedzie, i nie pokazuje żadnej wiadomości retencyjnej dla produktu w ustawieniu regionalnym, które nie ma wiadomości domyślnej.
| Element | Co mówi dokumentacja Apple |
|---|---|
| Status | Wersja przedpremierowa, deweloperzy zgłaszają chęć dołączenia |
| Produkty | Subskrypcje odnawiane automatycznie |
| Typy wiadomości | Tekst, tekst z obrazem, zmiana planu, oferta promocyjna |
| Limit odpowiedzi w czasie rzeczywistym | 700 ms w produkcji |
| Dostęp produkcyjny | Najpierw zaliczony test wydajności w sandboxie, około 700 ms |
| Nagłówek i tekst punktów | Po 66 znaków, maksymalnie pięć punktów |
| Tekst główny | 144 znaki |
| Tekst alternatywny obrazu | 150 znaków |
| Wiadomości na aplikację | 2000 |
| Weryfikacja | Nowe wiadomości startują jako PENDING i pojawiają się dopiero po statusie APPROVED |
| Urządzenia | iOS 15.1, iPadOS 15.1, visionOS 1, macOS 14 lub nowsze |
Co Apple przekazuje twojemu serwerowi w wywołaniu w czasie rzeczywistym
Żądanie to JWS podpisany przez App Store. Po zdekodowaniu zawiera originalTransactionId, appAppleId, productId, userLocale, UUID requestIdentifier, środowisko i signedDate. Apple każe sprawdzić, czy appAppleId pasuje do twojej aplikacji, i nie odpowiadać, jeśli nie pasuje. Najbardziej przydatny jest originalTransactionId, bo pozwala sprawdzić, co ten subskrybent faktycznie robił w twojej aplikacji, zanim zdecydujesz, co powiedzieć.
Gdzie pojawia się wiadomość retencyjna, a gdzie nie
Apple umieszcza wiadomość na jednym ekranie: na kroku Confirm Cancellation po stuknięciu Cancel Subscription, na przykład w Apple Account > Subscriptions albo na stronie subskrypcji w App Store. Ten ekran dotyczy tego, czy dojdzie do następnego odnowienia. Nie dotyka pieniędzy już pobranych.
Prośba o zwrot to osobna czynność. Strona pomocy Apple kieruje klientów na reportaproblem.apple.com, gdzie wybierają „Request a refund” (Poproś o zwrot), podają powód i pozycję, a potem czekają 24 do 48 godzin na informację. W twojej aplikacji beginRefundRequest ze StoreKit otwiera okno zwrotu Apple, a według Apple App Store potrzebuje do 48 godzin, by zatwierdzić lub odrzucić prośbę. Żadna z tych dróg nie prowadzi przez ekran Confirm Cancellation.
| Moment | Gdzie to się dzieje | Co jest stawką | Kto decyduje | Twój wkład |
|---|---|---|---|---|
| Anulowanie | Strona szczegółów subskrypcji, potem Confirm Cancellation | Przyszłe odnowienia | Klient | Wybrana przez ciebie wiadomość retencyjna, odpowiedź w ciągu 700 ms |
| Prośba o zwrot | reportaproblem.apple.com albo okno zwrotu w twojej aplikacji | Pieniądze już zapłacone | Apple | Dane CONSUMPTION_REQUEST w ciągu 12 godzin, jeśli klient wyraził zgodę |
Czy wiadomość retencyjna może powstrzymać prośbę o zwrot?
Nie. Prośba o zwrot nigdy nie trafia na ekran, na którym jest wiadomość. Pewien szczegół w dokumentacji powiadomień Apple dobrze to pokazuje. Gdy klient prosi o zwrot w twojej aplikacji przez API próśb o zwrot, Apple sam wyłącza automatyczne odnawianie i wysyła DID_CHANGE_RENEWAL_STATUS z podtypem AUTO_RENEW_DISABLED. Klient, który anuluje na stronie ustawień Subscriptions, generuje ten sam typ i podtyp. Twój serwer widzi jedno powiadomienie dla dwóch bardzo różnych klientów, a tylko jeden z nich widział twoją wiadomość retencyjną.
Jeśli prośba o zwrot idzie dalej, kanałem na dowody jest CONSUMPTION_REQUEST. Apple wysyła go przy prośbach o zwrot dla każdego typu produktu, a ty masz 12 godzin na odpowiedź przez Send Consumption Information. Odpowiadać możesz tylko wtedy, gdy klient wyraził zgodę. Potem decyzja Apple przychodzi jako powiadomienie REFUND albo REFUND_DECLINED, jeśli Apple odrzuci zwrot, o który klient poprosił w twojej aplikacji.
Czy Google Play ma API wiadomości przy anulowaniu?
Nie według dokumentacji Google o cyklu życia subskrypcji. Subskrybent Google Play anuluje w centrum subskrypcji Play, zachowuje dostęp do końca bieżącego okresu rozliczeniowego i do tego czasu może stuknąć Resubscribe (Subskrybuj ponownie), by to cofnąć. Google nazywa to przywróceniem. Dowiadujesz się o tym po fakcie z powiadomienia SUBSCRIPTION_CANCELED, a pole userInitiatedCancellation w zasobie subskrypcji mówi, dlaczego użytkownik odszedł. Wstrzymanie, według Google domyślnie włączone dla wszystkich subskrypcji, to główny wbudowany sposób na ograniczenie dobrowolnych rezygnacji.
Po stronie zwrotów Google Play ma własny kanał na dowody. PendingRefundReviewNotification przychodzi, gdy obciążenie zwrotne (chargeback) wymaga weryfikacji przez dewelopera, a ty masz 24 godziny na odpowiedź przez orders.reviewrefund. Przy zamówieniach złożonych po 3 sierpnia 2026 r. Google przenosi na dewelopera cenę zakupu, pomniejszoną o opłatę serwisową Play, oraz opłaty banku za obciążenie zwrotne, gdy chargeback zostanie uznany.
Ile kosztuje cię ekran anulowania
Retention messaging wygląda na darmowe. Nie jest, a rachunki pojawiają się w trzech miejscach.
Moc obliczeniowa przy każdym wyświetleniu strony
Apple wywołuje twój endpoint, gdy aktywny subskrybent ogląda stronę szczegółów subskrypcji z przyciskiem Anuluj, a nie tylko wtedy, gdy anuluje. Każda wizyta to żądanie, które twój serwer musi uwierzytelnić, sprawdzić i obsłużyć w ciągu 700 ms, inaczej Apple pokaże wiadomość domyślną. To wyklucza funkcję z zimnym startem, która czasem potrzebuje dwóch sekund. Płacisz za stale rozgrzaną moc, plus wszystkie odczyty z bazy danych i płatne wywołania zewnętrznych API, które twoja logika decyzyjna wykonuje przy każdym żądaniu.

Rabat to przychód, z którego sam rezygnujesz
Oferta promocyjna, która zatrzymuje subskrybenta, to realnie zatrzymane pieniądze. Oferta dla kogoś, kto i tak by został, to czysty rabat. Oto ilustracja, nie benchmark. Plan miesięczny za 9,99 $ oferowany za pół ceny przez trzy miesiące oznacza utratę 14,99 $ na każdej przyjętej ofercie. Jeśli co trzecia osoba, która ją przyjmuje, zostałaby i przy pełnej cenie, tysiąc przyjęć kosztuje około 5000 $ rabatu oddanego ludziom, którzy go nie potrzebowali. Po drugiej stronie bilansu są subskrybenci, którzy naprawdę odchodzili.
Zwrot, który prowokuje nieprzyjemne wyjście
Apple zostawia na stronie przycisk Cancel Subscription, więc nikogo nie zatrzymasz w pułapce, ale nadal możesz być uciążliwy. Klient, który czuje się naciskany, ma inną opcję: poprosić Apple o zwrot ostatniej płatności. Gdy zwrot nastąpi, pieniądze wracają, a moc obliczeniowa, przechowywanie danych, wywołania API i ewentualne prowizje afiliacyjne związane z tym subskrybentem pozostają wydane. Tych kosztów żadna wiadomość retencyjna nie odzyska.
Jak korzystać z retention messaging, nie zwiększając odsetka zwrotów
Traktuj ekran anulowania jako miejsce na precyzję, nie na sprytne sztuczki. Kilka zasad trzyma go po właściwej stronie granicy zwrotów:
- Decyduj osobno dla każdego subskrybenta. Użyj originalTransactionId z żądania Apple, by sprawdzić ostatnie użycie. Rabat lub tańszy plan proponuj ludziom, którzy korzystają z produktu. Tym, którzy nie otwierali go od tygodni, pokaż krótką, uczciwą wiadomość.
- Odpowiadaj szybko. Obliczaj decyzję z wyprzedzeniem, gdy zmieniają się dane o użyciu, żeby samo żądanie było jednym odczytem, który spokojnie mieści się w 700 ms.
- Napisz wiadomość domyślną dla każdego produktu i ustawienia regionalnego. Bez niej nieudane wywołanie oznacza brak jakiejkolwiek wiadomości.
- Uważnie obserwuj AUTO_RENEW_DISABLED. Jeśli potem przyjdzie CONSUMPTION_REQUEST dla tego samego originalTransactionId, masz do czynienia z prośbą o zwrot, a nie z anulowaniem, i 12-godzinny zegar już tyka.
- Odpowiadaj na każdy CONSUMPTION_REQUEST, na który możesz odpowiedzieć. RefundHalt wysyła do Apple dokładne dane o użyciu w 12-godzinnym oknie i odpowiada na weryfikację chargebacku w Google Play w ciągu 24 godzin, bo to jedyne dwa momenty, w których któryś ze sklepów pyta o twoją wersję.
Czy warto prosić Apple o dostęp?
Jeśli sprzedajesz subskrypcje odnawiane automatycznie i już obsługujesz App Store Server Notifications V2, raczej tak. Ekran anulowania to ostatnie miejsce, w którym możesz dotrzeć do subskrybenta, zanim odejdzie, a zmiana planu kosztuje mniej niż jego całkowita utrata. Zaplanuj tylko budżet na endpoint, który odpowiada przy każdym wyświetleniu strony subskrypcji, i trzymaj obronę przed zwrotami tam, gdzie zwroty naprawdę się dzieją.
Często zadawane pytania
- Czym jest Retention Messaging API od Apple?
- To API typu serwer-serwer, które pozwala deweloperowi wybrać wiadomość, jaką subskrybent zobaczy po stuknięciu Cancel Subscription przy automatycznie odnawianej subskrypcji. Apple obsługuje cztery typy: tekst, tekst z obrazem, propozycję zmiany planu i ofertę promocyjną. Dokumentacja Apple nadal opisuje je jako wersję przedpremierową, do której deweloperzy zgłaszają chęć dołączenia.
- Jak szybko musi odpowiadać mój endpoint Get Retention Message?
- W ciągu 700 ms w produkcji. Jeśli twój serwer jest wolniejszy albo zawiedzie, Apple pokaże wiadomość domyślną skonfigurowaną dla tego produktu i ustawienia regionalnego, a jeśli jej nie ma, nie pokaże nic. Musisz też zaliczyć test wydajności w sandboxie, przy około 700 ms, zanim Apple pozwoli ustawić produkcyjny URL.
- Czy wiadomość retencyjna pojawia się, gdy klient prosi o zwrot?
- Nie. Apple pokazuje wiadomości retencyjne na ekranie Confirm Cancellation po stuknięciu Cancel Subscription. Prośby o zwrot idą przez reportaproblem.apple.com albo okno zwrotu w aplikacji otwierane przez beginRefundRequest, a jedyny wkład dewelopera to CONSUMPTION_REQUEST, na który odpowiada się w ciągu 12 godzin, jeśli klient wyraził zgodę.
- Jak odróżnić prośbę o zwrot od anulowania w App Store Server Notifications?
- Nie da się tego zrobić na podstawie samego powiadomienia o odnowieniu. Anulowanie na stronie ustawień Subscriptions i prośba o zwrot złożona w twojej aplikacji generują DID_CHANGE_RENEWAL_STATUS z podtypem AUTO_RENEW_DISABLED. CONSUMPTION_REQUEST dla tej samej transakcji, a później powiadomienie REFUND lub REFUND_DECLINED, pokazuje, że w grę wchodzi prośba o zwrot.
- Czy Google Play pozwala deweloperom pokazać wiadomość, gdy użytkownicy anulują?
- Dokumentacja Google o cyklu życia subskrypcji niczego takiego nie opisuje. Deweloperzy dostają po fakcie powiadomienie SUBSCRIPTION_CANCELED i mogą odczytać pole userInitiatedCancellation, by zobaczyć, dlaczego użytkownik anulował. Wstrzymanie, domyślnie włączone dla wszystkich subskrypcji, to główne wbudowane narzędzie Google Play przeciwko dobrowolnym rezygnacjom.
Źródła i materiały dodatkowe
- Apple Developer Documentation: Retention Messaging API
- Apple Developer Documentation: Setting up your Get Retention Message endpoint
- Apple Developer Documentation: Upload Message
- Apple Developer Documentation: Retention Messaging API changelog
- Apple Developer Documentation: notificationType
- Apple Developer Documentation: Send Consumption Information
- Apple Support: Request a refund for apps or content that you bought from Apple
- Google Play Billing: Subscription lifecycle
- Google Play Billing: Real-time developer notifications reference
- Google Play Console Help: Updates to refund protection and chargeback cost responsibility
RefundHalt
Autopilot zwrotów dla App Store i Google Play
Czytaj dalej
ROAS Twojej aplikacji wciąż liczy zakupy, za które Apple i Google zwróciły pieniądze. Licytuj więc na podstawie ROAS netto
Zwroty rzadko wracają do platform reklamowych, więc ROAS nadal zalicza zakupy, za które Apple i Google już oddały pieniądze. Wyjaśniamy, gdzie Firebase, Google Ads i AdAttributionKit gubią zwroty, ile to kosztuje i jak zbudować ROAS netto dla aplikacji.
Order ID z App Store na paragonie klienta mówi ci, co kupił i czy Apple już zwrócił pieniądze
Endpoint Look Up Order ID od Apple zamienia order ID z paragonu App Store na podpisane transakcje, z datą i powodem zwrotu. Oto jak używać go przy mailach o zwrot, czego nie potrafi i jak wypada na tle order ID z Google Play.