← Back to case studies
Case study — full-stack app Delivered

Hand-built quotes became a guided, on-brand builder.

A promotional-merchandise distributor's salespeople assembled every quote by hand in Word and Excel — no shared catalog, inconsistent pricing, and PDFs that drifted off-brand. I built a web app that turns that into a guided flow: search the catalog, compare priced scenarios, export a branded PDF in minutes.

  • Catalog to branded PDF in minutes.

  • 3 margin levels applied the same way every time.

  • 1 shared catalog normalised across suppliers.

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

Open live demo

Live demo — anonymized sample catalog, the same guided flow and margin engine as the delivered app. Runs entirely in your browser.

Book a free 30-min call