# Refund App Store: apa yang dilihat developer

> Refund App Store diputuskan Apple sendiri. Developer menerima CONSUMPTION_REQUEST, bisa merespons dalam 12 jam, lalu tahu hasilnya lewat REFUND.

Halaman asli: [Refund App Store: apa yang dilihat developer](https://devoria.fr/id/blog/refund-app-store-apa-yang-dilihat-developer)
Penulis: [Mehdi Azizi](https://devoria.fr/id/mehdi-azizi)
Terbit: 2026-11-04
Revisi konten terakhir: 2026-11-04


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](https://support.apple.com/en-us/118223) 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](https://developer.apple.com/documentation/storekit/transaction/beginrefundrequest%28in%3A%29-9k0pj), 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](https://developer.apple.com/documentation/appstoreservernotifications/notificationtype) 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](https://developer.apple.com/documentation/appstoreservernotifications/responding-to-app-store-server-notifications), 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](https://developer.apple.com/documentation/appstoreserverapi/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](https://developer.apple.com/documentation/appstoreserverapi/consumptionrequest):

| 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](https://www.revenuecat.com/docs/customers/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](https://www.revenuecat.com/docs/platform-resources/server-notifications/apple-server-notifications). Ini yang saya pakai. Cara menyiapkan langganan dengan RevenueCat ada di [RevenueCat dan langganan in-app iOS](https://devoria.fr/id/blog/revenuecat-langganan-in-app-ios).

## Dampaknya pada pendapatan dan langganan

**Pada akses.** Menurut [dokumentasi `currentEntitlements`](https://developer.apple.com/documentation/storekit/transaction/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](https://developer.apple.com/help/app-store-connect/reference/reporting/summary-sales-report), refund muncul dengan unit dan harga pelanggan negatif. Untuk langganan, [halaman tentang data langganan](https://developer.apple.com/help/app-store-connect/measure-app-performance/view-subscription-data) menghitung refund penuh dan sebagian sebagai event, dan menguranginya dari unit harian.

**Pada reputasimu.** [Guideline 5.6.4](https://developer.apple.com/app-store/review/guidelines/#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:

1. **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.
2. **Keputusan datang dalam waktu kurang dari sehari.** Apple menolak sekitar 22 jam setelah permintaan. Pelanggan tetap punya akses.
3. **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 `REFUND` dengan akun pelanggan.** [Halaman Apple tentang notifikasi refund](https://developer.apple.com/documentation/storekit/handling-refund-notifications) merekomendasikan ini untuk mendeteksi refund berulang.
- **Menjelaskan dengan jelas apa yang dibeli sebelum pembelian.** [Guideline 3.1.2(c)](https://developer.apple.com/app-store/review/guidelines/#3.1.2) 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](https://developer.apple.com/app-store/review/guidelines/#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](https://devoria.fr/id/blog/paywall-ios-kesalahan-pemula-penjualan), dan aturan trial ada di [trial gratis di App Store](https://devoria.fr/id/blog/introductory-offer-app-store-connect-uji-coba-gratis-ios).

## Uji sebelum production

Menurut [halaman tentang pengujian permintaan](https://developer.apple.com/documentation/storekit/testing-refund-requests), 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](https://devoria.fr/id/kits/ios) 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](https://devoria.fr/id/expertise/langganan-in-app-ios), dan aturan Apple soal langganan di [guideline 3.1.2](https://devoria.fr/id/blog/guideline-3-1-2-aplikasi-ditolak-langganan).

Sebelum meluncurkan paywall, [lakukan diagnostik gratis](https://devoria.fr/id/diagnostic): 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.


## Proyekmu

[iOS & Android Kit](https://devoria.fr/id/kits/ios): Bikin app iPhone dan Android kamu dengan Claude Code: kode awal dari app-app saya, langkah demi langkah sampai ke store, dan semua kit. Rp 1.999.000.

[Diagnosis: apa yang memisahkanmu dari app iPhone-mu](https://devoria.fr/id/diagnostic): 7 pertanyaan, 60 detik: kamu tahu apa yang benar-benar menghambatmu merilis app iPhone, jalurmu dalam 4 tahap, dan kit yang cocok untukmu.
