
A multi-tenant billing platform for Indonesian SMEs. Each merchant connects their own Midtrans account, sends invoices, and gets paid — with payment status driven by signature-verified webhooks and a clean ledger behind it.
Indonesian SME owners juggle manual invoicing in spreadsheets and chase payments over WhatsApp. The gap between "sent" and "paid" is opaque — no reliable status, no automated reminders, no clean reconciliation when settlement timing drifts. And a multi-tenant billing tool can't keep every merchant's payment credentials sitting in plaintext.
Built a NestJS + Prisma backend where each merchant connects their own Midtrans account, with server keys encrypted at rest using AES-256-GCM. Payment webhooks are verified against the owning merchant's key and processed idempotently, so duplicate notifications never double-settle. Recurring/installment billing schedules and Resend-based transactional email round out the flow.
- 01Multi-tenant — each merchant connects their own Midtrans account
- 02Per-merchant server keys encrypted at rest with AES-256-GCM
- 03Signature-verified, idempotent payment webhooks
- 04Recurring / installment / deposit-balance billing schedules
- 05Transactional email via Resend with delivery, open & click tracking
- Next.js
- NestJS
- Prisma
- PostgreSQL
- Supabase
- Midtrans
- TypeScript
- Multi-tenantPer-merchant Midtrans credentials
- AES-256-GCMServer keys encrypted at rest
- IdempotentSignature-verified payment webhooks