İçeriğe geç
App Store Refund Management

Apple CONSUMPTION_REQUEST: App Store İade Taleplerine Nasıl Yanıt Verilir

Apple CONSUMPTION_REQUEST'in nasıl çalıştığını ve geliştiricilerin App Store iade taleplerine nasıl hızlı ve etkili yanıt verebileceğini öğrenin.

5 min read
Apple CONSUMPTION_REQUEST: App Store İade Taleplerine Nasıl Yanıt Verilir

Biri Sorun Bildir ekranını açar, uygulamanızı seçer ve Apple'dan parasını geri ister. Apple hemen karar vermez. Önce sunucunuza bir ping atıp satın alma hakkında ne bildiğinizi sorar ve yanıt için yaklaşık 12 saat bekler.

İşte o ping, Apple CONSUMPTION_REQUEST'tir. Gerçek IAP geliri olan pek çok ekip bunu hiç duymamıştır. Daha da fazlası loglarında bir kez görüp öylece bırakmıştır. Siz de öyleyseniz,
Apple CONSUMPTION_REQUEST rehberimiz neyi ve nedenini anlatıyor. Bu yazı ise yanıt verme kısmı. Ne göndermeli, ne göndermemeli ve deneyenlerin başına neler geldi.

Öne çıkanlar

  • Bir müşteri iade istediğinde Apple bir CONSUMPTION_REQUEST gönderir. Yaklaşık 12 saatiniz var. Sonrasında sizsiz karar verir.

  • Yanıt beş alandan oluşur. Elli değil. Beş.

  • İade tercihiniz tam olarak budur: bir tercih. Apple bunu daha önce geçersiz saydı, yine sayacak.

  • Müşteriden onay yoksa yanıt da yok. Bu bizim değil, Apple'ın sözü.

  • Bir uygulama, yalnızca yanıt vermeye başlayarak yaklaşık iki haftada 3% iade oranından 1.9%'a indi. Apple'dan hiçbir şeyi reddetmesini istemedi.

  • Kimse bunu uzun süre elle yapmaz. Süre çok kısa, talepler de olmadık saatlerde gelir.

Peki Apple CONSUMPTION_REQUEST tam olarak nedir?

Bir sunucu bildirimi; Apple'ın App Store Server Notifications V2 üzerinden gönderdiği pek çok bildirimden biri. Bu bildirim, biri bir uygulama içi satın alma için iade talep ettiğinde tetiklenir. Eskiden yalnızca tüketilebilir ürünler için geçerliydi. WWDC24'ten bu yana otomatik yenilenen abonelikleri de kapsıyor ki paranın büyük kısmı da orada.

Payload'un içinde: imzalı işlem, ürün ID'si ve müşterinin seçtiği neden. Apple'ın
consumption Request Reason dokümanı beş neden listeliyor: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER.

Bulamayacağınız şey ise bir isim veya Apple ID. Yalnızca bir işlem tanımlayıcısı var. Bunu "bu 48213 numaralı kullanıcı ve satın aldığından beri uygulamayı 40 kez açmış" bilgisine dönüştürmek sizin işiniz ve bu yalnızca ödeme sırasında bir App AccountToken eklediyseniz çalışır. Pek çok kişi atladığı için
appAccountToken üzerine ayrı bir yazı yazdık.

Apple sorar, siz yanıtlarsınız, Apple karar verir. Geliştiriciler için Apple iade taleplerinin şekli budur.

Apple CONSUMPTION_REQUEST'e nasıl yanıt verilir

Apple'ın Send Consumption Information endpoint'ine, path'te işlem ID'si olacak şekilde küçük bir JSON body PUT edersiniz. Bu body, iade sisteminin okuduğu Apple tüketim bilgisidir.

Önce Customer Consented gelir. True veya false. False ise durun. Hiçbir şey göndermeyin. Apple'ın dokümanları, onay olmadan hiç yanıt vermemeniz gerektiğini söylüyor. Tuhaf ama kural bu.

Sonra teslimat durumu. Çalıştıysa DELIVERED. Çalışmadıysa kalite sorunu, yanlış ürün, sunucu kesintisi ve diğer için UNDELIVERED varyantları var.

Sample Content Provided, müşterinin satın almadan önce deneyip deneyemediğine dair bir evet/hayır. Ücretsiz deneme, evet. İçerik önizlemesi, evet. Üç madde içeren bir paywall, muhtemelen hayır.

Consumption Percentage insanları yanıltır. Milliunit cinsindendir; yani 100000 tamamen tüketildi, 50000 yarısı demek. Otomatik yenilenen aboneliklerde bunu dışarıda bırakın. Apple bunu faturalandırma döneminden hesaplar.

Ve son olarak refund Preference. DECLINE, GRANT_FULL veya GRANT_PRORATED. İsteğe bağlı. Aynı zamanda ne istediğinizi söyleyebildiğiniz tek yer.

Zaten harcanmış bir jeton paketi için örnek bir yanıt:

Apple 202 ile yanıt verir, başka bir şey yok. Karar yok. Geliştirici forumlarında bir Apple mühendisi bunu 2021'de söylemişti: 202, verinizin "dikkate alınacağı" anlamına gelir. Vaat bundan ibaret.

Her şeye DECLINE göndermeyin

Cazip olduğunu biliyorum. Direnin.

Önce nedeni okuyun. FULFILLMENT_ISSUE, teslimat loglarınızı kontrol edin demek. Satın alma gerçekten ulaşmadıysa eşleşen UNDELIVERED durumunu GRANT_FULL ile gönderip devam edin. O vakayı kazanamazsınız ve denemek sonraki DECLINE'larınızı daha zayıf gösterir.

UNINTENDED_PURCHASE kullanımla ilgilidir. 9:02'de satın alınmış, 9:05'te iade istenmiş, arada sıfır oturum mu? Muhtemelen yanlışlıkla dokunulmuş. Bırakın gitsin. Bir hafta boyunca her gün kullanılmış mı? Gerçek tüketim rakamınızı ekleyerek DECLINE.

UNSATISFIED_WITH_PURCHASE, Sample Content Provided'ın işe yaradığı yerdir. Deneme sürümü vardı ve kullanım 80% mi? Reddedin. Neredeyse hiç açılmamış mı? GRANT_PRORATED adil bir orta yol.

LEGAL ve OTHER için doğru veriyi gönderin ve kayıtlarınız kararı açıkça ortaya koymuyorsa tercihi atlayın.

95% tüketim ve ücretsiz deneme üzerine gelen bir DECLINE güçlü bir yanıttır. Doksan saniye kullanılmış bir şeye DECLINE ise refleks gibi görünür.

Bunu yapanların başına gerçekte ne geldi

Dipsea, RevenueCat'in Eylül 2024'te satın aldığı ve kendi iade işleyicisini test etmek için kullandığı bir ses uygulaması. 23 Ekim'de tüketim taleplerine tercihi "Apple karar versin" olarak ayarlayıp yanıt vermeye başladılar. DECLINE yok. Sadece veri. Yaklaşık 15 günde iade oranı sabit 3% seviyesinden 1.9% seviyesine düştü.
Grafiği yayınladılar.Bana göre bu konudaki en faydalı veri noktası bu. Tek başına veri rakamı hareket ettirdi.

Şimdi madalyonun diğer yüzü. Mart 2024'te bir oyun stüdyosu Apple Developer Forums'ta tüketim bilgisi gönderdiklerini ama Apple'ın oyuncuların zaten harcadığı jetonlar için "neredeyse tüm" iadeleri onaylamaya devam ettiğini yazdı. Tüketilebilir ürünler zor vakadır. Jetonlar gittikten sonra Apple onları geri alamaz. REFUND bildiriminden sonra bakiyeyi kendiniz iptal etmezseniz hem parayı hem jetonları kaybedersiniz.

Ve Mayıs 2025'te r/iOSProgramming'de bir başlık, "her zaman reddetmeyi tercih et" ayarını açan ve aniden her iadenin onaylandığını gören RevenueCat kullanıcılarıyla doldu. RevenueCat bunun Apple tarafında bir politika değişikliği olduğunu söyledi. Nedeni ne olursa olsun, eski bir tartışmayı bitirdi. Refund Preference bir anahtar değil. Toptan DECLINE bir örüntüdür ve Apple bunu görmezden gelebilir.

400 almanın yolları

Apple body konusunda katıdır. Tekrar tekrar gördüklerimiz şunlar.

Milliunit meselesi. Biri "yüzde" yazısını okur, 100 gönderir ve Apple'a müşterinin yüzde birin onda birini kullandığını söylemiş olur. Aralık 0 ile 100000 arasındadır.

Teslim edilmemiş bir üründe sıfırdan farklı bir yüzde. delivery Status DELIVERED değilse Consumption Percentage 0 olmak zorunda, yoksa istek geri döner.

Otomatik yenilenen bir abonelikte herhangi bir yüzde. Apple'ın bunun için özel bir hatası var. Dışarıda bırakın.

Yanlış anahtar. Bu çağrı, App Store Connect'te Users and Access, ardından Integrations altında oluşturulan bir In-App Purchase anahtarı ister. App Store Connect API anahtarı değil, birebir aynı görünseler de. Yanlış olanı kullanırsanız 401 alır ve bir saat boyunca JWT'nizden şüphe edersiniz.

Onayı atlamak. HTTP hatası değil, uyumluluk hatası. Bu canlıya çıkmadan önce ilgili ifadeyi kullanım koşullarınıza ekleyin.

Önce sandbox'ta test edin. Bir ayrıntı: Apple'ın test dokümanı orada on iki saat değil beş dakika veriyor. Sunucunuz altı dakika sürerse test verinizi yok sayar. Reddi zorlamak için iade ekranında Other'ı seçip DECLINE yazın.

Çok sayıda App Store iade talebi olduğunda geliştiriciler bunları nasıl yönetiyor

Açık konuşmak gerekirse, çoğunlukla yönetmeyerek. Talep sabah 3'te gelir. Ya da cumartesi. Ya da pipeline'ı anlayan tek kişinin çevrimdışı olduğu bir tatil gününde. On iki saat geçer. Apple müşterinin sözüne göre karar verir.

Geliştirici olarak Apple iade taleplerini nasıl yöneteceğiniz tek bir karara iner. Zinciri kendiniz kurun (JWS'yi doğrula, kullanıcıyı bul, kullanımı çek, yüzdeyi hesapla, JWT üret, endpoint'i çağır, logla, tekrar dene) ve sonsuza kadar çalışır tutun. Ya da bunu zaten yapan bir Apple iade yönetimi yazılımına bağlanın.

Refund Sensor bu ikinci gruptaki seçeneklerden biri. Bildirim URL'mizi App Store Connect'e yapıştırır, anahtarı bağlarsınız ve yanıtlar saniyeler içinde gider. Şu anda üzerindeki uygulamalar genelinde uygun taleplerin 77%'si savunuldu, vaka başına yaklaşık $33 korundu. Akıllıca bir şey olmuyor. Her seferinde, süre dolmadan gerçek veriyle bir yanıt gidiyor. Etrafa bakmayı tercih ederseniz Apple iade yönetimi araçları
rehberimiz neleri sormanız gerektiğini anlatıyor.

Geliştiriciler için Apple iade otomasyonunun sürekli gündeme gelmesinin nedeni bu. On iki saat, her talep, her hafta; bu bir insan işi değil. Ne seçerseniz seçin, bir şey seçin. Sessizlik, Apple'ın yalnızca tek tarafı duyması demektir.

Sık sorulan sorular

Production ortamında on iki saat, sandbox'ta beş dakika. İkisi de Apple'ın dokümanlarında yazıyor.

Hayır. Apple, tüketim bilginizi "çeşitli faktörlerden biri" olarak tanımlıyor. Şansınızı artırır. Hiçbir şeye karar vermez.

Müşterinin onay verdiği her talebe, evet. Sunucunuz çöktüğü için GRANT_FULL gönderdiğiniz talepler dahil. Kolay vakalardaki dürüst yanıtlar, Apple'ın daha sonraki DECLINE'larınıza güvenmesinin nedenidir

deliveryStatus ve sampleContentProvided, doğru şekilde. Yüzdeyi atlayın. Sonra gidip izleme altyapınızı düzeltin.

Evet. DECLINE ve GRANTFULL her ürün tipinde çalışır. GRANTPRORATED da öyle; otomatik yenilenen planlarda oranlama hesabını Apple kendisi yapar.

#Apple CONSUMPTION_REQUEST#App Store refund requests#Apple App Store refunds#Refund request response#App Store developer guide#Apple refund process
Refund SensorRefund Sensor TeamRefund defense for App Store and Google Play developers