Apple'ın Retention Messaging API'si sözlerinizi iptal ekranına taşır, ancak iade talepleri asla oradan geçmez
Apple'ın Retention Messaging API'si, bir abone İptal'e dokunduğunda bir mesaj, plan değişikliği ya da promosyon teklifi göstermenizi sağlar. Nasıl çalıştığını, çalıştırmanın neye mal olduğunu ve bir iade talebinin neden o ekrana hiç uğramadan Apple'a ulaştığını anlatıyoruz.

Önemli noktalar
- Apple'ın Retention Messaging API'si, geliştiricinin bir iPhone abonesine Cancel Subscription (Aboneliği İptal Et) düğmesine dokunduktan sonra gösterilecek mesajı seçmesini sağlar. Dört tür vardır: metin, görselli metin, plan değiştirme önerisi veya promosyon teklifi.
- Apple'ın belgeleri Retention Messaging API'yi hâlâ geliştiricilerin katılmak için başvurduğu bir ön sürüm olarak tanımlıyor. Sürüm 1.0, 16 Temmuz 2025'te; sürüm 1.5 ise 27 Nisan 2026'da yayımlandı.
- Gerçek zamanlı akışta Apple, aktif bir abone İptal düğmesi bulunan bir abonelik ayrıntıları sayfasını görüntülediğinde geliştiricinin Get Retention Message uç noktasını çağırır. Uç nokta, üretimde 700 ms içinde yanıt vermelidir; aksi halde Apple varsayılan mesaja döner.
- Elde tutma mesajı yalnızca gelecekteki yenilemeleri etkiler. İade talebi Apple'a reportaproblem.apple.com veya uygulama içi iade sayfası üzerinden gider ve elde tutma mesajlarının göründüğü iptal ekranı bu yolun parçası değildir.
- Bir müşteri uygulama içinde StoreKit'in iade talebi API'si ile iade istediğinde, Apple otomatik yenilemeyi kendisi kapatır ve AUTO_RENEW_DISABLED alt türüyle DID_CHANGE_RENEWAL_STATUS gönderir. Bu, Abonelikler ayarları sayfasından yapılan bir iptalle aynı tür ve alt türdür.
- Geliştiricinin bir Apple iadesindeki tek katkısı CONSUMPTION_REQUEST'tir. Bu talep 12 saat içinde Send Consumption Information ile yanıtlanır ve yalnızca müşteri bu verilerin paylaşılmasına onay verdiyse yanıtlanabilir.
- Google Play'de, geliştiricinin seçtiği bir iptal ekranı mesajının belgelenmiş bir karşılığı yoktur. Geliştiriciler iptalden sonra bir SUBSCRIPTION_CANCELED bildirimi alır ve userInitiatedCancellation alanı abonenin neden ayrıldığını gösterir.
iPhone'da İptal'e dokunan abonelere artık, onaylamadan önce sizin seçtiğiniz bir mesaj, daha ucuz bir plan veya bir indirim gösterilebiliyor. Bu, Apple'ın Retention Messaging API'si ve bir geliştiricinin Apple'ın kendi iptal ekranında ilk kez söz sahibi olması demek. Hâlâ katılmak için başvurmanız gereken bir ön sürüm. Ayrıca iadeleri önemsiyorsanız dikkat etmeniz gereken kesin bir sınırı var: ödemeyi bırakmak üzere olan insanlara seslenir, parasını geri isteyenlere değil. Bu talepler Apple'a başka bir yoldan gider.
Apple'ın Retention Messaging API'si ne yapar
Retention Messaging API, sunucudan sunucuya çalışan bir hizmettir. Mesaj metinlerini ve görselleri önceden Apple'a yüklersiniz, Apple bunları inceler, ardından otomatik yenilenen bir aboneliği iptal etmek üzere olan bir abonenin hangi onaylı mesajı göreceğini siz seçersiniz. Apple'ın belgeleri dört mesaj türü sayar:
- Madde işaretleri içerebilen bir metin mesajı.
- Görselli bir metin mesajı.
- Aynı abonelik grubundaki başka bir aboneliği öneren bir plan değiştirme mesajı.
- Aynı veya farklı bir seviyede indirimli fiyat sunan bir promosyon teklifi mesajı. Bunun için App Store Connect'te kurduğunuz ve sunucunuzda imzaladığınız bir promosyon teklifi kullanılır.
Mesaj, müşteri bir abonelik ayrıntıları sayfasında Cancel Subscription'a dokunduktan sonra görünür. Ardından Apple bir Confirm Cancellation (İptali Onayla) sayfası gösterir. Müşteri yine de iptal edebilir, Keep Subscription'a (Aboneliği Koru) dokunabilir ya da önerdiğiniz teklifi veya planı kabul edebilir. Çıkış yolunu gizleyemezsiniz ve Apple, geliştiricilere yanıltıcı veya hatalı içerik yüklememelerini söyler.
Varsayılan mesajlar ve gerçek zamanlı akış
Çalıştırmanın iki yolu var. Basit olanı varsayılan mesajlardır: her ürün ve yerel ayar için atanan, görselli veya görselsiz, madde işaretli veya işaretsiz metin. Daha kapsamlı olanı gerçek zamanlı akıştır: Apple sunucunuzdaki bir Get Retention Message uç noktasını çağırır, siz de bir mesaj kimliğiyle yanıt verirsiniz. Plan değiştirme ve promosyon teklifi mesajlarını yalnızca gerçek zamanlı akış gösterebilir.
Pratikte varsayılanlar isteğe bağlı değildir. Apple, gerçek zamanlı bir çağrı başarısız olduğunda bunları yedek olarak kullanır ve varsayılanı olmayan bir yerel ayarda o ürün için hiç elde tutma mesajı göstermez.
| Öğe | Apple'ın belgelerinin söyledikleri |
|---|---|
| Durum | Ön sürüm, geliştiriciler katılmak için ilgi bildirir |
| Ürünler | Otomatik yenilenen abonelikler |
| Mesaj türleri | Metin, görselli metin, plan değiştirme, promosyon teklifi |
| Gerçek zamanlı yanıt sınırı | Üretimde 700 ms |
| Üretim erişimi | Önce sandbox performans testini geçmek, yaklaşık 700 ms |
| Başlık ve madde metni | Her biri 66 karakter, en fazla beş madde |
| Gövde metni | 144 karakter |
| Görsel alternatif metni | 150 karakter |
| Uygulama başına mesaj | 2.000 |
| İnceleme | Yeni mesajlar PENDING olarak başlar ve yalnızca APPROVED olunca gösterilir |
| Cihazlar | iOS 15.1, iPadOS 15.1, visionOS 1, macOS 14 veya üstü |
Apple gerçek zamanlı çağrıda sunucunuza ne iletir
İstek, App Store tarafından imzalanmış bir JWS'dir. Çözüldüğünde originalTransactionId, appAppleId, productId, userLocale, bir requestIdentifier UUID'si, ortam bilgisi ve signedDate içerir. Apple, appAppleId'nin uygulamanızla eşleştiğini kontrol etmenizi ve eşleşmiyorsa yanıt vermemenizi söyler. İşe yarayan kısım originalTransactionId'dir; ne söyleyeceğinize karar vermeden önce bu abonenin uygulamanızda gerçekte ne yaptığına bakmanızı sağlar.
Elde tutma mesajı nerede görünür, nerede görünmez
Apple mesajı tek bir ekrana yerleştirir: müşteri Cancel Subscription'a dokunduktan sonraki Confirm Cancellation adımı. Örneğin Apple Account > Subscriptions üzerinden veya App Store'daki bir abonelik sayfasından. Bu ekran bir sonraki yenilemenin gerçekleşip gerçekleşmeyeceğiyle ilgilidir. Zaten tahsil edilmiş paraya dokunmaz.
İade talebi ayrı bir işlemdir. Apple'ın destek sayfası müşterileri reportaproblem.apple.com'a yönlendirir; orada "Request a refund" (İade talep et) seçeneğini seçer, bir neden ve bir ürün belirler ve bir güncelleme için 24 ila 48 saat beklerler. Uygulamanızın içinde StoreKit'in beginRefundRequest'i Apple'ın iade sayfasını açar ve Apple, App Store'un onaylaması veya reddetmesinin 48 saate kadar sürdüğünü söyler. Bu yolların hiçbiri Confirm Cancellation ekranından geçmez.
| An | Nerede olur | Söz konusu olan | Kim karar verir | Sizin katkınız |
|---|---|---|---|---|
| İptal | Abonelik ayrıntıları sayfası, ardından Confirm Cancellation | Gelecekteki yenilemeler | Müşteri | Seçtiğiniz bir elde tutma mesajı, 700 ms içinde yanıtlanır |
| İade talebi | reportaproblem.apple.com veya uygulama içi iade sayfanız | Zaten ödenmiş para | Apple | Müşteri onay verdiyse 12 saat içinde CONSUMPTION_REQUEST verisi |
Bir elde tutma mesajı iade talebini durdurabilir mi?
Hayır. İade talebi, mesajın bulunduğu ekrana hiç ulaşmaz. Apple'ın bildirim belgelerindeki bir ayrıntı bunu somutlaştırır. Bir müşteri uygulamanız üzerinden iade talebi API'siyle iade istediğinde, Apple otomatik yenilemeyi kendiliğinden kapatır ve AUTO_RENEW_DISABLED alt türüyle DID_CHANGE_RENEWAL_STATUS gönderir. Abonelikler ayarları sayfasından iptal eden bir müşteri de aynı tür ve alt türü üretir. Sunucunuz birbirinden çok farklı iki müşteri için tek bir bildirim görür ve elde tutma mesajınızı bunlardan yalnızca biri görmüştür.
İade talebi ilerlerse kanıt kanalı CONSUMPTION_REQUEST'tir. Apple bunu her ürün türündeki iade talepleri için gönderir ve Send Consumption Information ile yanıt vermek için 12 saatiniz vardır. Yalnızca müşteri onay verdiyse yanıt verebilirsiniz. Ardından Apple'ın kararı bir REFUND bildirimi olarak gelir; Apple, müşterinin uygulamanızda başlattığı bir iadeyi reddederse REFUND_DECLINED olarak gelir.
Google Play'in bir iptal mesajı API'si var mı?
Google'ın abonelik yaşam döngüsü belgelerinde yok. Bir Google Play abonesi Play abonelik merkezinden iptal eder, mevcut fatura döneminin sonuna kadar erişimini korur ve o zamana kadar Resubscribe'a (Yeniden abone ol) dokunarak iptali geri alabilir; Google buna geri yükleme der. Siz bunu sonradan bir SUBSCRIPTION_CANCELED bildirimiyle öğrenirsiniz ve abonelik kaynağındaki userInitiatedCancellation alanı kullanıcının neden ayrıldığını söyler. Google'ın tüm abonelikler için varsayılan olarak etkin olduğunu söylediği duraklatma, gönüllü kaybı azaltmanın başlıca yerleşik yoludur.
İade tarafında Google Play'in kendi kanıt kanalı vardır. Bir ters ibrazın (chargeback) geliştirici incelemesi gerektirdiğinde bir PendingRefundReviewNotification gelir ve orders.reviewrefund üzerinden yanıt vermek için 24 saatiniz vardır. 3 Ağustos 2026'dan sonra verilen siparişlerde bir ters ibraz kabul edildiğinde Google, Play'in hizmet ücreti düşülmüş satın alma fiyatını ve bankanın ters ibraz ücretlerini geliştiriciye yansıtır.
İptal ekranının size parasal maliyeti
Elde tutma mesajları ücretsiz görünür. Değildir ve faturalar üç yerden gelir.
Her sayfa görüntülemesinde işlem gücü
Apple, uç noktanızı yalnızca abone iptal ettiğinde değil, aktif bir abone İptal düğmesi olan bir abonelik ayrıntıları sayfasını görüntülediğinde çağırır. Her ziyaret, sunucunuzun kimlik doğrulaması yapması, sorgulaması ve 700 ms içinde yanıtlaması gereken bir istektir; aksi halde Apple varsayılana döner. Bu, bazen iki saniye süren soğuk başlatmalı bir fonksiyonu baştan eler. Sürekli sıcak tutulan kapasite için, ayrıca karar mantığınızın her istekte yaptığı veritabanı okumaları ve ücretli üçüncü taraf API çağrıları için ödeme yaparsınız.

İndirim, tahsil etmemeyi seçtiğiniz gelirdir
Bir aboneyi tutan promosyon teklifi, elde tutulmuş gerçek paradır. Zaten kalacak birine giden teklif ise saf indirimdir. İşte bir kıyas ölçütü değil, bir örnek. Aylık $9.99'luk bir planı üç ay boyunca yarı fiyatına sunmak, kabul edilen her teklif başına $14.99'dan vazgeçmek demektir. Teklifi kabul edenlerin üçte biri tam fiyatla da kalacak idiyse, bin kabul, buna hiç ihtiyacı olmayan insanlara verilmiş yaklaşık $5,000'lık indirime mal olur. Terazinin öbür kefesinde ise gerçekten ayrılmak üzere olan aboneler vardır.
Kaba bir çıkışın davet ettiği iade
Apple, Cancel Subscription düğmesini sayfada tutar; dolayısıyla kimseyi tuzağa düşüremezsiniz, ama yine de rahatsız edici olabilirsiniz. Baskı hisseden bir müşterinin başka bir seçeneği vardır: Apple'dan son ödemeyi geri istemek. İade gerçekleştiğinde para geri gider; o aboneye bağlı işlem gücü, depolama, API çağrıları ve tüm satış ortaklığı ödemeleri ise harcanmış olarak kalır. Bunlar hiçbir elde tutma mesajının geri kazandıramayacağı maliyetlerdir.
İade oranınızı yükseltmeden elde tutma mesajları nasıl kullanılır
İptal ekranını zekice değil, doğru olunacak bir yer olarak görün. Birkaç kural onu iade çizgisinin doğru tarafında tutar:
- Her abone için ayrı karar verin. Son kullanımı incelemek için Apple'ın isteğindeki originalTransactionId'yi kullanın. Ürünü kullananlara indirim veya daha ucuz bir plan sunun. Haftalardır açmamış olanlara kısa ve dürüst bir mesaj verin.
- Yanıtı hızlı tutun. Kullanım verileriniz değiştiğinde kararı önceden hesaplayın; böylece isteğin kendisi 700 ms'nin rahatça içine sığan tek bir sorgu olur.
- Her ürün ve yerel ayar için bir varsayılan mesaj yazın. Varsayılan yoksa başarısız bir çağrı, hiç mesaj olmaması demektir.
- AUTO_RENEW_DISABLED'ı yakından izleyin. Aynı originalTransactionId için ardından bir CONSUMPTION_REQUEST gelirse, karşınızdaki bir iptal değil bir iade talebidir ve 12 saatlik süre başlamıştır.
- Yanıtlamanıza izin verilen her CONSUMPTION_REQUEST'i yanıtlayın. RefundHalt, Apple'a 12 saatlik süre içinde doğru tüketim verileri gönderir ve Google Play'in ters ibraz incelemesini 24 saat içinde yanıtlar, çünkü iki mağazanın da sizin tarafınızı sorduğu yalnızca bu iki an vardır.
Apple'dan erişim istemeye değer mi?
Otomatik yenilenen abonelikler satıyor ve zaten App Store Server Notifications V2'yi işliyorsanız, muhtemelen evet. İptal ekranı, bir aboneye ayrılmadan önce ulaşabileceğiniz son yerdir ve bir plan değişikliği, onu tamamen kaybetmekten daha ucuza gelir. Yalnızca her abonelik sayfası görüntülemesinde yanıt veren bir uç nokta için bütçe ayırın ve iade savunmalarınızı iadelerin gerçekten yaşandığı yerde tutun.
Sık sorulan sorular
- Apple'ın Retention Messaging API'si nedir?
- Otomatik yenilenen bir abonelikte, abonenin Cancel Subscription'a dokunduktan sonra göreceği mesajı geliştiricinin seçmesini sağlayan, sunucudan sunucuya çalışan bir API'dir. Apple dört türü destekler: metin, görselli metin, plan değiştirme önerisi ve promosyon teklifi. Apple'ın belgeleri onu hâlâ geliştiricilerin katılmak için başvurduğu bir ön sürüm olarak tanımlar.
- Get Retention Message uç noktam ne kadar hızlı yanıt vermeli?
- Üretimde 700 ms içinde. Sunucunuz daha yavaşsa veya hata verirse Apple, o ürün ve yerel ayar için yapılandırılmış varsayılan mesajı gösterir; varsayılan yoksa hiçbir şey göstermez. Ayrıca Apple bir üretim URL'si belirlemenize izin vermeden önce, yaklaşık 700 ms'lik bir sandbox performans testini geçmeniz gerekir.
- Bir müşteri iade talep ettiğinde elde tutma mesajı görünür mü?
- Hayır. Apple elde tutma mesajlarını, müşteri Cancel Subscription'a dokunduktan sonraki Confirm Cancellation ekranında gösterir. İade talepleri reportaproblem.apple.com veya beginRefundRequest'in açtığı uygulama içi iade sayfası üzerinden ilerler ve orada geliştiricinin tek katkısı, müşteri onay verdiyse 12 saat içinde yanıtlanan CONSUMPTION_REQUEST'tir.
- App Store Server Notifications'da bir iade talebini iptalden nasıl ayırt edebilirim?
- Yalnızca yenileme bildirimine bakarak ayırt edemezsiniz. Abonelikler ayarları sayfasından yapılan bir iptal de, uygulamanız üzerinden yapılan bir iade talebi de AUTO_RENEW_DISABLED alt türüyle DID_CHANGE_RENEWAL_STATUS üretir. Aynı işlem için gelen bir CONSUMPTION_REQUEST ve ardından gelen bir REFUND veya REFUND_DECLINED bildirimi, ortada bir iade talebi olduğunu gösterir.
- Google Play, kullanıcılar iptal ettiğinde geliştiricilerin bir mesaj göstermesine izin veriyor mu?
- Google'ın abonelik yaşam döngüsü belgeleri böyle bir şey tanımlamaz. Geliştiriciler olaydan sonra bir SUBSCRIPTION_CANCELED bildirimi alır ve kullanıcının neden iptal ettiğini görmek için userInitiatedCancellation alanını okuyabilir. Tüm abonelikler için varsayılan olarak etkin olan duraklatma, Google Play'in gönüllü kayba karşı başlıca yerleşik aracıdır.
Kaynaklar ve ek okumalar
- 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
App Store ve Google Play için geri ödeme otomatik pilotu
Okumaya devam edin
Uygulamanızın ROAS değeri Apple ve Google'ın iade ettiği satın alımları hâlâ sayıyor, bu yüzden teklifinizi net ROAS'a göre verin
İadeler reklam platformlarına nadiren geri akar, bu yüzden ROAS, Apple ve Google'ın çoktan geri ödediği satın alımları kampanyaya yazmaya devam eder. Firebase, Google Ads ve AdAttributionKit'in iadeleri nerede kaybettiğini, bunun maliyetini ve bir uygulama için net ROAS'ı nasıl kuracağınızı anlatıyoruz.
Müşterinin makbuzundaki App Store order ID, ne satın aldığını ve Apple'ın parayı çoktan iade edip etmediğini söyler
Apple'ın Look Up Order ID endpoint'i, müşterinin App Store makbuzundaki order ID'yi iade tarihleri ve nedenleri dahil signed transactions'a dönüştürür. İade e-postalarında nasıl kullanılacağı, neyi yapamadığı ve Google Play'in order ID'siyle farkı burada.