Model-to-Purchase Order
Educational furniture & fit-out · Dubai · 788 SKUs
Took a furniture maker's quotes from Excel and retyping to one system: a live catalogue, a versioned room-by-room quote, a Revit button that prices a model, and purchase orders raised on client approval.

Context
The craft was excellent and the paperwork was not. Each quote was an Excel file; each approved quote was retyped into the CRM as a deal and into accounts as purchase orders; the furniture in the designer's Revit model and the lines on the estimator's sheet were two different lists that someone reconciled by eye.
- No single catalogue: the in-house range, third-party items and configured products each lived in different sheets
- Quotes were versioned by filename, so two people could edit the same one and neither would know
- Client approval happened in email, and procurement re-read the approved sheet to raise POs
- The Revit model — the most accurate list of what a room contains — never fed the quote
Outcome
788catalogue items priced in three currencies
- Hours of quotation assembly became minutes from the model
- Procurement works from the approved version, not a re-read sheet
- PLACEHOLDER — add a measured figure here (e.g. quotes issued per month, or estimator hours per quote before vs after)
What we built
The catalogue first: every in-house and third-party item with SKU generation, pricing in AED, SAR and USD, finishes, price tiers and duplicate detection, plus an approval queue so a new item is checked before it can be quoted. Two configurators replaced two spreadsheets — a conic-table builder with 624 valid combinations driven by the client's own rules, and an acoustics calculator for baffles, panels and pin-up boards.
The quote: floors and rooms, a room planner, one-off items, bulk edit, and a colour gate — every line needs a colour before sign-off. Version history is append-only; a save on a stale version is rejected with a conflict prompt and a diff in AED, and you can see who else is in the quote. Print to PDF, share by public link, and an 'approved by client' stage that locks the version.
The plugin: a button inside Revit that signs in, picks the deal, reads the furniture families in the model and writes a room-by-room quote, reporting any SKU it could not match. It refuses to overwrite a quote that is locked, approved or already has purchase orders.
The loop closed: deals sync from the CRM every one to two minutes with a full nightly pass; client approval creates a procurement queue grouped by vendor, and each group becomes a draft purchase order in accounts. Sync health is on a settings page, and ~1,000 automated tests keep the money paths honest.
What stuck
- One catalogue, so a price is set once and quoted everywhere
- A quote has a history nobody can rewrite, and a lock nobody can bypass
- The model prices the room, and approval raises the orders — the two retyping steps are gone
Snapshot
- Client profile
- Educational furniture and fit-out manufacturer with in-house range and factory, Dubai and Riyadh
- Engagement
- Constant — in production and evolving weekly
- Timeline
- May 2026 to now; 310 commits, 52 migrations
- Scale
- 788 catalogue items (707 with variants), 624 configured-table combinations, 26 tables, ~1,000 test cases
- Scope
- Catalogue and approval queue, BOQ editor, configurators, share links and client approval, procurement queue, CRM and Books sync, Revit plugin