Blog · 4 September 2026
Mengembalikan uang pembeli pada QRIS dan Virtual Account: prosedurnya dan biaya yang hangus
Pada pembayaran QRIS dan Virtual Account tidak ada tombol pengembalian dana di dashboard dan tidak ada endpoint yang bisa dipanggil. Uangnya kembali lewat transfer bank biasa, dari rekening usaha penjual ke rekening pembeli. Ini bukan celah integrasi yang bisa ditambal: permintaan refund pada metode selain kartu ditolak 422 refund_not_supported, dan dokumentasi Virtual Account menyatakannya dengan satu kalimat, yaitu VA tidak bisa dibalik.
Yang bisa diatur adalah prosedurnya, nominal yang dikembalikan, dan catatannya. Satu hal yang berlaku di semua metode, termasuk kartu: biaya per transaksi tidak pernah ikut kembali. Pengembalian dana selalu meninggalkan selisih, dan besar selisih itu ditentukan metode pembayarannya, bukan besar pesanannya.
Tiga jalur, dan hanya satu yang otomatis
| Metode | Refund lewat API | Cara uangnya kembali | Biaya yang hangus |
|---|---|---|---|
| QRIS | Tidak | Transfer manual dari rekening usaha | 0,7% + Rp 250 |
| Virtual Account, delapan bank | Tidak | Transfer manual dari rekening usaha | Rp 5.000 |
| Kartu | Ya, POST /v1/refunds | Lewat penerbit kartu, ke kartu yang sama | 2,8% + Rp 2.500 |
Daftar metode yang aktif hari ini beserta kodenya ada di dokumentasi metode pembayaran. Untuk sebagian besar penjual, dua baris pertama adalah seluruh isi persoalan ini, karena di sanalah hampir semua pembayaran masuk.
Satu pertanyaan yang sering muncul lebih dulu: apakah uangnya bisa ditahan saja di saldo supaya tidak perlu transfer sendiri. Tidak bisa, dan letak pembayarannya tidak mengubah apa pun. Pada QRIS dan Virtual Account tidak ada jalur yang menarik kembali satu pembayaran dari saldo, jadi baik pembayaran itu belum dicairkan maupun sudah masuk ke rekening, uang yang kembali ke pembeli tetap berangkat dari dana penjual sendiri.
Kenapa QRIS memang tidak bisa dibatalkan sepihak
Alasannya ada di arah transaksinya, dan syarat layanan Kasera Pay menyebutnya apa adanya: “Pembayaran QRIS adalah pembayaran yang didorong pembayar: pelanggan Anda mengesahkannya di aplikasinya sendiri.” Otorisasinya terjadi di aplikasi pembayar, bukan di sistem penjual, sehingga tidak ada instruksi penjual yang bisa membatalkannya setelah dana berpindah. Dokumen yang sama menempatkan sengketa barang dan jasa sebagai urusan penjual dengan pelanggannya. Artinya keputusan mengembalikan uang adalah keputusan dagang, bukan permintaan teknis yang bisa diajukan ke penyedia pembayaran.
Sebelum mengembalikan apa pun: pastikan uangnya memang masuk
Kesalahan yang paling mahal di seluruh alur ini adalah mengirim uang kembali untuk pembayaran yang sebenarnya tidak pernah berhasil. Hanya baris berstatus succeeded yang membawa uang. Baris pending belum dibayar, expired sudah lewat masa berlakunya dan tidak akan menerima apa pun, dan keduanya tidak perlu dikembalikan sama sekali karena tidak ada dana yang berpindah.
Kalau pembeli bersikeras sudah membayar sementara statusnya belum berubah, itu persoalan lain dengan urutan pemeriksaan tersendiri, dan tangkapan layar bukti transfer bukan jawabannya. Urutannya ada di artikel tentang pembayaran yang katanya sudah dibayar. Selesaikan itu lebih dulu. Pengembalian dana baru relevan setelah satu baris succeeded yang benar berhasil ditunjuk.
Prosedur untuk QRIS dan Virtual Account
- Kunci fakta pembayarannya. Catat referensi transaksinya dan nominal bruto yang tertera pada baris itu. Dua angka itu yang menghubungkan uang keluar nanti dengan pembayaran yang masuk hari itu.
- Kembalikan bruto, bukan bersih. Yang berpindah dari kantong pembeli adalah nominal bruto. Nominal bersih adalah bruto dikurangi biaya per transaksi, dan itu angka internal penjual. Mengembalikan angka bersih berarti pembeli menanggung biaya atas pesanan yang batal, yang hampir selalu menjadi keluhan berikutnya. Kalau mode penanggung biaya diatur ke pembeli, bruto yang dibayar memang lebih besar daripada harga barangnya, dan bruto itu pula yang dikembalikan.
- Minta nomor rekening lewat kanal yang sama dengan pesanan. Catatan pembayaran hanya menyimpan nama, email, dan nomor telepon pembayar bila memang diisi. Nomor rekening pembeli tidak pernah ada di sana, pada QRIS maupun Virtual Account. Permintaan pengembalian yang datang dari akun baru, nomor baru, atau percakapan yang berbeda dengan tempat pesanan dibuat adalah bentuk penipuan yang paling murah untuk dicoba, dan menjawabnya lewat kanal asal pesanan menutup seluruh peluang itu.
- Transfer dari rekening usaha, dengan berita yang bisa dicari. Isi berita transfer dengan referensi atau nomor pesanan, bukan kata “refund” saja. Tiga bulan lagi, baris mutasi itulah satu-satunya bukti yang tersisa.
- Beri tahu pembeli nama pengirimnya. Dana masuk atas nama rekening usaha penjual, bukan atas nama Kasera Pay, dan tanpa keterangan itu pembeli tidak akan mengenali kiriman yang ditunggunya. Sebutkan juga bahwa waktu tibanya mengikuti bank pengirim dan bank penerima.
- Catat di luar sistem pembayaran. Baris pembayarannya tetap
succeededselamanya, karena memang begitulah faktanya: uang itu pernah masuk. Ekspor CSV berisi tanggal, referensi, referensi penjual, deskripsi, status, bruto, biaya, bersih, sumber, dan penanda mode uji, dan tidak satu pun di antaranya menyebut pengembalian. Buku pengembalian dana harus berdiri sendiri, dengan referensi pembayaran sebagai kunci sambungannya ke rekonsiliasi harian.
Berapa yang hangus, pada pembayaran Rp 150.000
| Metode | Dibayar pembeli | Biaya transaksi | Diterima penjual | Selisih setelah dikembalikan |
|---|---|---|---|---|
| QRIS | Rp 150.000 | Rp 1.300 | Rp 148.700 | Rp 1.300 |
| Virtual Account | Rp 150.000 | Rp 5.000 | Rp 145.000 | Rp 5.000 |
| Kartu | Rp 150.000 | Rp 6.700 | Rp 143.300 | Rp 6.700 |
Pada dua baris pertama masih ada satu biaya lagi yang tidak muncul di tabel mana pun, yaitu biaya transfer keluar yang dikenakan bank pengirim, besarnya ditentukan bank itu sendiri. Pada baris kartu, nominal yang dikembalikan ditahan dari pencairan berikutnya, jadi uangnya keluar dari saldo dan bukan dari rekening pribadi, tetapi biayanya tetap hangus persis seperti dua baris di atasnya.
Konsekuensi praktisnya untuk kebijakan toko: pengembalian dana pada nominal kecil hampir seluruhnya adalah biaya. Pada pesanan Rp 25.000 lewat QRIS, biaya yang hangus Rp 425 ditambah biaya transfer keluar, yang bisa lebih besar daripada margin pesanan itu sendiri. Toko yang sering menerima pembatalan pada nominal kecil lebih baik memperbaiki penyebab pembatalannya daripada menyempurnakan prosedur pengembaliannya.
Pesanan yang batal sebagian
Pada QRIS dan Virtual Account tidak ada yang khusus: kembalikan nominal yang disepakati lewat transfer, dan catat sisanya sebagai penjualan yang tetap berjalan. Pada kartu, refund sebagian dikirim dengan menyebut amount, boleh diulang sampai nominal yang dibayar habis, dan satu rupiah lebih dari sisanya ditolak 422 refund_exceeds_amount.
Penyebab paling sering: satu pesanan dibayar dua kali
Pembayaran ganda adalah alasan pengembalian dana yang paling banyak muncul di toko kecil, dan bentuknya hampir selalu sama: satu tautan kedaluwarsa atau dianggap gagal, pembeli minta tautan baru, lalu keduanya dibayar. Dua tautan itu adalah dua pembayaran yang sah, keduanya succeeded, dan yang kedua dikembalikan dengan prosedur yang sama seperti di atas.
Yang perlu diluruskan sekalian: hanya header Idempotency-Key yang membuat dua permintaan pembuatan dianggap satu. Nomor pesanan sendiri, baik lewat merchant_ref maupun external_id, adalah label yang disimpan dan bisa dicari, bukan klaim bahwa dua permintaan adalah satu pembayaran. Ini mencegah tagihan ganda dari sisi sistem, bukan pembayaran ganda dari sisi pembeli, dan bedanya dibahas di artikel tentang idempotensi.
Kartu: satu-satunya jalur otomatis
Refund kartu dikirim ke POST /v1/refunds dengan transaction_id, amount opsional untuk refund sebagian, dan reason yang disimpan tetapi tidak ditampilkan ke pembeli. Hanya pembayaran kartu berstatus succeeded yang bisa direfund; status lain ditolak 409 not_refundable. Satu perbedaan halus yang layak diingat: pada refund tidak ada perbandingan isi body, jadi permintaan ulang dengan Idempotency-Key yang sama mengembalikan refund yang asli apa pun isi body kali ini, dan tanpa header itu setiap percobaan ulang adalah refund baru. Rinciannya ada di dokumentasi buat refund, dan sisi dagangnya, termasuk chargeback dan kapan kartu layak dinyalakan, ada di artikel tentang pembayaran kartu.
Ringkasnya
- QRIS dan Virtual Account kembali lewat transfer manual, tanpa pengecualian.
- Pastikan statusnya
succeededsebelum mengirim apa pun kembali. - Kembalikan nominal bruto, dan minta nomor rekening lewat kanal asal pesanan.
- Biaya per transaksi tidak pernah kembali, jadi setiap pengembalian dana adalah kerugian sebesar biaya itu ditambah biaya transfer keluar.
- Catat pengembaliannya di luar sistem, karena baris pembayarannya tetap
succeededdan ekspornya tidak punya kolom untuk itu.