Blog · 8 September 2026
Membatalkan tagihan yang terlanjur dibuat: bedanya dengan membiarkannya kedaluwarsa, dan satu pintu yang ikut tertutup
Nominalnya salah satu digit, tautannya sudah terkirim ke chat pembeli, dan sekarang ada dua tombol yang sama-sama menutup tagihan itu: membatalkannya sekarang, atau membiarkan masa berlakunya habis sendiri. Keduanya menghasilkan tagihan yang tidak bisa dibayar lagi, tetapi berhenti pada status yang berbeda, dan perbedaannya nyata pada tiga hal: apakah uang yang datang terlambat masih bisa diakui, berapa jatah harian yang kembali, dan kalimat apa yang dibaca pembeli kalau tautannya terlanjur dibuka.
Ringkasnya, dan sisanya adalah penjelasan dari tiga baris ini. Membatalkan menutup pintu sepenuhnya: status canceled tidak bisa berubah menjadi apa pun setelahnya. Membiarkan kedaluwarsa menyisakan satu pintu: status expired masih bisa berubah menjadi succeeded kalau ternyata uangnya sudah diterima sebelum waktunya habis. Dan hanya pembatalan yang mengembalikan jatah harian yang sudah terpakai, baik jumlah permintaannya maupun nominalnya.
Perbedaannya dalam satu tabel
| Dibatalkan | Dibiarkan kedaluwarsa | |
|---|---|---|
| Status akhir | canceled | expired |
| Masih bisa menjadi lunas | Tidak pernah | Bisa, kalau uangnya diterima sebelum waktunya habis |
| Kapan berhenti | Seketika, saat tombolnya ditekan | Saat masa berlaku habis, standarnya 60 menit |
| Jatah 100 permintaan per hari | Slotnya kembali | Slotnya tetap terpakai |
| Jatah nominal Rp 50.000.000 per hari | Nominalnya kembali | Nominalnya tetap terpakai |
| Yang dibaca pembeli | “Pembayaran dibatalkan” | “Tautan kedaluwarsa” |
Satu pintu yang hanya dimiliki tagihan kedaluwarsa
Sebuah tagihan yang kedaluwarsa belum tentu selesai. Kalau pembayarannya sebenarnya sudah diterima beberapa detik sebelum penghitung waktu berhenti, dan konfirmasinya baru sampai setelahnya, tagihan itu tetap berpindah dari expired menjadi succeeded. Uangnya menang atas jam. Ini satu-satunya perpindahan yang diizinkan keluar dari status akhir, dan alasannya sederhana: memberi tahu penjual bahwa dirinya tidak dibayar padahal uangnya sudah masuk adalah kesalahan yang jauh lebih mahal daripada menutup tagihan terlambat.
Pembatalan tidak punya pintu itu. Begitu sebuah tagihan berstatus canceled, tidak ada peristiwa apa pun yang bisa mengubahnya, termasuk uang yang benar-benar datang. Karena itu urutan yang benar bukan soal selera: selama masih ada kemungkinan pembeli sedang berada di depan layar pembayaran, membiarkannya kedaluwarsa lebih aman daripada membatalkannya.
Kalau uangnya tetap datang ke tagihan yang sudah dibatalkan
Uang itu tidak hilang, tidak otomatis diakui, dan tidak otomatis dikembalikan. Notifikasi yang datang untuk tagihan yang sudah berstatus akhir dikarantina: statusnya tidak diubah, dan seluruh isi notifikasinya disimpan sebagai bukti, termasuk nominal yang benar-benar disebut oleh penyedia jasa pembayaran berlisensi. Penyelesaiannya menjadi urusan manusia, bukan urusan sistem, dan itu memang disengaja: menulis ulang riwayat sebuah pembayaran yang sudah dinyatakan batal adalah cara paling cepat membuat catatan tidak lagi bisa dipercaya.
Bentuk yang sama berlaku untuk nominal yang tidak cocok pada tagihan yang masih menunggu, dan alasannya diuraikan di tulisan tentang pembayaran yang gagal di sisi pembeli. Yang perlu diingat di sini hanya satu: karantina berarti ada satu baris yang tidak akan pernah cocok sendiri pada rekap harian, dan baris itu lahir dari keputusan membatalkan.
Jatah harian, satu-satunya alasan operasional untuk membatalkan
Sebuah akun dibatasi 100 permintaan pembayaran per hari dan total Rp 50.000.000 per hari, dihitung dalam zona waktu Asia/Jakarta, lengkapnya di halaman batasan. Dua jatah itu tidak diperlakukan sama.
Pada kedua meteran itu, satu-satunya status yang dikecualikan adalah canceled. Tagihan yang kedaluwarsa, yang gagal, yang masih menunggu, dan yang sudah lunas semuanya tetap terhitung, baik pada jumlah permintaannya maupun pada nominalnya, karena semuanya benar-benar pernah diterbitkan kepada pembeli. Menerbitkan ulang tautan yang kedaluwarsa karena itu tidak pernah mengembalikan meterannya, dan pada hari yang sibuk kedua jatah itu bisa habis oleh tagihan yang tidak satu pun dibayar.
Akibatnya paling terasa pada penjual yang membiasakan diri menerbitkan tautan baru setiap kali pembeli lambat membayar. Sepuluh tautan untuk satu pesanan yang sama menghabiskan sepuluh slot dan sepuluh kali nominalnya, walaupun sembilan di antaranya tidak pernah dibuka. Membatalkan yang lama sebelum menerbitkan yang baru adalah satu-satunya cara menghentikan penumpukan itu.
Kesimpulan praktisnya satu kalimat: membatalkan adalah satu-satunya tindakan yang mengembalikan apa pun ke jatah harian, dan itulah alasan operasional terkuat untuk menekan tombolnya alih-alih menunggu. Yang menabrak batas itu secara rutin sebaiknya meminta kenaikan batas, bukan membiasakan diri membatalkan.
Yang dibaca pembeli, kata per kata
Tautan yang sudah ditutup tetap bisa dibuka. Halamannya tidak menghilang, tidak menjadi halaman kosong, dan tidak menampilkan kode kesalahan. Yang berubah hanya isinya, dan isinya berbeda tergantung jalan mana yang dipakai:
- Dibatalkan: “Pembayaran dibatalkan”, dengan penjelasan “Penjual membatalkan permintaan ini.”
- Kedaluwarsa: “Tautan kedaluwarsa”, dengan penjelasan “Waktu pembayaran sudah habis. Minta tautan baru ke penjual.”
Perbedaannya kecil di layar dan besar di percakapan. Kalimat kedaluwarsa sudah mengandung instruksi berikutnya, sehingga pembeli tahu harus meminta tautan baru. Kalimat pembatalan menunjuk penjual sebagai pihak yang memutuskan, tanpa memberi tahu apa yang harus dilakukan sesudahnya. Kalau tagihan dibatalkan karena akan diganti dengan nominal yang benar, tautan penggantinya sebaiknya dikirim lebih dulu, atau menyusul dalam hitungan detik, supaya kalimat itu tidak dibaca sebagai penolakan.
Cara membatalkannya, dan satu batasan yang perlu diketahui developer
Pembatalan dilakukan dari dashboard, pada halaman detail transaksi, dan tombolnya hanya muncul selama tagihannya masih menunggu. Sisi lain dari kalimat itu penting bagi yang sedang membangun integrasi: API publik tidak memiliki jalur pembatalan. Yang tersedia di sana adalah membuat transaksi, membaca satu transaksi, membaca daftar transaksi, membaca daftar metode pembayaran, serta membuat dan membaca pengembalian dana, seperti tertulis di dokumentasi API. Sebuah sistem yang menerbitkan tagihan secara otomatis karena itu tidak bisa menariknya kembali secara otomatis. Yang tersisa baginya ada dua: menetapkan masa berlaku yang pendek sejak awal, atau menyerahkan pembatalannya kepada manusia yang membuka dashboard.
Menetapkan masa berlaku sejak awal adalah jalan yang lebih baik dari keduanya, dan cara memilih angkanya dibahas di tulisan tentang masa berlaku tagihan. Standarnya 60 menit dengan batas 24 jam.
Permintaan pembatalan yang datang terlambat ditolak dengan tegas, bukan diterima diam-diam. Tagihan yang sudah lunas, sudah kedaluwarsa, atau sudah dibatalkan sebelumnya menghasilkan penolakan not_cancelable dengan keterangan bahwa hanya permintaan yang masih menunggu yang bisa dibatalkan. Menekan tombolnya dua kali karena layar terasa lambat juga aman: percobaan kedua ditolak, bukan menghasilkan pembatalan kedua yang membingungkan. Daftar kode penolakan selengkapnya ada di halaman kode kesalahan.
Satu keadaan tempat membatalkan justru menciptakan masalah
Pembeli mengirim pesan “sudah saya bayar”, tetapi daftar transaksi masih menunjukkan menunggu. Godaan pertama adalah membatalkan tagihan itu lalu menerbitkan yang baru supaya rapi. Itu justru urutan yang paling berisiko, karena dua hal bisa terjadi bersamaan: konfirmasi pembayaran pertama menyusul dan masuk ke tagihan yang sudah dibatalkan sehingga dikarantina, sementara pembeli membayar tautan kedua karena merasa yang pertama ditolak. Hasil akhirnya satu pesanan dengan dua kali uang keluar dari pembeli, dan hanya salah satunya yang tercatat sebagai lunas.
Urutan yang benar adalah menunggu. Tagihan yang berstatus menunggu akan berhenti sendiri pada masa berlakunya, dan kalau uangnya memang sudah diterima lebih dulu, statusnya berubah menjadi lunas tanpa perlu dibantu. Membatalkan baru masuk akal setelah jelas tidak ada pembayaran yang sedang berjalan, misalnya karena pembeli menyatakan batal membeli atau karena nominalnya salah dan belum ada yang membukanya.
Aturan yang bisa dipakai hari ini
- Salah ketik nominal dan tautannya belum terkirim: batalkan. Tidak ada yang bisa sedang membayar, dan slot hariannya kembali.
- Tautan sudah terkirim tetapi belum dibuka, dan pembeli sudah dikabari: batalkan, lalu kirim tautan penggantinya pada pesan yang sama.
- Pembeli mengaku sudah membayar: jangan batalkan. Biarkan kedaluwarsa, karena hanya jalan itu yang masih bisa mengakui uangnya.
- Pesanan batal setelah pembayarannya lunas: bukan wilayah pembatalan sama sekali. Yang berlaku adalah pengembalian dana, dan aturannya berbeda per metode, diuraikan di tulisan tentang pengembalian dana ke pembeli.
- Tagihan menumpuk tanpa dibayar setiap hari: yang perlu diperbaiki masa berlakunya, bukan kebiasaan membatalkannya.
Pada rekap akhir hari, tagihan yang dibatalkan dan yang kedaluwarsa sama-sama muncul dengan namanya sendiri dan tidak pernah ikut terhitung sebagai penjualan. Satu-satunya baris yang perlu diperiksa manusia adalah yang dikarantina, dan baris itu hanya ada kalau ada tagihan yang ditutup lebih cepat daripada uang yang sedang berjalan.