Case study

Building an automated invoicing MVP in 6 weeks

How a small services firm replaced four hours of weekly manual invoicing with a custom React + Postgres app โ€” shipped solo, in production, in under two months.

Automated invoice generator dashboard โ€” case study cover
Client
Confidential (services firm, EU)
Industry
Professional services
Timeline
6 weeks, solo
Stack
React, TypeScript, Postgres
โˆ’4 hrs/wk
Manual invoicing eliminated
6 wks
Discovery to production
100%
Tax-compliant numbering

The problem

The client was a 12-person services firm running monthly invoicing out of spreadsheets and a Word template. Every month, an ops manager spent four hours copy-pasting client details, calculating VAT line-by-line, exporting to PDF, and emailing files one at a time. Sequential invoice numbering โ€” a hard requirement for EU tax compliance โ€” was tracked by hand and broke regularly. They'd looked at off-the-shelf invoicing SaaS but every option either didn't handle their custom tax rules or required moving their entire client database into a vendor.

The scope

We agreed a fixed scope in week one: a single-tenant web app the ops team would log into, with three core flows. 1. Manage clients, line-item catalogues and tax rules in one schema. 2. Generate branded PDF invoices from a template, with strict sequential numbering enforced at the database layer. 3. Handle recurring monthly billing on a schedule, with CSV exports for the accountant. Explicitly out of scope: payments collection, customer-facing portal, multi-currency. Cutting those let us ship the actual problem in six weeks instead of six months.

How it was built

React + TypeScript frontend with TanStack Router and shadcn/ui for the admin surface โ€” fast to build, opinionated, no design committee needed. Postgres for the data, with the invoice-number sequence enforced as a database constraint so it physically can't be skipped or duplicated. PDF generation runs server-side from an HTML template, giving the ops team a way to tweak the layout in CSS instead of waiting for a developer. Recurring billing runs on a cron edge function that idempotently generates the month's invoices on the first of every month. Weekly Loom demos kept the client in the loop โ€” they caught two scope ambiguities in week three that would have been painful to fix in week six.

The outcome

Live in production at the end of week six. The ops manager's monthly invoicing dropped from four hours to about fifteen minutes โ€” most of that is now just reviewing what the app generated. The accountant got a clean CSV export that drops straight into their bookkeeping software. The client owns the codebase and the database. They're on a light retainer for occasional changes (new tax rules, new branding), but they could fire me tomorrow and the product would keep running.

What I'd do differently

We over-engineered the client management UI in week two โ€” a fancy combobox with search and recent-clients that the ops team never used because they invoice the same 30 customers every month. A plain dropdown would've shipped two days earlier and worked just as well. Lesson: in a six-week MVP, the cost of a polished UI element you don't need is bigger than it looks.