Refund App Store: apa yang dilihat developer
Oleh Mehdi Azizi
Terbit , 8 mnt
Refund App Store diputuskan Apple sendiri. Developer menerima CONSUMPTION_REQUEST, bisa merespons dalam 12 jam, lalu tahu hasilnya lewat REFUND.
Di App Store, Apple yang menyetujui atau menolak refund, bukan developer. Pelanggan mengajukan permintaan di situs Apple atau dari dalam app kamu. Kalau kamu sudah memasang notifikasi server Apple, kamu menerima notifikasi CONSUMPTION_REQUEST saat permintaan diajukan, lalu REFUND atau REFUND_DECLINED saat keputusan keluar. Di antara keduanya, kamu punya 12 jam untuk mengirim data konsumsi dan preferensimu, asalkan pelanggan sudah memberi persetujuan.
Refund yang disetujui menghapus pembelian dari hak akses aktif pelanggan dan muncul sebagai angka negatif di laporan penjualanmu. Panduan ini merinci setiap tahap, apa yang bisa kamu kirim ke Apple, dan apa yang boleh kamu lakukan terhadap permintaan yang menyalahgunakan sistem. Aturannya berasal dari halaman Apple yang saya baca ulang pada 3 November 2026. Kasus nyatanya berasal dari alert yang saya pasang di app-app saya pada bulan Oktober.
Siapa yang memutuskan refund App Store?
Apple, dan hanya Apple. Halaman bantuan Apple menjelaskan alur pelanggan: dia login ke reportaproblem.apple.com, memilih "Request a refund", menyebutkan alasan, lalu memilih pembelian yang dimaksud. Apple menyarankan dia menunggu 24 sampai 48 jam untuk mendapat jawaban.
Pelanggan juga bisa meminta refund dari dalam app kamu. Untuk itu StoreKit menyediakan lembar permintaan, tersedia sejak iOS 15. Apple menyarankan untuk memanggilnya dari pengaturan akun atau menu bantuan. Lembar ini menampilkan pembelian dan daftar alasan, dan Apple butuh waktu hingga 48 jam untuk memutuskan.
Dalam kedua kasus, kamu tidak perlu menyetujui apa pun. Kamu hanya bisa memberi informasi dan preferensi, yang menjadi salah satu dari beberapa kriteria dalam keputusan Apple.
Apa yang dilihat masing-masing pihak, tahap demi tahap
| Tahap | Sisi pelanggan | Sisi developer |
|---|---|---|
| Permintaan | Formulir Apple atau lembar di dalam app | Notifikasi CONSUMPTION_REQUEST |
| Dalam 12 jam | Menunggu | Bisa mengirim data konsumsi |
| Dalam 48 jam | Jawaban dari Apple | Notifikasi REFUND atau REFUND_DECLINED |
| Setelah disetujui | Uang kembali ke metode pembayarannya | Pembelian dihapus dari hak akses aktif, unit negatif |
| Setelah disanggah | Refund dibatalkan oleh Apple | Notifikasi REFUND_REVERSED, akses harus dipulihkan |
App Store Connect hanya menampilkan refund yang sudah disetujui, di Sales and Trends. Permintaannya sendiri hanya datang lewat notifikasi server. Tanpa itu, kamu baru tahu ada refund setelah semuanya terjadi.
Notifikasi server untuk refund
App Store Server Notifications V2 mengirim lima jenis notifikasi yang relevan di sini. Kamu menerimanya di alamat HTTPS yang didaftarkan di App Store Connect, satu untuk production dan satu untuk sandbox.
| Notifikasi | Yang diumumkan | Yang kamu lakukan |
|---|---|---|
CONSUMPTION_REQUEST | Pelanggan meminta refund | Merespons dalam 12 jam, jika ada persetujuan |
REFUND | Apple sudah me-refund transaksi | Mencabut konten atau akses yang di-refund |
REFUND_DECLINED | Apple menolak permintaan | Tidak ada, akses tetap berjalan |
REFUND_REVERSED | Apple membatalkan refund setelah sanggahan dari pelanggan | Memulihkan apa yang sudah kamu cabut |
REVOKE | Pembelian yang dibagikan lewat Family Sharing tidak tersedia lagi | Mencabut akses anggota keluarga |
Server kamu harus merespons dengan kode HTTP antara 200 dan 206. Menurut halaman tentang respons notifikasi, kalau tidak, Apple mencoba ulang lima kali, 1, 12, 24, 48, lalu 72 jam setelah percobaan sebelumnya. Di sandbox, Apple hanya mengirim sekali.
Consumption API: apa yang bisa kamu sampaikan ke Apple
Saat permintaan masuk, kamu bisa merespons dengan Send Consumption Information. Aturannya cukup satu kalimat dari Apple: "Respond within 12 hours of receiving the CONSUMPTION_REQUEST notification." Versi 2 API ini berlaku untuk semua jenis produk, termasuk langganan.
Field dalam request:
| Field | Wajib | Yang disampaikan ke Apple |
|---|---|---|
customerConsented | Ya | Pelanggan setuju datanya dibagikan |
deliveryStatus | Ya | Pembelian sudah dikirim dan berfungsi, atau alasan kenapa belum |
sampleContentProvided | Ya | Ada trial, cuplikan, atau deskripsi yang ditawarkan sebelum pembelian |
consumptionPercentage | Tidak | Porsi yang sudah dipakai, dari 0 sampai 100.000 untuk 0 sampai 100% |
refundPreference | Tidak | Preferensimu: DECLINE, GRANT_FULL atau GRANT_PRORATED |
Ada dua hal penting. Kalau deliveryStatus bukan DELIVERED, porsi yang dipakai harus nol. Dan untuk refund prorata pada langganan, kamu tidak mengisi porsi yang dipakai: Apple yang menghitungnya.
Persetujuan adalah syarat utama. Apple menulis: "You must obtain valid consent from the customer before sharing their personal data with Apple in the Send Consumption Information API." Tanpa persetujuan, kamu tidak merespons. Apple juga melarang penggunaan jendela pelacakan iklan untuk meminta persetujuan ini: "Don't use the AppTrackingTransparency prompt to obtain consent".
Kalau kamu memakai RevenueCat
Dengan RevenueCat, dia yang menerima notifikasi Apple dan merespons permintaan, lewat Refund Control. Kamu memilih satu dari empat kebijakan: lebih memilih refund penuh, lebih memilih penolakan, hanya mengirim data konsumsi, atau tidak merespons.
Mengaktifkan berbagi data sama dengan mengonfirmasi bahwa kamu sudah mendapat persetujuan pelanggan. RevenueCat sendiri menyebutnya: "Enabling consumption data sharing confirms that you obtained consent from your Customers." Dia juga menyarankan agar "Prefer no refund" hanya dipakai untuk kelompok tertentu, dan memberi peringatan kalau preferensi ini mengenai sebagian besar pelangganmu.
Supaya notifikasi juga sampai ke server kamu sendiri, RevenueCat menyediakan field "Apple Server Notification Forwarding URL" di pengaturan app. Field ini dijelaskan di halamannya tentang notifikasi Apple. Ini yang saya pakai. Cara menyiapkan langganan dengan RevenueCat ada di RevenueCat dan langganan in-app iOS.
Dampaknya pada pendapatan dan langganan
Pada akses. Menurut dokumentasi currentEntitlements, "Products that the App Store has refunded or revoked don't appear in the current entitlements". Kalau app kamu mengecek hak akses dengan currentEntitlements, akses yang di-refund hilang dengan sendirinya. Transaksinya menyimpan tanggal dan alasan pencabutan, di revocationDate dan revocationReason.
Pada laporan. Menurut bantuan laporan penjualan, refund muncul dengan unit dan harga pelanggan negatif. Untuk langganan, halaman tentang data langganan menghitung refund penuh dan sebagian sebagai event, dan menguranginya dari unit harian.
Pada reputasimu. Guideline 5.6.4 menyebut permintaan refund yang berlebihan sebagai salah satu tanda kualitas yang kurang. Tingkat refund yang tinggi bukan cuma soal kehilangan uang: Apple bisa memperhitungkannya untuk menilai kepatuhanmu pada code of conduct.
Kasus saya: alert yang terpasang di app-app saya
Pada 12 Oktober 2026, saya memasang alert di app-app saya. RevenueCat meneruskan notifikasi Apple ke sebuah route di devoria.fr. Route itu memverifikasi tanda tangan Apple, lalu mengirimi saya alert, tanpa nominal. Saya ingin melihat permintaan saat itu juga, bukan cuma hasilnya.
Pada 18 Oktober, permintaan sungguhan pertama masuk di TradaZen, simulator trading saya. Langganan tahunan, dibayar di akhir trial gratis 7 hari. Alasan yang disebutkan: pembelian tidak disengaja. Tiga pelajaran:
- Permintaan yang sama bisa datang beberapa kali. Saya menerima alert yang sama tiga kali di malam yang sama. Sejak itu, setiap alert dideduplikasi berdasarkan jenis notifikasi dan ID transaksi.
- Keputusan datang dalam waktu kurang dari sehari. Apple menolak sekitar 22 jam setelah permintaan. Pelanggan tetap punya akses.
- Penolakan bukan akhir cerita. Pelanggan yang sama mengajukan lagi dua hari kemudian, untuk transaksi yang sama.
Permintaan dengan alasan "pembelian tidak disengaja" di akhir trial tidak dimenangkan lewat respons ke Apple. Itu dicegah di paywall, sebelum pembayaran pertama.
Mengurangi permintaan curang tanpa melanggar aturan
Yang boleh:
- Merespons setiap permintaan dengan data yang akurat, kalau pelanggan sudah setuju.
- Menyampaikan preferensi yang terarah, misalnya penolakan untuk pembelian yang sudah dipakai, bukan penolakan untuk semua orang.
- Menghubungkan setiap
REFUNDdengan akun pelanggan. Halaman Apple tentang notifikasi refund merekomendasikan ini untuk mendeteksi refund berulang. - Menjelaskan dengan jelas apa yang dibeli sebelum pembelian. Guideline 3.1.2(c) meminta kamu menjelaskan apa yang didapat pengguna dengan harga itu, sebelum menawarinya berlangganan.
Yang dilarang:
- Mengirim data palsu agar permintaan ditolak, atau merespons tanpa persetujuan.
- Meminta persetujuan lewat jendela pelacakan iklan, yang dilarang Apple secara tegas.
- Menjebak pembelian. Guideline 5.6 melarang mendorong pelanggan melakukan pembelian yang tidak diinginkan atau menagih sesuatu yang tidak dikirim.
- Menekan pelanggan yang meminta refund. Aturan yang sama mewajibkan sikap hormat dalam layanan pelanggan, tanpa intimidasi.
Senjata terbaik tetap ada di awal: paywall yang menyebutkan harga, tanggal pembayaran pertama, dan cara membatalkan. Kesalahan yang perlu dihindari ada di kesalahan paywall, dan aturan trial ada di trial gratis di App Store.
Uji sebelum production
Menurut halaman tentang pengujian permintaan, sandbox dan pengujian StoreKit di Xcode menerima permintaan refund. Di sandbox, alasan apa pun otomatis disetujui. Untuk mensimulasikan penolakan, pilih "Other" dan ketik DECLINE. Untuk refund prorata, ketik GRANT_PRORATED. Di sandbox, respons konsumsimu harus terkirim dalam lima menit.
Langganan yang lebih jarang di-refund
iOS & Android Kit berangkat dari kode app-app saya, dengan onboarding, paywall, dan langganan yang sudah dikodekan, dan mengikuti empat tahap sampai ke App Store, sesuai ritmemu. Penyiapan lengkapnya dirinci di halaman langganan in-app iOS, dan aturan Apple soal langganan di guideline 3.1.2.
Sebelum meluncurkan paywall, lakukan diagnostik gratis: diagnostik ini memberi tahu apa yang benar-benar menghambat proyekmu dan mengirimkan checklist anti-penolakan Apple dari saya.
Pertanyaan umum
Apakah developer bisa menolak refund App Store?
Tidak. Apple yang memutuskan sendiri. Kamu bisa mengirim data konsumsi dan preferensi, misalnya DECLINE, yang menjadi salah satu dari beberapa kriteria. Keputusan akhir tetap di tangan Apple.
Apakah developer diberi tahu saat ada permintaan refund?
Ya, kalau dia sudah memasang App Store Server Notifications V2. Apple mengirim CONSUMPTION_REQUEST saat permintaan diajukan, lalu REFUND atau REFUND_DECLINED saat keputusan keluar. Tanpa notifikasi, kamu hanya melihat refund yang sudah disetujui, di laporanmu.
Berapa lama Apple memproses permintaan refund?
Apple menyebut 24 sampai 48 jam kepada pelanggan. Dokumentasi StoreKit menyebut paling lama 48 jam. Di sisimu, kamu punya 12 jam untuk mengirim data konsumsi.
Apa yang terjadi pada akses setelah refund?
Pembelian yang di-refund keluar dari hak akses aktif pelanggan: StoreKit 2 tidak lagi mengembalikannya di currentEntitlements. Kalau Apple kemudian membatalkan refund, kamu menerima REFUND_REVERSED dan harus memulihkan akses.
Apakah perlu persetujuan pelanggan untuk merespons Apple?
Ya. Apple mewajibkan persetujuan yang sah sebelum data apa pun dibagikan lewat Consumption API. Tanpa itu, kamu tidak merespons notifikasi. Jendela pelacakan iklan tidak boleh dipakai untuk memintanya.
Apakah refund merugikan app saya?
Bisa. Guideline 5.6.4 menyebut permintaan refund yang berlebihan sebagai salah satu tanda kualitas yang kurang, yang bisa diperhitungkan Apple untuk menilai kepatuhan pada code of conduct.

