The three most-used ways to pay, done properly
Virtual Account, QRIS, and bank transfer straight to your own account: the payment methods people use the most and dispute the least. Bank transfer can even be used while verification is still in progress.
Virtual Account
A unique account number for every invoice, in your customer's name. Available at 8 banks: BRI, BNI, CIMB Niaga, Permata, Danamon, Maybank, Mandiri, and BSI. Customers pay from any ATM, mobile banking, or internet banking service.
From Rp3.000 per transaction. See pricing per bank →
QRIS
One QR code for every digital wallet and mobile banking app connected to QRIS. Code expired? The payment page generates a fresh one, and the invoice stays alive.
MDR as regulated by Bank Indonesia, with no markup from us: since 1 October 2026 transactions up to Rp100.000 carry no MDR (0%), and 0,7% above that. See pricing details →
A ready-made payment page, or build your own
Every invoice automatically comes with a hosted_url:
a payment page we maintain, ready to share through any channel.
Prefer to present it inside your own app? Take the qr_content
or the VA number straight from the API response.
Create from the dashboard, no code needed
The + Create invoice button in the portal: enter the amount and the customer's name, and the payment link is ready, complete with a billing message template you can send straight to WhatsApp. Your admin staff will never need a developer.
One link for everything
Send it through WhatsApp, email, or SMS. Customers choose VA or QRIS on the page, with no extra app to install. Want it on your own site? Embed it as a modal with a single script tag.
Invoices that refuse to die quietly
An expired QR is not the end of the story: the payment page regenerates a new code as long as the invoice is still valid. Customers simply try again.
A webhook the moment it is paid
The payment.paid event arrives at your server with a
complete payload: enough to mark the invoice as paid and switch the
service on without an extra API call.
Settlement that is locked down and auditable
A locked destination account
Settlements are only ever sent to the business bank account verified during onboarding. The destination account cannot be changed without re-verification, so your account is safe from takeover.
Every rupiah leaves a trail
There is no balance to withdraw manually. Every settlement goes out on schedule, is announced by email with its full breakdown, and its entire history can be audited in the dashboard. The CSV export already includes the tax base (DPP) and VAT (PPN).
Move from another gateway with zero downtime
Already on Duitku or Xendit? Switch on compatibility mode, swap the base URL and key, and your existing code keeps running as it is. Migrate step by step while your old system keeps serving.
Processed by a BI-licensed provider
Transaction processing is handled by a payment service provider licensed by Bank Indonesia. doit.id orchestrates the cycle: the API, the payment page, reporting, and fully recorded settlements.
Several companies, one dashboard
Own more than one company? Add each as a business entity under the same account: every entity passes its own KYC and gets its own payout account, while the integration, API keys, and team stay one. Each app simply picks the entity it pays out to.
Payouts on your rhythm
Automatic in T+1 business days, or hold funds and pay out yourself from the portal whenever you like: one transfer, one payout fee. Any pending balance is still paid out automatically by the start of the following month.