KNOWLEDGE BASE · RUBY POS · KB - P OS- 02
Pembayaran VA Duitku Pending atau Gagal
Penyebab dan langkah penanganan saat pembayaran Virtual Account Duitku di Ruby POS bermasalah
Produk | Ruby POS (Windows) |
Fitur | Pembayaran Virtual Account (VA) Duitku |
Ditujukan untuk | Kasir, Head Kasir, dan Tim IT toko |
Dampak | Sedang sampai tinggi – transaksi tertahan, atau uang masuk tetapi penjualan tidak tercatat |
Tanggal dokumen | 23 Oktober 2026 |
1. Ringkasan
Pembayaran Virtual Account (VA) Duitku di Ruby POS bisa bermasalah dalam tiga bentuk: status tetap Pending padahal pelanggan sudah transfer, pembayaran ditolak karena melebihi batas, atau uang sudah masuk tetapi penjualan belum tercatat.
Sebagian besar kasus bisa diselesaikan kasir sendiri dengan menekan tombol F12 (Check Status) dan dengan membagi pembayaran ke beberapa metode (Multi MOP). Kasus uang masuk tanpa penjualan perlu dilaporkan ke Tim Support Ruby POS.
2. Cara Kerja Pembayaran VA Duitku
Memahami alurnya membantu kasir tahu kapan harus menunggu dan kapan harus bertindak:
- Kasir memilih metode bayar VA Duitku di layar Checkout, lalu menekan Paid (F12).
- Ruby POS membuat nomor VA dan menampilkan nomor VA, total pembayaran, dan batas waktu bayar (Pay Before).
- Pelanggan transfer ke nomor VA tersebut.
- Ruby POS mengecek status pembayaran otomatis setiap 3 detik selama sekitar 3 menit. Selama pengecekan, tombol Check Status (F12) berwarna abu-abu.
- Begitu status PAID, transaksi tersimpan. Jika pelanggan baru membayar setelah 3 menit, kasir perlu menekan F12 agar status dicek ulang.

Gambar 1. Dialog pembayaran VA Duitku (data contoh): (1) batas waktu bayar, (2) nomor VA untuk pelanggan, (3) tombol Check Status (F12).
3. Masalah yang Terjadi
Cocokkan gejala di layar dengan tabel berikut, lalu ikuti bagian penanganannya di bagian 5.
Gejala | Kemungkinan penyebab | Penanganan |
Pelanggan sudah transfer, status di POS masih Pending atau tombol masih loading | Pengecekan otomatis sudah berhenti, atau konfirmasi dari Duitku terlambat | Bagian A |
Muncul pesan “Maximal amount is 100,000,000, please add other payment methods” | Nominal VA melebihi batas Duitku Rp100.000.000 per transaksi | Bagian B |
Muncul pesan “Virtual Account HAS EXPIRED” | Batas waktu bayar (Pay Before) sudah lewat | Bagian C |
Uang sudah diterima, tetapi penjualan tidak ada di POS | Dialog VA ditutup (Cancel / Esc) sebelum status PAID | Bagian D |
Semua pembayaran VA di toko tetap Pending walaupun pelanggan sudah bayar | Ruby POS versi lama atau gangguan koneksi antara Duitku dan server Ruby POS | Bagian E |
4. Penyebab
Uang pelanggan tidak masuk ke Ruby POS secara langsung. Duitku mengonfirmasi pembayaran ke server Ruby POS, lalu kasir melihat hasilnya lewat pengecekan status. Dari alur ini muncul beberapa titik rawan:
- Pengecekan otomatis hanya berjalan sekitar 3 menit. Jika pelanggan membayar setelahnya, status di layar tidak berubah sampai kasir menekan F12.
- Transaksi baru tersimpan setelah status PAID. Jika dialog VA ditutup sebelum itu, penjualan tidak tercatat walaupun uang tetap masuk ke rekening.
- Duitku membatasi VA maksimal Rp100.000.000 per transaksi. Sisanya harus dibayar dengan metode lain.
- Konfirmasi Duitku bisa tidak sampai. Kasus ini pernah terjadi karena pengaturan alamat server dan sudah diperbaiki tim Ruby POS. Toko perlu memakai Ruby POS versi terbaru.

5. Langkah Penanganan

Bagian A – Status masih Pending (dilakukan kasir)
1. Pastikan pelanggan transfer ke nomor VA yang tampil di layar
Nomor VA dibuat baru untuk setiap transaksi. Nomor VA dari transaksi sebelumnya tidak berlaku untuk transaksi ini.
2. Tekan F12 di keyboard
F12 tetap berfungsi walaupun tombol Check Status di layar terlihat abu-abu atau masih loading. Tunggu beberapa detik sampai hasil pengecekan muncul.
3. Jika muncul “Payment Status: PENDING”, tunggu sebentar lalu tekan F12 lagi
Konfirmasi dari bank ke Duitku kadang butuh beberapa menit. Ulangi F12 setiap 1–2 menit.
4. Jika status PAID, transaksi tersimpan otomatis
Lanjutkan transaksi seperti biasa.
5. Jika tetap Pending setelah beberapa kali dicek
Minta bukti transfer dari pelanggan (nomor VA, nominal, jam transfer), lalu hubungi Tim Support Ruby POS. Biarkan dialog VA tetap terbuka.
Jangan simpan transaksi sebagai Pending Order selama menunggu pembayaran VA. Pending Order hanya menyimpan daftar belanja, bukan VA yang sudah dibuat. Saat transaksi dibuka lagi dan di-checkout, Ruby POS membuat nomor VA baru, sehingga transfer ke VA sebelumnya tidak terhubung ke transaksi tersebut.
Bagian B – Nominal melebihi Rp100.000.000 (dilakukan kasir)
1. Aktifkan Multi MOPs di layar Checkout
Tekan F9 atau klik tombol Multi MOPs sampai berstatus ON.

Gambar 2. Checkout – tombol Multi MOPs (kotak kuning) dan daftar metode bayar yang dipilih (kotak merah).
2. Isi nominal VA Duitku maksimal Rp100.000.000
Dalam satu transaksi hanya bisa ada satu VA Duitku.
3. Bayar sisanya dengan metode lain
Misalnya tunai, kartu debit/kredit (EDC), atau metode lain yang tersedia di toko. Pastikan Total Payment sama dengan Grand Total.
4. Tekan Paid (F12) dan lanjutkan pembayaran VA seperti biasa
Ikuti Bagian A jika status VA belum langsung PAID.
Bagian C – VA sudah kedaluwarsa (dilakukan kasir)
1. Tutup pesan “Virtual Account HAS EXPIRED”
Tekan Choose Other Method (Esc).
2. Pastikan pelanggan belum transfer ke VA yang kedaluwarsa
Jika pelanggan ternyata sudah transfer, jangan buat VA baru. Ikuti Bagian D.
3. Buat pembayaran baru
Pilih ulang VA Duitku untuk mendapatkan nomor VA baru, atau gunakan metode bayar lain. Informasikan nomor VA yang baru ke pelanggan.
Bagian D – Uang masuk tetapi penjualan tidak tercatat (Head Kasir)
1. Jangan buat transaksi VA baru untuk pelanggan yang sama
Jangan juga meminta pelanggan membayar lagi. Cek dulu apakah pembayaran sebelumnya sudah masuk, supaya pelanggan tidak membayar dua kali.
2. Kumpulkan data pembayaran
- Nomor VA dan nominal yang dibayar.
- Jam transfer dan bukti transfer dari pelanggan.
- Nama toko, nomor kasir, dan nama kasir yang melayani.
3. Hubungi Tim Support Ruby POS
Tim Support memverifikasi status pembayaran di Duitku dan memastikan invoice memang belum tercatat, termasuk kemungkinan invoice sudah tersimpan di POS tetapi belum terkirim ke BOS (lihat KB-POS-04).
4. Input ulang hanya setelah verifikasi dan dengan persetujuan tertulis
Jangan input ulang transaksi sebelum Tim Support selesai memverifikasi. Jika pencatatan ulang memang diperlukan, metode bayar dan persetujuannya mengikuti arahan tertulis dari pihak yang berwenang di perusahaan sesuai SOP Finance, dengan mencantumkan referensi pembayaran dan nomor tiket Support.

Bagian E – Semua pembayaran VA tetap Pending (Tim IT)
1. Pastikan Ruby POS di semua kasir memakai versi terbaru
Tanyakan versi terbaru ke Tim Support Ruby POS jika belum yakin.
2. Pastikan PC kasir terhubung ke internet
Jika koneksi terputus, dialog VA menampilkan pesan “No internet connection detected”.
3. Hubungi Tim Support Ruby POS
Sertakan nama toko, nomor kasir, nomor VA, nominal, dan jam transaksi.
6. Pencegahan
- Tunggu sampai PAID. Kasir tidak menutup dialog VA sebelum status PAID.
- Gunakan F12. Jika pelanggan membayar agak lama, tekan F12 untuk cek ulang, jangan membuat VA baru.
- Jangan pakai Pending Order untuk transaksi yang sedang menunggu pembayaran VA.
- Transaksi besar: untuk total di atas Rp100.000.000, langsung gunakan Multi MOP.
- Nomor VA terbaru. Pastikan pelanggan selalu transfer ke nomor VA yang sedang tampil di layar.
- Versi terbaru. Selalu gunakan Ruby POS versi terbaru di semua kasir.

A. Referensi tiket Freshdesk
Tiket | Tanggal | Customer / store | Ringkasan dan hasil | Status |
164102 | 11 Jun 2026 | Topgolf | VA BCA sudah dibayar, status di POS tetap Pending. Penyebab: callback Duitku butuh URL server tanpa custom port (dikerjakan DevOps di 164175/164176). Setelah itu POS di-update ke versi terbaru. | Closed |
164175, 164176 | 17 Jun 2026 | Internal (DevOps) | Duitku memerlukan URL server tanpa custom port. Tiket koordinasi DevOps, turunan 164102. | Closed |
164645 | 8 Jul 2026 | Topgolf (BPP) | Masalah VA muncul lagi. Solusi: update Ruby POS ke versi terbaru; dites di store BPP. | Closed |
165162 | 3 Agu 2026 | Topgolf (TRB) | Transaksi VA tidak bisa diproses: nominal melebihi limit maksimal Duitku. | Closed |
165209 | 5 Agu 2026 | Topgolf | Pesan “Maximal amount is 100,000,000…”. Validasi limit di POS dinonaktifkan; sekarang error mengikuti respons Duitku. | Closed |
165355 | 13 Agu 2026 | Topgolf (TRB POS 2) | Uang customer sudah masuk, penjualan belum ada di POS, tombol masih loading. Workaround: tekan F12. | Closed |
165213 | 5 Agu 2026 | Topgolf (MKS) | Pembayaran Rp6.985.000 sudah berhasil, tetapi status masih Pending dan waktu pengecekan sudah habis. Diselesaikan via WAG, detail tidak tercatat. | Closed |
165015 | 25 Jul 2026 | Topgolf (RYA) | Muncul notifikasi error saat memakai Duitku. Penyebab: web server otomatis mengambil versi aplikasi terbaru yang belum dipublish; konfigurasi server disesuaikan. Tidak perlu update POS. | Closed |
B. Analisis teknis
- Konfigurasi per toko diambil dari Store Master yang tersinkron ke POS: duitkuUrl, duitkuMerchantCode, duitkuApiKey, duitkuExpiryPeriod (duitku_service.dart:24-38). Jika kosong: “Duitku parameters must be available.”
- Buat VA: POST {duitkuUrl}/createTransactionRequest dengan docnum (UUID baru setiap percobaan),
merchantOrderId (yyyyMMddHHmmss + 10 karakter acak, checkout_dialog.dart:407), dan callbackUrl =
{duitkuUrl}/callback. Nominal VA = nominal di MOP Duitku, jadi split pembayaran didukung, tetapi hanya satu MOP Duitku per transaksi (duitkuMop.first).
- Cek status: GET {duitkuUrl}/invoice/{docnum} → data.status PAID / EXPIRED / lainnya. Polling otomatis 60 × 3 detik (duitku_dialog.dart:65-108). Handler tombol F12 tidak mengecek isCheckingStatus, jadi F12 tetap jalan saat tombol di layar disabled.
- docnum dan merchantOrderId tidak disimpan di database lokal, hanya di memori dan log. Jika dialog ditutup, POS tidak punya jejak VA tersebut. Pelacakan harus lewat nomor VA, nominal, dan jam di dashboard Duitku.
- Pending Order tidak melanjutkan VA (konfirmasi tim, 23 Okt 2026). Pending Order menyimpan antrean belanja lalu mereset receipt aktif; saat dipanggil kembali, item dan beberapa data transaksi dibangun ulang, bukan melanjutkan sesi pembayaran VA. docnumDuitku dibuat saat checkout dan diberikan ke dialog pembayaran; checkout VA berikutnya membuat UUID baru. Karena itu Pending Order tidak boleh dijadikan prosedur penanganan VA Pending.
- Risiko setelah PAID: charge() dibungkus try/catch yang hanya mencatat log (checkout_dialog.dart:250-256), lalu dialog tetap ditutup dan layar sukses tampil. Jika penyimpanan gagal, uang masuk tetapi invoice tidak tersimpan tanpa peringatan ke kasir.
- Masa berlaku: “Pay Before” di layar dihitung dari duitkuExpiryPeriod ?? 60 menit, sedangkan ke Duitku dikirim duitkuExpiryPeriod apa adanya. Jika nilainya kosong di Store Master, tampilan POS dan masa berlaku di Duitku bisa berbeda.
C. Checklist investigasi (Tim Support)
Kasus 1 – Uang masuk, penjualan tidak ada
Tujuan: memastikan pembayaran sudah diterima Duitku dan apakah invoice sebenarnya sudah tersimpan.
- Minta nomor VA, nominal, jam transfer, bukti transfer, nama toko, dan nomor kasir.
- Cari transaksi di dashboard Duitku (merchant code toko) berdasarkan nomor VA, nominal, dan jam. Catat merchantOrderId, reference, dan status.
- Cek di BOS Retail apakah invoice dengan nominal dan jam tersebut sudah ada (charge() mungkin sebenarnya berhasil).
- Cek juga di PC kasir apakah invoice tersimpan tetapi belum terkirim ke BOS (angka Invoices x/y, query synctobos di KB-POS-04).
- Jika invoice memang belum tercatat, pencatatan ulang mengikuti arahan tertulis pihak berwenang customer sesuai SOP Finance. Support tidak menetapkan MOP pengganti. Catat nomor tiket dan referensi Duitku di tiket.
Kasus 2 – Semua VA tetap Pending
Tujuan: memastikan konfigurasi toko dan callback Duitku berjalan.
- Cek konfigurasi Duitku di Store Master BOS untuk toko tersebut.
- Pastikan callback URL Duitku bisa diakses dari luar tanpa custom port (lihat 164175/164176).
- Tes endpoint status dengan docnum transaksi uji:

D. Rekomendasi perbaikan (Tim Developer)
- Simpan docnum, merchantOrderId, nomor VA, nominal, dan status ke tabel lokal, agar VA bisa dilacak dan dilanjutkan setelah dialog tertutup atau aplikasi restart.
- Tangani kegagalan charge() setelah PAID: jangan tampilkan layar sukses, beri retry, dan catat ke Error Logs.
- Minta konfirmasi sebelum dialog VA ditutup selama VA masih aktif.
- Cegah pengecekan ganda saat F12 ditekan ketika polling berjalan.
- Samakan masa berlaku VA yang ditampilkan dengan yang dikirim ke Duitku.