Semua artikel
Ulasan mendalamWaktu baca 8 menit

Refund lewat Advanced Commerce API adalah satu-satunya cara developer iOS memulai refund, dan Apple tetap memegang keputusan akhir

Sebagian besar developer iOS tidak bisa me-refund pelanggan. Aplikasi yang memakai Advanced Commerce API milik Apple bisa mengajukan refund, mencabut langganan, atau mengembalikan jumlah khusus. Berikut cara kerja tiap endpoint, apa yang masih bisa ditolak Apple, dan di mana uang bisa bocor.

Seorang perempuan di meja kerja rumah menelusuri perpustakaan audiobook dan kursus yang besar di iPad di samping laptop, jenis aplikasi berkatalog besar yang dapat mengirim permintaan refund Advanced Commerce API ke Apple

Poin utama

  • Seorang engineer Apple menyatakan pada Juni 2026 bahwa developer tidak bisa langsung menerbitkan refund untuk pembelian App Store biasa. Satu-satunya masukan developer adalah data konsumsi dan refundPreference yang dikirim sebagai balasan atas CONSUMPTION_REQUEST.
  • Aplikasi yang disetujui untuk Advanced Commerce API milik Apple mendapat endpoint Request Transaction Refund yang meminta App Store me-refund tagihan sekali bayar atau transaksi langganan, ditambah endpoint Revoke Subscription dan Cancel a Subscription.
  • Untuk memanggil endpoint refund, revoke, dan cancel di Advanced Commerce API, Account Holder developer wajib menandatangani Advanced Commerce API Addendum. Apple menyatakan panggilan akan mengembalikan error jika versi terbaru belum diterima.
  • Endpoint Request Transaction Refund menerima refundType FULL, PRORATED, atau CUSTOM, dan refundAmount dalam milliunit mata uang hanya boleh dipakai dengan CUSTOM. Apple menyatakan jumlah itu wajib sudah termasuk pajak di semua wilayah kecuali Kanada dan Amerika Serikat.
  • Field refundRiskingPreference milik Apple bernilai default true, sehingga App Store dapat mengirim CONSUMPTION_REQUEST atas permintaan refund developer sendiri. Apple meminta respons dalam 12 jam.
  • Endpoint refund, revoke, dan cancel di Advanced Commerce API dibatasi 5 per detik per aplikasi di produksi, dan sandbox mendapat 10 persen dari batas itu.
  • Setelah panggilan Revoke Subscription berhasil, Apple mengirim notifikasi REFUND dan meminta developer menghentikan layanan per revocationDate-nya, bukan sebelum notifikasi itu tiba.

Developer iOS biasa tidak bisa me-refund pelanggan. Pada Juni 2026, seorang App Store Commerce Engineer menjawab pertanyaan di forum developer dengan satu kalimat: saat ini developer tidak dapat menerbitkan refund secara langsung. Ada satu pengecualian, dan letaknya di dalam Advanced Commerce API. Aplikasi yang disetujui Apple untuk API ini dapat mengirim permintaan refund Advanced Commerce API, mencabut langganan disertai pengembalian uang, atau meminta jumlah khusus. Apple tetap memutuskan apakah uangnya berpindah.

Apa itu Advanced Commerce API dan siapa yang mendapatkannya

Apple merilis Advanced Commerce API pada 23 Januari 2025. API ini menangani In-App Purchase Apple untuk katalog yang sangat besar berisi pembelian sekali bayar khusus, langganan, dan langganan dengan add-on opsional. Anda tidak membuat setiap produk di App Store Connect. Anda mendefinisikan SKU di server sendiri lalu mengirimkannya ke Apple saat pembelian.

Akses diberikan per aplikasi. Anda mengisi formulir permintaan, dan halaman kelayakan Apple menyebut tiga model bisnis yang harus menjadi inti aplikasi:

  • Katalog pembelian sekali bayar yang sangat besar, seperti audiobook, kelas, kursus, atau mini app.
  • Katalog konten langganan yang sangat besar, di mana penawaran tiap kreator adalah langganan tersendiri.
  • Langganan dengan add-on opsional yang diperpanjang bersama sebagai satu pembelian, seperti kanal premium atau olahraga.

Apple juga mengizinkan aplikasi mendaftar bila program lain membutuhkan API ini. Mini Apps Partner Program, yang membayar anggotanya 85% dari penjualan In-App Purchase yang memenuhi syarat di mini app yang di-host, mewajibkannya.

Endpoint refund datang belakangan, dan butuh tanda tangan

Versi 1.1, bertanggal 24 Maret 2025, menambahkan Request Transaction Refund dan Revoke Subscription. Halaman program Apple menyebut aplikasi yang menawarkan konten langganan juga mungkin memenuhi syarat untuk memakai API Cancel, Revoke, dan Refund guna menangani pembatalan, memvalidasi konten setelah pembelian, dan mengelola katalog. Setiap halaman endpoint menambahkan syarat yang sama: Account Holder Anda wajib menandatangani Advanced Commerce API Addendum, dan jika versi terbaru belum diterima, panggilan akan mengembalikan error. Addendum, bukan dokumentasinya, yang mencantumkan kasus penggunaan untuk tiap endpoint.

Tiga endpoint, berdampingan

Cancel a SubscriptionRevoke SubscriptionRequest Transaction Refund
PathadvancedCommerce/v1/subscription/cancel/{transactionId}advancedCommerce/v1/subscription/revoke/{transactionId}advancedCommerce/v1/transaction/requestRefund/{transactionId}
CakupanLangganan auto-renewableSatu langganan beserta semua itemnyaTagihan sekali bayar dan transaksi langganan
Uang kembaliTidak adaFULL atau PRORATEDFULL, PRORATED, atau CUSTOM, per SKU
AksesBerlanjut hingga akhir periodeBerakhir pada revocationDateDiatur per item dengan flag revoke
Batas laju produksi5 per detik5 per detik5 per detik

Cancel a Subscription menghentikan tagihan berikutnya

Cancel mematikan perpanjangan otomatis. Apple menyatakan pelanggan tetap punya akses hingga akhir periode berjalan. Tidak ada yang di-refund. Ini pilihan tepat saat pelanggan ingin berhenti dan sudah memakai waktu yang mereka bayar.

Revoke Subscription mengakhiri semuanya sekarang

Revoke mengatur perpanjangan otomatis ke false dan mencabut langganan dengan refund penuh atau prorata. Body-nya menerima refundReason, refundRiskingPreference, refundType, dan requestInfo. Apple lalu mengirim notifikasi REFUND ke endpoint App Store Server Notifications V2 Anda. Instruksi Apple spesifik: matikan layanan per revocationDate di notifikasi itu, dan jangan matikan sebelum notifikasi tiba.

Request Transaction Refund bekerja per item

Inilah alat yang presisi. Anda mengirim daftar item, dan masing-masing menyebut SKU, refundReason, refundType, dan flag revoke. Dengan CUSTOM Anda juga mengirim refundAmount dalam milliunit mata uang, jadi 4990 berarti 4.99. Kirim jumlah bersama FULL atau PRORATED, dan Apple menolaknya dengan error 4000155. Respons berisi transaksi bertanda tangan dan, untuk langganan, info perpanjangan bertanda tangan.

Apple menerima nilai refundReason berikut: UNINTENDED_PURCHASE, FULFILLMENT_ISSUE, UNSATISFIED_WITH_PURCHASE, LEGAL, OTHER, dan MODIFY_ITEMS_REFUND. Nilai ketujuh, SIMULATE_REFUND_DECLINE, hanya untuk pengujian sandbox dan TestFlight, dan nilai itu ada karena App Store bisa menolak.

Apple tetap bisa menolak permintaan refund Anda sendiri

Nama endpoint-nya jujur. Ini sebuah permintaan. Dua field menunjukkan di mana keputusan sebenarnya berada.

refundRiskingPreference mengundang pemeriksaan konsumsi

Apple menjelaskan refundRiskingPreference sebagai penentu apakah App Store meminta data konsumsi dari Anda untuk menjadi dasar keputusan refund. Nilai default-nya true. Jika true, Anda menerima CONSUMPTION_REQUEST atas permintaan refund Anda sendiri dan menjawab lewat Send Consumption Information. Apple meminta developer merespons dalam 12 jam setelah menerima CONSUMPTION_REQUEST. Atur ke false, dan notifikasi itu tidak datang.

Error yang berarti penolakan

ErrorKodeKata Apple
AlreadyRefundedError4030021Transaksi sudah di-refund
PendingRefundError4000181Transaksi memiliki refund yang tertunda
TransactionNotRefundableError4030024Transaksi tidak dapat di-refund
TransactionCannotBeRefundedContactSupportError4030025Pelanggan dapat menghubungi Apple Support
RefundAmountWithoutCustomError4000155Jumlah dikirim tanpa CUSTOM

PendingRefundError adalah yang perlu Anda antisipasi. Penyebab yang mungkin adalah pelanggan yang sudah mengajukan ke Apple lewat Report a Problem sebelum tim dukungan Anda bertindak. Aturan kelayakan Apple tetap mewajibkan aplikasi ini menyediakan jalur refund di dalam aplikasi, entah tautan Report a Problem atau API beginRefundRequest, jadi kedua pintu terbuka bersamaan.

Seorang developer memegang iPhone di atas buku besar transaksi yang dicetak, memeriksa item mana yang harus dicakup refund Advanced Commerce API

Berapa biaya refund Advanced Commerce API bagi Anda

Me-refund atas inisiatif sendiri terasa lebih murah daripada melawan sengketa. Tetap saja uang keluar, dan API ini membuat beberapa kesalahan mudah terulang dalam skala besar.

Pajak di dalam jumlah khusus

Apple menyatakan refundAmount yang diminta wajib sudah termasuk pajak untuk semua wilayah kecuali Kanada dan Amerika Serikat. Tim yang menghitung refund CUSTOM dari harga SKU sebelum pajak akan me-refund terlalu sedikit di setiap storefront lain, lalu membuang waktu dukungan untuk memperbaiki satu per satu.

Biaya yang tidak kembali

  • Pembayaran ke kreator: di katalog kreator atau host mini app, bagian kreator sering dibayar saat penjualan. Refund ke pelanggan tidak menariknya kembali.
  • Lisensi konten: biaya per judul yang terutang kepada pemegang hak untuk audiobook atau kursus bisa terpicu oleh akses, tergantung kontrak Anda, dan refund tidak membatalkannya.
  • Komputasi: streaming, transcoding, dan pekerjaan server apa pun untuk pembelian itu sudah masuk tagihan Anda.
  • Panggilan API: layanan pihak ketiga yang ditagih per permintaan, dari speech hingga inferensi model, tetap tertagih setelah refund.

Refund penuh padahal maksudnya satu item

Revoke Subscription me-refund dan mengakhiri seluruh langganan, termasuk add-on. Jika pelanggan hanya mempersoalkan satu add-on, Request Transaction Refund memungkinkan Anda me-refund SKU itu saja, dengan revoke diatur hanya untuk item tersebut. Memanggil Revoke Subscription untuk keluhan satu item ikut mengembalikan pendapatan paket dasar.

Checklist build sebelum mengaktifkan fitur ini

  • Pastikan Account Holder Anda sudah menerima Advanced Commerce API Addendum versi terkini, dan pasang peringatan untuk error yang muncul saat kedaluwarsa.
  • Buat UUID requestReferenceId baru untuk setiap permintaan, dan pakai ulang UUID yang sama hanya untuk mencoba lagi panggilan yang timeout.
  • Antrekan panggilan refund. Batasnya 5 per detik per aplikasi, dan respons 429 membawa header Retry-After dalam milidetik UNIX.
  • Uji penolakan di sandbox dengan SIMULATE_REFUND_DECLINE, dan ingat batas sandbox adalah 10 persen dari produksi.
  • Tentukan refundRiskingPreference per kasus, dan siapkan responder konsumsi untuk jendela 12 jam saat nilainya tetap true.
  • Akhiri akses hanya saat notifikasi REFUND tiba, per revocationDate-nya.
  • Catat alasan, jumlah, dan SKU untuk setiap permintaan, agar tingkat refund Anda sendiri terlihat sebelum Apple melihatnya.

Pertanyaan yang sering diajukan

Apakah developer iOS bisa me-refund pelanggan secara langsung?
Tidak untuk pembelian App Store biasa. Seorang engineer Apple menyatakan pada Juni 2026 bahwa developer tidak dapat menerbitkan refund secara langsung. Aplikasi yang disetujui untuk Advanced Commerce API, dengan Addendum yang sudah ditandatangani, dapat mengajukannya lewat endpoint Request Transaction Refund, dan Apple tetap yang memutuskan.
Apa perbedaan Cancel dan Revoke di Advanced Commerce API?
Cancel mematikan perpanjangan otomatis dan pelanggan tetap punya akses hingga periode berakhir, tanpa refund. Revoke langsung mengakhiri langganan beserta semua itemnya dan me-refund jumlah penuh atau prorata. Apple mengirim notifikasi REFUND setelah revoke.
Bisakah saya me-refund jumlah khusus dengan Advanced Commerce API?
Bisa. Atur refundType ke CUSTOM dan kirim refundAmount dalam milliunit mata uang. Apple menyatakan jumlah itu wajib sudah termasuk pajak untuk semua wilayah kecuali Kanada dan Amerika Serikat, dan mengirim jumlah bersama FULL atau PRORATED mengembalikan error 4000155.
Apakah saya akan menerima CONSUMPTION_REQUEST untuk refund yang saya ajukan sendiri?
Bisa. refundRiskingPreference bernilai default true, sehingga App Store dapat meminta data konsumsi dari Anda lewat CONSUMPTION_REQUEST, dan Apple meminta balasan dalam 12 jam. Atur ke false, dan Apple menyatakan notifikasi itu tidak akan dikirim.
Mengapa permintaan refund Advanced Commerce API saya gagal?
Periksa kode error-nya. 4030021 berarti transaksi sudah di-refund, 4000181 berarti refund sudah tertunda, 4030024 berarti transaksi tidak dapat di-refund, dan 4030025 berarti pelanggan sebaiknya menghubungi Apple Support. Addendum yang belum ditandatangani atau sudah usang juga mengembalikan error.

Sumber dan bacaan lanjutan

RefundHalt

Autopilot refund untuk App Store dan Google Play

Baca selanjutnya

Permintaan refund berikutnya sudah menuju kepada Anda.

Siapkan RefundHalt dalam waktu yang dibutuhkan untuk membaca satu lagi email dukungan tentang refund yang tidak sempat Anda sengketakan.