Wszystkie artykuły
Analiza pogłębiona8 min czytania

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.

Osoba przy stoliku w kawiarni trzyma iPhone'a z otwartym ekranem ustawień subskrypcji, czyli w chwili, dla której powstało Retention Messaging API od Apple

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.

ElementCo mówi dokumentacja Apple
StatusWersja przedpremierowa, deweloperzy zgłaszają chęć dołączenia
ProduktySubskrypcje odnawiane automatycznie
Typy wiadomościTekst, tekst z obrazem, zmiana planu, oferta promocyjna
Limit odpowiedzi w czasie rzeczywistym700 ms w produkcji
Dostęp produkcyjnyNajpierw zaliczony test wydajności w sandboxie, około 700 ms
Nagłówek i tekst punktówPo 66 znaków, maksymalnie pięć punktów
Tekst główny144 znaki
Tekst alternatywny obrazu150 znaków
Wiadomości na aplikację2000
WeryfikacjaNowe wiadomości startują jako PENDING i pojawiają się dopiero po statusie APPROVED
UrządzeniaiOS 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.

MomentGdzie to się dziejeCo jest stawkąKto decydujeTwój wkład
AnulowanieStrona szczegółów subskrypcji, potem Confirm CancellationPrzyszłe odnowieniaKlientWybrana przez ciebie wiadomość retencyjna, odpowiedź w ciągu 700 ms
Prośba o zwrotreportaproblem.apple.com albo okno zwrotu w twojej aplikacjiPieniądze już zapłaconeAppleDane 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.

Deweloper przy biurku obserwuje wykresy czasu odpowiedzi serwera na monitorze obok laptopa i iPhone'a, czyli taki stale dostępny endpoint, jakiego oczekuje Retention Messaging API od Apple

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

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