The problem
The travel business ran its finances by hand — transactions, vendor bills, client invoices, and accounts receivable/payable all tracked across spreadsheets and disconnected steps. It was slow and error-prone, and there was no single record that operations and finance could both trust. The brief was to turn that into one integrated system.
How it's built
A single Prisma/Postgres schema covers transactions, bills, invoices, AR/AP, vendors, clients, journal entries, and petty cash — so every screen reads from the same source of truth, with Redis caching the hot paths.
Zod schemas in a shared @agt/contract package define the API contracts once and are reused by both the NestJS backend and the React frontend, so the two can't drift out of sync.
The backend follows DDD with a CQRS split — separate command and query paths over aggregates and repositories — plus role-based access (master, admin, sales, finance) on JWT auth.
The financial flow
Transactions (hotels, tickets, accommodation) are grouped into bills, turned into AR/AP records and client invoices, and tracked through to payment — with profit calculated and kept consistent as prices and amounts change.
Where it stands
Roughly fourteen months of active development across 200+ merged pull requests, shipping continuously through a CI/CD pipeline — backend to Fly.io, frontend to Vercel, with a fully containerized dev environment. It's still in active development rather than a launched product with measured outcomes; recent work has focused on getting the financial calculations exactly right.