Tüm makaleler
Derinlemesine inceleme8 dk okuma

Advanced Commerce API iadesi, bir iOS geliştiricisinin iade başlatabildiği tek yol ve son kararı yine Apple veriyor

Çoğu iOS geliştiricisi müşterisine iade yapamaz. Apple'ın Advanced Commerce API'sini kullanan uygulamalar ise iade talep edebilir, bir aboneliği iptal edip geri alabilir ya da özel bir tutarı iade edebilir. Her endpoint'in nasıl çalıştığını, Apple'ın yine de neyi reddedebileceğini ve paranın nerede yanlış gittiğini anlatıyoruz.

Ev ofisindeki masasında, dizüstü bilgisayarın yanındaki iPad'de geniş bir sesli kitap ve kurs kütüphanesine göz atan bir kadın. Apple'a Advanced Commerce API iade talebi gönderebilen türden, geniş kataloglu bir uygulama

Önemli noktalar

  • Bir Apple mühendisi Haziran 2026'da, geliştiricinin sıradan bir App Store satın alımı için doğrudan iade yapamayacağını söyledi. Geliştiricinin tek katkısı, bir CONSUMPTION_REQUEST'e yanıt olarak gönderdiği tüketim verisi ve refundPreference'tır.
  • Apple'ın Advanced Commerce API'si için onaylanan uygulamalar, App Store'dan tek seferlik bir ücretin veya abonelik işleminin iadesini isteyen Request Transaction Refund endpoint'ine, ayrıca Revoke Subscription ve Cancel a Subscription endpoint'lerine erişir.
  • Advanced Commerce API'nin iade, geri alma ve iptal endpoint'lerini çağırmak için geliştiricinin Account Holder'ı Advanced Commerce API Addendum'u imzalamalıdır. Apple, en güncel sürüm kabul edilmemişse çağrının hata döndürdüğünü belirtir.
  • Request Transaction Refund endpoint'i FULL, PRORATED veya CUSTOM değerinde bir refundType alır. Para biriminin milliunit cinsinden refundAmount yalnızca CUSTOM ile kullanılabilir. Apple, Kanada ve Amerika Birleşik Devletleri dışındaki her bölgede tutarın vergiyi içermesi gerektiğini söyler.
  • Apple'ın refundRiskingPreference alanı varsayılan olarak true'dur. Bu, App Store'un geliştiricinin kendi iade talebi hakkında CONSUMPTION_REQUEST göndermesine izin verir. Apple 12 saat içinde yanıt bekler.
  • Advanced Commerce API'nin iade, geri alma ve iptal endpoint'leri production'da uygulama başına saniyede 5 istek ile sınırlıdır. Sandbox bunun yüzde 10'unu alır.
  • Başarılı bir Revoke Subscription çağrısından sonra Apple bir REFUND bildirimi gönderir ve geliştiricilerden hizmeti bildirimin gelmesinden önce değil, bildirimdeki revocationDate itibarıyla sonlandırmalarını ister.

Sıradan iOS geliştiricileri müşterilerine iade yapamaz. Haziran 2026'da bir App Store Commerce Engineer, geliştirici forumundaki bir soruyu tek satırla yanıtladı: şu anda bir geliştirici olarak doğrudan iade yapmak mümkün değil. Bir istisna var ve Advanced Commerce API'nin içinde duruyor. Apple'ın bu API için onayladığı uygulamalar Advanced Commerce API iade talebi gönderebilir, parayı geri vererek bir aboneliği iptal edip geri alabilir (revoke) ya da özel bir tutar isteyebilir. Paranın iade edilip edilmeyeceğine yine Apple karar verir.

Advanced Commerce API nedir ve kimler kullanabilir

Apple, Advanced Commerce API'yi 23 Ocak 2025'te yayımladı. API; özel tek seferlik satın alımlar, abonelikler ve isteğe bağlı eklentili aboneliklerden oluşan son derece büyük kataloglar için Apple In-App Purchases işlemlerini yürütür. Her ürünü App Store Connect'te oluşturmanız gerekmez. SKU'ları kendi sunucunuzda tanımlar ve satın alma anında Apple'a gönderirsiniz.

Erişim uygulama bazında verilir. Bir başvuru formu doldurursunuz. Apple'ın uygunluk sayfası, uygulamanın merkezinde olması gereken üç iş modelini sayar:

  • Sesli kitaplar, dersler, kurslar veya mini apps gibi son derece büyük tek seferlik satın alma katalogları.
  • Her içerik üreticisinin teklifinin ayrı bir abonelik olduğu, son derece büyük abonelik içeriği katalogları.
  • Premium kanallar veya spor gibi, tek bir satın alma olarak birlikte yenilenen isteğe bağlı eklentili bir abonelik.

Apple, başka bir programın bu API'yi gerektirdiği durumlarda da uygulamaların başvurmasına izin verir. Barındırılan mini apps içindeki uygun In-App Purchase satışlarının %85'ini üyelere ödeyen Mini Apps Partner Program bunu şart koşar.

İade endpoint'leri sonradan geldi ve imza gerektiriyor

24 Mart 2025 tarihli 1.1 sürümü Request Transaction Refund ve Revoke Subscription'ı ekledi. Apple'ın program sayfasına göre abonelik içeriği sunan uygulamalar, iptalleri yönetmek, satın alma sonrasında içeriği doğrulamak ve kataloglarını yönetmek için Cancel, Revoke ve Refund API'lerini kullanmaya da uygun olabilir. Her endpoint sayfası aynı koşulu ekler: Account Holder'ınız Advanced Commerce API Addendum'u imzalamalıdır ve en güncel sürüm kabul edilmemişse çağrı hata döndürür. Her endpoint'in hangi kullanım senaryoları için tasarlandığını dokümantasyon değil, Addendum (sözleşme eki) belirler.

Üç endpoint yan yana

Cancel a SubscriptionRevoke SubscriptionRequest Transaction Refund
YoladvancedCommerce/v1/subscription/cancel/{transactionId}advancedCommerce/v1/subscription/revoke/{transactionId}advancedCommerce/v1/transaction/requestRefund/{transactionId}
KapsamOtomatik yenilenen aboneliklerBir abonelik ve tüm kalemleriTek seferlik ücretler ve abonelik işlemleri
Para iadesiYokFULL veya PRORATEDSKU başına FULL, PRORATED veya CUSTOM
ErişimDönem sonuna kadar sürerrevocationDate'te biterrevoke bayrağıyla kalem bazında belirlenir
Production hız sınırısaniyede 5saniyede 5saniyede 5

Cancel a Subscription bir sonraki ücreti durdurur

Cancel otomatik yenilemeyi kapatır. Apple'a göre müşteri mevcut dönemin sonuna kadar erişimini korur. Hiçbir şey iade edilmez. Müşteri ayrılmak istiyorsa ve parasını ödediği süreyi zaten kullanmışsa doğru tercih budur.

Revoke Subscription her şeyi hemen sonlandırır

Revoke otomatik yenilemeyi false yapar ve aboneliği tam veya orantılı bir iadeyle geri alır. Gövdesi refundReason, refundRiskingPreference, refundType ve requestInfo alır. Ardından Apple, App Store Server Notifications V2 endpoint'inize bir REFUND bildirimi gönderir. Apple'ın talimatı nettir: hizmeti o bildirimdeki revocationDate itibarıyla kapatın ve bildirim gelmeden önce kapatmayın.

Request Transaction Refund kalem kalem çalışır

Hassas araç budur. Bir kalem listesi gönderirsiniz ve her kalem bir SKU, bir refundReason, bir refundType ve bir revoke bayrağı belirtir. CUSTOM ile birlikte para biriminin milliunit cinsinden refundAmount da gönderirsiniz, yani 4990, 4.99 demektir. FULL veya PRORATED ile tutar gönderirseniz Apple bunu 4000155 hatasıyla reddeder. Yanıt imzalı bir işlem ve abonelikler için imzalı yenileme bilgisi içerir.

Apple şu refundReason değerlerini kabul eder: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER ve MODIFY_ITEMS_REFUND. Yedincisi olan SIMULATE_REFUND_DECLINE yalnızca sandbox ve TestFlight testleri içindir ve App Store hayır diyebildiği için vardır.

Apple kendi iade talebinizi de reddedebilir

Endpoint'in adı dürüst. Bu bir talep. İki alan, kararın gerçekte nerede verildiğini gösterir.

refundRiskingPreference bir tüketim kontrolüne kapı açar

Apple, refundRiskingPreference'ı App Store'un iade kararına dayanak olarak sizden tüketim verisi isteyip istemeyeceği şeklinde tanımlar. Varsayılan değeri true'dur. true olduğunda kendi iade talebiniz için bir CONSUMPTION_REQUEST alırsınız ve Send Consumption Information ile yanıt verirsiniz. Apple, geliştiricilerden bir CONSUMPTION_REQUEST aldıktan sonra 12 saat içinde yanıt vermelerini ister. Değeri false yaparsanız bu bildirim gelmez.

Size hayır diyen hatalar

HataKodApple ne diyor
AlreadyRefundedError4030021İşlem zaten iade edilmiş
PendingRefundError4000181İşlemin bekleyen iadeleri var
TransactionNotRefundableError4030024İşlem iade edilemez
TransactionCannotBeRefundedContactSupportError4030025Müşteri Apple Support ile iletişime geçebilir
RefundAmountWithoutCustomError4000155CUSTOM olmadan tutar gönderildi

Hazırlıklı olmanız gereken hata PendingRefundError'dır. Olası bir neden, destek ekibiniz harekete geçmeden önce Report a Problem üzerinden Apple'a başvurmuş bir müşteridir. Apple'ın uygunluk kuralları bu uygulamaların zaten uygulama içinde bir iade yolu sunmasını şart koşar, ya bir Report a Problem bağlantısı ya da beginRefundRequest API'si. Böylece iki kapı aynı anda açık kalır.

Basılı bir işlem defterinin üzerinde iPhone tutan ve bir Advanced Commerce API iadesinin hangi kalemi kapsaması gerektiğini kontrol eden bir geliştirici

Bir Advanced Commerce API iadesi size parasal olarak neye mal olur

Kendi inisiyatifinizle iade yapmak, bir itirazla uğraşmaktan daha ucuz görünür. Yine de para çıkışıdır ve API bazı hataları büyük ölçekte tekrarlamayı kolaylaştırır.

Özel tutarın içindeki vergi

Apple, talep edilen refundAmount'un Kanada ve Amerika Birleşik Devletleri dışındaki tüm bölgelerde vergiyi içermesi gerektiğini söyler. CUSTOM iadeyi vergi öncesi SKU fiyatından hesaplayan bir ekip, diğer her storefront'ta müşterilere eksik iade yapar, sonra her birini düzeltmek için destek zamanı harcar.

Geri gelmeyen maliyetler

  • Ödemeler: bir içerik üreticisi kataloğunda veya mini app barındırıcısında, üreticinin payı çoğu zaman satış anında ödenir. Müşteriye yapılan iade bunu geri getirmez.
  • İçerik lisansı: bir sesli kitap veya kurs için hak sahibine ödenen başlık başına ücretler, sözleşmenize bağlı olarak erişimle tetiklenebilir ve iade bunları tersine çevirmez.
  • İşlem gücü: yayın, dönüştürme ve satın alma için yapılan her sunucu işi zaten faturanızda.
  • API çağrıları: konuşma işlemeden model çıkarımına kadar istek başına ücretlendirilen üçüncü taraf hizmetler, iadeden sonra da faturada kalır.

Tek kalem demek isterken tamamı

Revoke Subscription, eklentiler dahil tüm aboneliği iade eder ve sonlandırır. Müşteri yalnızca bir eklentiye itiraz ediyorsa, Request Transaction Refund yalnızca o SKU'yu iade etmenize ve revoke'u sadece o kaleme uygulamanıza izin verir. Tek kalemlik bir şikâyet için Revoke Subscription çağırmak, temel plan gelirini de geri verir.

Bunları açmadan önce bir geliştirme kontrol listesi

  • Account Holder'ınızın güncel Advanced Commerce API Addendum'u kabul ettiğini doğrulayın ve süresi dolduğunda dönen hata için alarm kurun.
  • Her istek için yeni bir requestReferenceId UUID'si üretin ve aynısını yalnızca zaman aşımına uğrayan bir çağrıyı yeniden denemek için kullanın.
  • İade çağrılarını kuyruğa alın. Sınır uygulama başına saniyede 5 istektir ve bir 429 yanıtı UNIX milisaniyesi cinsinden bir Retry-After başlığı taşır.
  • Retleri sandbox'ta SIMULATE_REFUND_DECLINE ile test edin ve sandbox sınırlarının production'ın yüzde 10'u olduğunu unutmayın.
  • refundRiskingPreference'a her vaka için ayrı karar verin ve değer true kaldığında 12 saatlik pencere için bir tüketim yanıtlayıcısını hazır tutun.
  • Erişimi yalnızca REFUND bildirimi geldiğinde, bildirimdeki revocationDate itibarıyla sonlandırın.
  • Her istek için nedeni, tutarı ve SKU'yu kaydedin, böylece kendi iade oranınızı Apple'dan önce siz görürsünüz.

Sık sorulan sorular

Bir iOS geliştiricisi müşteriye doğrudan iade yapabilir mi?
Sıradan bir App Store satın alımında hayır. Bir Apple mühendisi Haziran 2026'da, geliştiricinin doğrudan iade yapmasının mümkün olmadığını söyledi. Advanced Commerce API için onaylanmış ve Addendum'u imzalamış uygulamalar Request Transaction Refund endpoint'i üzerinden iade talep edebilir, kararı yine Apple verir.
Advanced Commerce API'de Cancel ile Revoke arasındaki fark nedir?
Cancel otomatik yenilemeyi kapatır ve müşteri dönem sonuna kadar erişimini korur, iade yapılmaz. Revoke aboneliği ve tüm kalemlerini hemen sonlandırır ve tutarın tamamını veya orantılı kısmını iade eder. Apple, bir revoke işleminden sonra REFUND bildirimi gönderir.
Advanced Commerce API ile özel bir tutarı iade edebilir miyim?
Evet. refundType'ı CUSTOM yapın ve refundAmount'u para biriminin milliunit cinsinden gönderin. Apple, tutarın Kanada ve Amerika Birleşik Devletleri dışındaki tüm bölgelerde vergiyi içermesi gerektiğini söyler. FULL veya PRORATED ile tutar göndermek 4000155 hatasını döndürür.
Kendi talep ettiğim bir iade için CONSUMPTION_REQUEST alır mıyım?
Alabilirsiniz. refundRiskingPreference varsayılan olarak true'dur, bu da App Store'un sizden bir CONSUMPTION_REQUEST ile tüketim verisi istemesine izin verir ve Apple 12 saat içinde yanıt bekler. Değeri false yaparsanız Apple bu bildirimin gönderilmeyeceğini söyler.
Advanced Commerce API iade talebim neden başarısız oldu?
Hata koduna bakın. 4030021 işlemin zaten iade edildiği, 4000181 bir iadenin zaten beklemede olduğu, 4030024 işlemin iade edilemeyeceği, 4030025 ise müşterinin Apple Support ile iletişime geçmesi gerektiği anlamına gelir. İmzalanmamış veya güncel olmayan bir Addendum da hata döndürür.

Kaynaklar ve ek okumalar

RefundHalt

App Store ve Google Play için geri ödeme otomatik pilotu

Okumaya devam edin

Bir sonraki geri ödeme talebi şimdiden yolda.

İtiraz edemediğiniz bir geri ödemeyle ilgili başka bir destek e-postasını okumak için gereken sürede RefundHalt'ı kurun.