Have a password?

Unlocks the client-named version of every project.

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.

Re-enacted quote: a room's bill of quantities, totals, stage and purchase orders by vendor

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)
Re-enacted: generate a room's bill of quantities from the model, clear the colour gate, share with the client, and watch approval raise purchase orders by vendor

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
← All work