Ledger Flow
2025
Full-stack engineer
Web · Client project
The client managed invoicing, payment status, and internal activity across a spreadsheet and email threads. Nothing was structured, nothing linked, and there was no single source of truth for who owed what.
Designed the data model, built the Next.js client and the Express API, and structured the storage layer across two databases.
architecture
Next.js frontend talking to a dedicated Express API, kept separate from the client so the same backend can later serve other integrations.
frontend
Server-rendered views for invoice lists and client detail pages, with client-side state for the editable billing forms.
backend
REST API in Express handling invoice creation, status transitions, and activity logging as two distinct concerns.
cloud
PostgreSQL via Prisma for billing records that need relational integrity; MongoDB for high-volume activity logs that don't. Both run in Docker for local parity with production.
Billing records and activity logs have different consistency needs — invoices need transactional guarantees, logs don't. Splitting them across PostgreSQL and MongoDB meant the API had to own two different write paths without leaking that complexity into the frontend, which just sees one invoice object.
The client replaced a spreadsheet-and-email workflow with a system that tracks every invoice's status automatically, and a single dashboard for what's paid, pending, and overdue.