
Brief
A multi-tenant billing platform that turns SME invoice workflows into a real-time system. Vendors send invoices, customers pay through Midtrans, and the dashboard updates the second the webhook lands.
Challenge
Indonesian SME owners juggle manual invoicing in spreadsheets and chase payments over WhatsApp. The gap between "sent" and "paid" is opaque — no live status, no automated reminders, no clean ledger reconciliation when settlement timing drifts.
Solution
Built a NestJS + Prisma backend with signature-verified Midtrans webhooks, idempotent settlement writes, and a Redis Pub/Sub layer that streams payment events to the Next.js dashboard. Redis counters back the revenue widgets so they render with sub-100ms latency at scale.
What I built
- 01Real-time revenue dashboard powered by Redis counters + Pub/Sub
- 02Idempotent webhook ingestion with signature verification
- 03Automated invoice reminder queues
- 04Per-merchant Midtrans credential isolation
- 05TypeScript end-to-end with shared Zod schemas
Stack
- Next.js
- NestJS
- Prisma
- Supabase
- Redis
- Midtrans
- TypeScript
Results
- <100msDashboard update latency from webhook
- 100%Webhook signature coverage
- Multi-tenantPer-merchant payment credentials