Three steps, then it runs on its own
Create a plan
Set the amount, the method (VA or QRIS), and the interval (daily,
weekly, or monthly). One POST /v1/billing/plans is all it takes.
Subscribe your customer
Enroll a customer in the plan. The first invoice is issued right away with a payment link ready to share, without you creating it by hand.
doit.id does the billing
Every period, a new invoice is issued automatically. The
invoice.created webhook arrives at your server, and the billing
email can go straight to your customer.
Two API calls, and you are done
// 1. create a monthly plan, send invoices by email $ curl -X POST https://pay.doit.id/v1/billing/plans \ -H "Authorization: Bearer pb_live_xxx" \ -d '{"name": "Internet 20 Mbps", "amount": 200000, "interval": {"unit": "month", "count": 1}, "kirim_email": true}' // 2. subscribe a customer → the first invoice is issued immediately $ curl -X POST https://pay.doit.id/v1/billing/subscriptions \ -H "Authorization: Bearer pb_live_xxx" \ -d '{"plan_id": "plan_x8Kj2…", "customer_name": "Budi", "customer_email": "budi@contoh.id", "reference": "CUST-001"}' { "id": "sub_9aQ…", "next_invoice_at": "2026-09-27T…", "first_invoice": { "reference": "CUST-001/20260827", "hosted_url": "https://pay.doit.id/p/pay_…" } }
Designed so no invoice ever slips through
Billing emails, no integration needed
Turn on kirim_email in the plan, and every time an invoice
is issued doit.id emails the payment link straight to your customer.
No mail server, no templates.
Or send it yourself over WhatsApp
Turn email off, take the hosted_url from the
invoice.created webhook, and share it from your own
business WhatsApp number. The channel is yours, the issuing is on us.
No stored cards, no auto-debit
Customers pay through the link on each invoice, so you avoid the complexity of recurring-debit consent. No card data is stored anywhere.
A schedule you control
Pause when a customer takes a break, resume when they are back, cancel when they leave. Resume picks up from the next period, without dumping invoices for the periods in between.
To your systems, every invoice is
just a regular payment: the payment.paid webhook still arrives
when it is settled, reporting lives in the same dashboard, and settlement
follows the same T+1 flow. Read more in the
recurring billing documentation.