A sales process that needs to scale
Every deal lived in the CRM, and every quote was produced by a technical advisor. A customer who already knew what they wanted still waited for a call, a survey and an advisor-built quote. All the pricing logic — products, subsidies, installation surcharges, discounts — lived inside the internal tool and in the advisors' heads.
One codebase served two audiences with opposite requirements: a public, conversion-sensitive customer funnel, and a dense internal operator tool used all day by three different teams.
Underneath sat four structural limits: no self-serve path, quote publishing that blocked the user, access control scattered through UI components, and no reliable answer to who changed what on a deal.
Pull the pricing out, then build the funnel on top of it
Two senior engineers embedded in the Quatt team. Nothing here was a rewrite: the CRM stayed the system of record, and each step left the business running while the next one was built.
Make pricing a service
One place defines products, subsidies, bundle rules and financing rates for every frontend that shows a price. Before the funnel could quote anything, the quoting logic had to leave the internal tool.
Model the funnel, not the pipeline
House and lead first, rather than a deal for every first enquiry, with an explicit conversion step into the sales pipeline. The data model now matches how customers actually arrive.
Build address to paid order
A postcode resolves into real building data, which drives a savings estimate, a product recommendation and a deposit-paid order, with no advisor in the loop. Sites too complex to price go to a consultation rather than a wrong number.
Take publishing off the request path
Quote publishing became a queued job with dead-letter handling and per-environment isolation. The client polls for completion instead of holding a request open behind the slowest external API in the chain.
Make access configuration
One permission engine shared by API and UI, set per form and read-only by default. Three teams work the same deal, each editing only what its step of the workflow owns. Every meaningful change is captured and readable on the deal itself.
Rebuild the workspace around the job
Advisors brief installers by marking up site photos, so the tool was rebuilt around that: layers, product shapes, on-canvas text, keyboard shortcuts, fast on high-resolution images, beside the form the photo belongs to.
Four workstreams, one shared backend
The frontends hold no business rules and no integration credentials. One backend owns the logic and every external system; the CRM stays the system of record.
The self-serve funnel
Three product lines, each with its own questions and recommendation logic, on a shared pricing and overview surface. Placement, piping and electrical work become customer-answerable questions mapped to real surcharges.
Pricing and the data model
Products, subsidies, bundle rules, VAT treatment, rental and financing on live lender rates, defined once. A documented API contract with typed clients generated from it.
Hardening the platform
Publishing off the request path, one permission engine shared by API and UI, and a complete deal history captured through a batch queue and readable by operators.
The operator workspace
Annotation and the media gallery on the deal page, installation documents merged into one place, advisor notes gathered for work prep at handover, specifications in purpose-built forms.
A funnel, a commerce core, and a tool people can work in all day
A self-serve funnel, live for three product lines
Configure, price and order with a deposit taken, landing in the same pipeline advisors use.
Pricing as data, not code
Prices, subsidies, energy-rate assumptions, discounts and financing rates served at runtime. A revised gas price no longer needs a release.
Durable quote publishing
A long, failure-prone synchronous transaction became a job that is enqueued, retried, dead-lettered and observable. A partial failure no longer strands a deal.
A modular platform
The customer application runs as its own independently deployable service against the core API — a clean line between the public funnel and the internal platform.
An annotation workspace that keeps up
Marking up a high-resolution site photo is smooth instead of stuttering, and it happens beside the form it belongs to. Unglamorous, and the difference between a tool that is tolerated and one that is used.
Senior engineers inside the team, not beside it
Two engineers embedded with Quatt's own team, working the same board. A funnel that quotes a real price for a real house needs someone who understands both the commerce model and the installation reality.
Refactor while the business runs
No big-bang rewrite. The CRM stayed the system of record, advisors kept quoting, and each step shipped behind feature gates before the next one started.
A contract before a split
The API was documented, versioned and typed first. That is what let the customer application be pulled out as an independent service instead of an ambition.
Async you can reproduce on a laptop
Every pull request gets an isolated preview environment with its own queue set, and the same queue code runs locally against an emulator. Queue behaviour stops being a production-only mystery.
More of our work
All cases →Can a customer buy from you without talking to anyone?
Tell us where your pricing logic lives today. We will tell you what it takes to put a real price in front of a customer.


