The problem
Each salesperson built offers their own way — in Word, in Excel, in email — pulling products from whichever supplier document they had to hand. There was no single catalog, so the same product showed up priced and described differently every time.
Margins were calculated by hand and easy to get wrong, and the finished documents rarely matched the company's branding. Putting together a single quote was slow, error-prone, and impossible to keep consistent across the team.
What I built
A web app (Next.js, App Router, TypeScript) with a searchable product catalog fed by adapters over several supplier APIs, normalised into one shared shape. On top of it sits a guided offer builder: brief, product selection, then two or three priced scenarios the client can compare side by side.
Pricing runs through a cascading margin engine that applies at three levels — offer, scenario and line — as a percentage or a fixed amount, with internal cost kept out of the client-facing view. The finished offer renders to a branded PDF through headless Chromium, so every quote leaves looking the same. The margin engine and supplier mappers are covered by unit tests, and the whole thing ships as a Docker image.
Stack
Next.js · TypeScript · React · Prisma · PostgreSQL · Tailwind · shadcn/ui · Playwright · Vitest · Docker
Live demo — anonymized sample catalog, the same guided flow and margin engine as the delivered app. Runs entirely in your browser.