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.

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 Subscription | Revoke Subscription | Request Transaction Refund | |
|---|---|---|---|
| Path | advancedCommerce/v1/subscription/cancel/{transactionId} | advancedCommerce/v1/subscription/revoke/{transactionId} | advancedCommerce/v1/transaction/requestRefund/{transactionId} |
| Cakupan | Langganan auto-renewable | Satu langganan beserta semua itemnya | Tagihan sekali bayar dan transaksi langganan |
| Uang kembali | Tidak ada | FULL atau PRORATED | FULL, PRORATED, atau CUSTOM, per SKU |
| Akses | Berlanjut hingga akhir periode | Berakhir pada revocationDate | Diatur per item dengan flag revoke |
| Batas laju produksi | 5 per detik | 5 per detik | 5 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
| Error | Kode | Kata Apple |
|---|---|---|
| AlreadyRefundedError | 4030021 | Transaksi sudah di-refund |
| PendingRefundError | 4000181 | Transaksi memiliki refund yang tertunda |
| TransactionNotRefundableError | 4030024 | Transaksi tidak dapat di-refund |
| TransactionCannotBeRefundedContactSupportError | 4030025 | Pelanggan dapat menghubungi Apple Support |
| RefundAmountWithoutCustomError | 4000155 | Jumlah 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.

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
- Apple Developer: Advanced Commerce API eligibility and requirements
- Advanced Commerce API: Request Transaction Refund
- Advanced Commerce API: RequestRefundItem
- Advanced Commerce API: refundRiskingPreference
- Advanced Commerce API: Revoke Subscription
- Advanced Commerce API: Rate limits
- Advanced Commerce API changelog
- App Store Server API: Send Consumption Information
- Apple Developer Forums: Refund option in App Store Server API
- Apple Developer: Mini Apps Partner Program
RefundHalt
Autopilot refund untuk App Store dan Google Play
Baca selanjutnya
Permintaan refund yang berlebihan bisa merugikan Anda lebih dari nilai refund itu sendiri, karena kedua toko aplikasi menganggapnya sinyal kualitas
Pedoman 5.6.4 Apple menyebut permintaan refund berlebihan sebagai tanda aplikasi tidak memenuhi standar kualitas, dan Perjanjian Distribusi Google mengizinkannya menghapus aplikasi developer baru berdasarkan tingkat refund. Berikut isi aturan tiap toko, biaya penghapusan, dan cara menghindarinya.
Verifikasi notifikasi server App Store sebelum Anda menindaklanjuti refund, karena siapa pun dapat mengirim ke URL webhook Anda
Notifikasi refund hanyalah permintaan HTTPS sampai Anda memeriksa tanda tangannya. Berikut cara memverifikasi notifikasi server App Store dan pesan RTDN Google Play, apa yang ditandatangani oleh setiap store, dan berapa kerugian Anda akibat refund palsu atau refund asli yang keliru ditolak.