Work/Quatt/Sales platform
Composable Commerce Three product lines live

From CRM-driven sales to self-serve commerce

Quatt sells and installs heat pumps, cooling units and home batteries across the Netherlands. Every quote used to be built by hand, by an advisor, inside an internal tool. We turned that into a platform customers can order from directly, and made the operations behind it durable enough to carry the load.

Customer Quatt
Client Quatt
Sector Energy
Service Cloud Native Engineering
Team Two senior engineers embedded
The challenge

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.

Quatt heat pumps installed outside a home
Quatt sells and installs heat pumps, cooling and home batteries across the Netherlands.
What we did

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.

01

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.

02

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.

03

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.

04

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.

05

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.

06

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.

The result

What exists now that did not before

3
Product lines orderable end to end without an advisor: heat pumps, cooling, home batteries
0
Releases needed to change a price, a subsidy cutoff or a financing rate. Pricing is data, served at runtime
3
Teams on one deal record — account management, work prep, installation success — each editing only their step
6mths
From CRM-driven quoting to a live self-serve funnel and a modular platform behind it

Orders from the funnel land in the same pipeline advisors already use, so downstream operations and finance were unchanged by design. Deal history went from an investigation to a lookup. Outcomes here are stated as capability delivered; commercial performance figures are not published.

Where the work sat

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.

Customer facing

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.

Commerce core

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.

Reliability

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.

Interface

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.

The Quatt self-serve funnel and operator workspace
What we delivered

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.

“You cannot sell a heat pump online until the price is a service instead of a person. That was the first job, and everything else followed from it.”

Goran Rajic, Brighting
What we brought

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.

Next.js 15 React 19 TypeScript Tailwind Konva AdonisJS 6 PostgreSQL CRM as system of record Managed queues with DLQ Managed containers Infrastructure as code Payment provider Feature gates & remote config Error tracking Turborepo Playwright

More of our work

All cases →
ASICS

Full readiness assessment for AI scalability across 42 capabilities

42 capabilities scored · 2-week assessment
ASICS

Eight weeks from signing to the first agent live

8 weeks to first agent live
HEMA

Real-time pricing on every shelf, in every store

800+ stores live · 4-year partnership

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.

+31 20 210 13 90 info@brighting.nl Grasweg 183, 1031 HX Amsterdam