Ringkasan Utama
Pilih Midtrans kalau kamu fokus menerima pembayaran dan mau drop-in Snap 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, GoPay dan e-wallet lain, 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.
Cakupan metode pembayaran
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. Bahkan GoPay, channel yang paling sering dikira berbeda, tersedia secara langsung di keduanya.
- Virtual Account — keduanya mendukung VA closed dan open di bank-bank besar; ini masih metode paling banyak dipakai untuk checkout di Indonesia.
- QRIS — sama persis di keduanya, karena QRIS adalah standar Bank Indonesia; satu QR menerima OVO, DANA, GoPay, ShopeePay, LinkAja, dan semua aplikasi bank.
- E-wallet — keduanya menyediakan OVO, DANA, dan ShopeePay sebagai channel redirect atau deeplink langsung selain lewat scan QRIS.
- GoPay — Midtrans bagian dari grup GoTo dan menyediakan hand-off native ke aplikasi GoPay; Xendit juga mencantumkan GoPay sebagai channel e-wallet langsung, GOPAY untuk pembayaran sekali bayar dan GOPAY_RECURRING untuk pembayaran berulang, yang memerlukan proses aktivasi tambahan dengan partner.
- Kartu dan PayLater — keduanya mendukung Visa/Mastercard/JCB plus BNPL seperti Kredivo dan Akulaku.
Perbandingan struktur biaya
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. MDR QRIS, misalnya, ditetapkan Bank Indonesia: mulai 1 Oktober 2026 tarifnya 0% sampai IDR 100.000 dan 0,7% di atasnya untuk merchant reguler, sama di keduanya, meski Xendit menambahkan biaya pemrosesan tetap IDR 4.000 di setiap transaksi, termasuk QRIS, dan halaman pricing Midtrans masih menampilkan 0,7% rata saat saya cek pada 12 Oktober 2026. Tabel di bawah adalah snapshot yang saya pakai; nuansa pentingnya adalah PPN: 12% sejak 1 Januari 2025, dikenakan atas DPP Nilai Lain sebesar 11/12 dari biaya berdasarkan PMK 131/2024, sehingga efektif 11%. Midtrans menambahkannya di atas setiap biaya kecuali QRIS, GoPay, dan ShopeePay yang sudah termasuk PPN, sedangkan Xendit mencantumkan biayanya belum termasuk pajak, yang dipotong saat settlement, kecuali tarif QRIS yang ditandainya sudah termasuk PPN.
| Metode pembayaran | Midtrans | Xendit |
|---|---|---|
| Virtual Account | ~ IDR 4.000 flat per transaksi | IDR 9.000 per transaksi, ditambah biaya pemrosesan Xendit IDR 4.000 (harga publik, Oktober 2026) |
| QRIS | MDR BI: 0% sampai IDR 100.000, 0,7% di atasnya | MDR BI: 0% sampai IDR 100.000, 0,7% di atasnya, ditambah biaya pemrosesan IDR 4.000 |
| E-wallet (OVO/DANA) | ~ 1,5% per transaksi | ~ 3% ke atas, tergantung tipe merchant |
| GoPay / ShopeePay | ~ 2% (hand-off GoPay native) | Channel GoPay dan ShopeePay langsung dengan tarif e-wallet Xendit (lihat halaman pricing) |
| Kartu (Visa/Mastercard) | 2,9% + IDR 2.000 | 2,9% + IDR 2.000, ditambah biaya pemrosesan IDR 4.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.
Developer experience dan dokumentasi
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": "buyer@example.com",
"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.
Payout dan disbursement
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
}'Mana yang dipilih: startup vs enterprise
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.
- Startup tahap awal yang ingin cepat go-live di CMS atau framework dengan plugin yang sudah ada — Midtrans, demi kecepatan go-live lewat drop-in Snap dan plugin siap pakainya.
- Produk custom di backend modern yang mementingkan kualitas API — Xendit, demi API dan dokumentasi lebih bersih yang akan dirawat timmu bertahun-tahun.
- Marketplace, fintech, atau model apa pun yang mengirim uang keluar — Xendit, karena menerima plus disbursement dalam satu provider adalah kemenangan operasional besar.
- Ambisi regional di luar Indonesia — Xendit juga beroperasi di Filipina dan Asia Tenggara yang lebih luas, jadi satu integrasi bisa dipakai lintas negara.
- Enterprise yang butuh support khusus, rate custom, dan uptime teruji — negosiasikan keduanya; pemenangnya adalah yang memberi tim finance-mu rate card dan SLA terbaik.
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.

