Xendit vs Midtrans: Payment Gateway Mana yang Dipilih di Indonesia

Foto oleh Wainuio via Wikimedia Commons (CC BY-SA 4.0)
Untuk sebagian besar metode inti keduanya berdekatan, dan QRIS sama persis di 0,7% karena diatur Bank Indonesia. Virtual Account sekitar IDR 4.000 flat di keduanya, dan kartu berada di kisaran 2,9% + IDR 2.000. Perbedaan biaya sebenarnya muncul di tarif e-wallet hasil negosiasi dan biaya disbursement, jadi bandingkan rate card yang sudah kamu tandatangani, bukan angka utama.
Ya, tetapi tanpa hand-off native ke aplikasi. Pengguna GoPay di Xendit membayar lewat QRIS universal dengan memindai kode. Midtrans, karena bagian dari grup GoTo, menawarkan redirect GoPay native yang terasa lebih mulus di dalam aplikasi GoPay.
Midtrans pernah menawarkan payout lewat produk terpisah (Iris), tetapi disbursement bukan fokus utamanya. Kalau membayar seller, driver, atau freelancer adalah inti produkmu, API disbursement Xendit — yang menjangkau 450+ bank dan e-wallet — adalah pilihan yang lebih kuat dan matang.
Xendit banyak disukai karena API REST yang bersih dan konsisten serta dokumentasi ramah engineer dengan SDK resmi. Midtrans lebih cepat go-live kalau kamu memakai drop-in Snap atau plugin CMS/Laravel yang sudah ada, tetapi permukaan API-nya lebih tua dan terpisah antara Core API, Snap, dan Iris.
Kalau hanya menerima pembayaran dan ingin cepat rilis di CMS atau framework dengan plugin siap pakai, Midtrans biasanya lebih cepat. Kalau membangun custom, mementingkan kualitas API, atau perlu mengirim uang keluar, pilih Xendit. Banyak tim memulai dengan Midtrans lalu bermigrasi ke Xendit begitu disbursement atau ekspansi regional menjadi kebutuhan.

Foto oleh Wainuio via Wikimedia Commons (CC BY-SA 4.0)
Ringkasan Utama
Pilih Midtrans kalau kamu fokus menerima pembayaran dan mau integrasi GoPay native plus plugin CMS siap pakai; pilih Xendit kalau membangun custom di atas API yang bersih atau butuh disbursement programatik untuk bayar seller, driver, atau refund. Keduanya mendukung Virtual Account, QRIS, e-wallet, kartu, dan gerai retail dengan biaya yang mirip.
Setiap aplikasi Indonesia yang saya kerjakan akhirnya sampai di persimpangan yang sama: Xendit atau Midtrans. Keduanya adalah payment gateway yang benar-benar relevan di sini, dan di atas kertas terlihat hampir identik — sama-sama mendukung Virtual Account, QRIS, e-wallet, kartu, dan gerai retail. Perbedaan sebenarnya baru terlihat saat kamu sudah dalam-dalam di kode, membaca webhook jam 2 pagi dan merekonsiliasi settlement. Tulisan ini adalah perbandingan yang saya harap sudah saya punya sebelum mengintegrasikan salah satunya di sebuah proyek untuk klien Indonesia.
Saya akan tetap fokus pada hal yang dipedulikan seorang backend engineer: metode pembayaran apa yang didukung masing-masing, bagaimana struktur biayanya sebenarnya, seperti apa developer experience dan dokumentasinya, apakah kamu bisa mengirim uang keluar (disbursement), dan akhirnya aturan konkret untuk memilih antara keduanya untuk startup versus enterprise. Biaya sering berubah, jadi anggap angka pasti di sini sebagai snapshot dari halaman pricing resmi yang ditautkan di akhir, dan selalu cek ulang sebelum tanda tangan kontrak.
Untuk metode pembayaran inti di Indonesia, cakupannya nyaris seri. Kedua gateway menyediakan Virtual Account bank BCA, BNI, BRI, Mandiri, Permata, dan CIMB, QRIS universal yang bisa dipindai aplikasi e-money apa pun, channel e-wallet langsung, kartu domestik dan internasional, serta pembayaran retail di Alfamart dan Indomaret. Satu channel yang benar-benar berbeda adalah GoPay.
Kedua gateway mengenakan biaya setup nol dan biaya bulanan nol — kamu hanya bayar per transaksi sukses. Tarif utamanya berdekatan karena banyak pricing di Indonesia yang diatur regulator atau ditentukan oleh channel di baliknya. QRIS, misalnya, dibatasi Bank Indonesia di 0,7% untuk merchant reguler, jadi sama di mana pun. Tabel di bawah adalah snapshot yang saya pakai; nuansa pentingnya adalah PPN (saat ini 11%), yang ditambahkan di atas sebagian besar biaya kecuali QRIS, GoPay, dan ShopeePay yang sudah termasuk PPN.
| Metode pembayaran | Midtrans | Xendit |
|---|---|---|
| Virtual Account | ~ IDR 4.000 flat per transaksi | Biaya flat per transaksi (lihat halaman pricing) |
| QRIS | 0,7% (diatur BI) | 0,7% (diatur BI) |
| E-wallet (OVO/DANA) | ~ 1,5% per transaksi | ~ 3% ke atas, tergantung tipe merchant |
| GoPay / ShopeePay | ~ 2% (hand-off GoPay native) | Lewat QRIS 0,7% atau tarif e-wallet langsung |
| Kartu (Visa/Mastercard) | 2,9% + IDR 2.000 | 2,9% + IDR 2.000 |
| Disbursement / payout | Terbatas / bukan produk inti | Payout ke 450+ bank dan e-wallet, biaya per payout |
Jangan sampaikan tarif ini ke klien sebagai final. Biaya e-wallet khususnya dinegosiasikan per kategori merchant dan berubah sesuai volume, dan PPN ditambahkan di atas sebagian besar tarif. Selalu ambil angkamu sendiri dari halaman pricing terbaru dan, untuk deal nyata, dari rate card yang sudah ditandatangani.
Di sinilah Xendit membangun reputasinya. API-nya bersih, REST-first, dan konsisten — kamu membuat invoice atau objek payment-channel tertentu, mendapat balasan JSON yang rapi, dan payload webhook-nya mudah ditebak. Dokumentasinya terasa ditulis oleh engineer, lengkap dengan contoh copy-paste dan SDK resmi untuk Node, PHP, Python, Java, dan Go. Kalau kamu membangun checkout custom dari nol, Xendit jelas tempat yang lebih nyaman untuk bekerja.
Midtrans juga tidak buruk — drop-in Snap-nya benar-benar cepat untuk go-live, dan punya kumpulan plugin CMS serta framework siap pakai paling lengkap (WooCommerce, package Laravel, dan lainnya). Konsekuensinya, permukaan API-nya terasa lebih tua dan lebih terpecah antara produk Core API, Snap, dan Iris, dan verifikasi signature webhook sering menjebak pemula. Berikut contoh minimal request token Snap untuk menunjukkan bentuknya:
// Midtrans Snap: create a transaction token (Node.js)
const midtransClient = require('midtrans-client');
const snap = new midtransClient.Snap({
isProduction: false,
serverKey: process.env.MIDTRANS_SERVER_KEY,
});
const token = await snap.createTransaction({
transaction_details: {
order_id: 'ORDER-101',
gross_amount: 150000, // IDR
},
credit_card: { secure: true },
});
// token.redirect_url -> open Snap checkout# Xendit: create an invoice (any channel) via REST
curl https://api.xendit.co/v2/invoices \
-u xnd_production_XXXX: \
-H 'Content-Type: application/json' \
-d '{
"external_id": "order-101",
"amount": 150000,
"payer_email": "[email protected]",
"description": "Order 101"
}'
# Returns invoice_url + all enabled payment channelsApa pun yang kamu pilih, selalu verifikasi signature webhook di sisi server dan jadikan webhook — bukan redirect browser — sebagai sumber kebenaran status order yang lunas. Pengguna menutup tab; webhook adalah cara kamu benar-benar tahu sebuah Virtual Account sudah dibayar.
Ini perbedaan arsitektur terbesar. Kalau produkmu perlu mengirim uang keluar — membayar seller di marketplace, menyelesaikan pembayaran driver, membayar freelancer, atau memproses refund massal — Xendit memperlakukan disbursement sebagai produk kelas satu dengan API yang bisa payout ke 450+ bank dan e-wallet, termasuk payout tunggal dan batch. Midtrans secara historis menawarkan payout lewat produk terpisah (Iris), tetapi disbursement bukan pusat gravitasinya seperti pada Xendit. Di sebuah proyek marketplace, saya memilih Xendit justru karena menerima dan mengirim uang lewat satu provider membuat rekonsiliasi tetap waras.
# Xendit: disburse money to a bank account
curl https://api.xendit.co/disbursements \
-u xnd_production_XXXX: \
-H 'Content-Type: application/json' \
-d '{
"external_id": "payout-seller-88",
"bank_code": "BCA",
"account_holder_name": "BUDI SANTOSO",
"account_number": "1234567890",
"amount": 500000
}'Tidak ada gateway yang secara universal lebih baik — yang ada hanyalah yang paling cocok dengan apa yang kamu bangun dan seberapa cepat kamu perlu bergerak. Berikut aturan keputusan yang benar-benar saya pakai.
Default saya: kalau hanya menerima pembayaran, saya pakai Midtrans lebih dulu demi kecepatan. Begitu produk perlu mengirim uang ke siapa pun, saya beralih ke Xendit tanpa ragu — satu provider untuk uang masuk dan uang keluar lebih berharga daripada selisih biaya kecil.