Intelligent Quoting

2025 · Associate Lead Product Designer · with PM · engineering · Roofing vertical · Quoting (CPQ) · Workflows

Configure, price and quote a roofing job inside the product — proposals built and sent without a spreadsheet

the problem

Some work can’t be priced from a catalogue. If what you sell depends on what you find when you arrive — roofing, remodelling, industrial repair — the price has to be worked out one job at a time, by someone who knows what they’re looking at. Software is bad at this, so people do it in spreadsheets.

That was the situation at Zuper. Roofing contractors ran their business in our product, then left it to build the single most important document in the sale: the proposal a homeowner reads, compares, and signs. It was assembled by hand in a spreadsheet and pasted back into the world.

Three things followed. It was slow, and deals cooled while a quote was being built. It was inconsistent, because the pricing know-how lived in one estimator’s head — two salespeople quoting the same house arrived at different numbers and neither could explain why. And it was disconnected: a signed spreadsheet tells the rest of the system nothing, so scheduling, ordering materials, and tracking the job all started again from zero.

the constraint

Every contractor prices differently. The flow had to encode that flexibility without exposing it — simple interface over complex logic, or nobody uses it.

the words, in plain English

how I understood it

I went to the people doing the work. I spoke with roofing customers about how they build a proposal today — not how they would describe the process in the abstract, but what they actually open, type, and copy between windows.

Then I ran a workshop to lay the whole thing out at once. That was the turn. Taken one at a time, every variable that moves a roofing price sounds manageable. Put them on a wall together and they multiply, and the spreadsheet stops looking like a bad habit — it was the only tool flexible enough to hold what they were being asked to hold.

Everything below came out of those two things. Each decision in the next section names the finding it came from.

what I found

The job changes shape, not just price

A steeper roof is not the same work costing more. It calls for different materials and different labour, so the quote needs different rows on it — not a bigger number at the bottom. Contractors were not calculating a total; they were deciding what the job consists of.

No two contractors sell the same thing

They buy different brands, work to different margins, bundle work differently, and disagree about what a job includes. Anything shipping a built-in price list would have fitted one customer and been wrong for everyone else.

Every retyped number is a chance to be wrong

The measurements already exist — someone captured them on site. Copying them by hand into a quote is where mistakes enter, on a document a customer is about to sign.

A blank page stops people

Handing a contractor an empty template is asking them to do software configuration. That is not their job, not their skill, and not what they opened the product to do.

The most important reader never sees the software

The homeowner is not approving a document, they are choosing between options at their kitchen table. That reframed the output: not a quote, but a comparison a non-expert can act on.

the decision it all hangs on

Every contractor’s pricing know-how has to live somewhere in the system. That is the whole design problem, and it is not a roofing problem — it is what happens any time software has to serve businesses that each do the job differently.

The contractor sets up pricing logic once, on the template, in the place that logic applies. From then on Zuper reads the job — measurements, checklist answers, job fields — and decides what belongs on the proposal.

the decisions underneath

Teach the system the contractor’s judgement, once

From finding: the job changes shape, not just price

The contractor writes down the decision they already make in their head: when the roof looks like this, the job includes that. The system then applies it to every future quote without being asked again.

It reads as a sentence rather than a formula — when this is true, include this; otherwise include that instead. What goes in those blanks is the contractor’s own expertise, and the design job was never to have an opinion about roofing. It was to give that expertise somewhere to live besides one person’s memory.

Keep the rule next to the thing it governs

From finding: no two contractors sell the same thing

Rules sit on the individual item, not in a separate settings area. A central rules screen would have been easier to build and worse to live with — it makes the contractor hold a mental map of which rule affects what, and turns “why is this on my quote?” into an investigation.

Attached to the item, the answer is always one click from the thing that appeared.

Decide what happens when rules disagree

From finding: the most important reader never sees the software

Rules can be set on a whole group of items as well as on each item, which means they can contradict each other. I decided the order of precedence up front rather than letting it be discovered in testing.

The case worth defending is the quiet one: if a group is included but nothing in it qualifies, the group disappears entirely rather than printing an empty heading. Rule systems fail at their edges, and this edge was visible not to our user but to our user’s customer — the homeowner holding the document.

Remove the retyping

From finding: every retyped number is a chance to be wrong

Quantities pull straight from the measurements already recorded on the job, or from a formula built on them. The number is captured once, where it is measured, and flows into every line that depends on it.

It is the least visible thing in the system and one of the most valuable. It removes a class of error by removing a class of typing.

Never start from an empty page

From finding: a blank page stops people

Setup opens on ready-made starting points — brand-specific layouts, and simple good / better / best tiers — with a blank option for anyone who wants it.

These are not shortcuts, they are a teaching device. Opening a good/better/best layout tells a contractor what the system is for and what shape their own version should take, faster than any explanation would. Rules can also be applied to many items at once, for a related reason: the first version of any rule system assumes rules are rare, and in practice the same condition gets set across a dozen items.

Order the setup by what each step needs to know

Six stages, sequenced so that each one has the context to make its decision. The cheapest, most defining choice comes first and narrows everything after it. Money questions sit late, because they describe the finished offer rather than its parts. And a preview comes before publishing, because a template is abstract until you see what the homeowner would see — that is the first moment a contractor can judge their own work.

Most of the design time on this project went into that ordering and into the rule model. Very little went into drawing screens.

what shipped

the screens

Zuper Intelligent Quote Builder showing roofing line items with type, rules, quantity source and formula columns
The screen the whole project lives on. Every row is one line on the homeowner’s document; the columns are the two decisions a contractor makes about it — when does it apply, and how much of it is needed.
Conditional rule panel with IF, THEN and ELSE sections for a line item
The same three-part sentence, in the product. Empty by default and colour-coded by role, so an untrained user can see the shape of the decision before they know what to put in it.
Formula library panel listing measurement formulas such as shingles squares and underlayment rolls
Thirty-six measurements, each already captured on the job. Picking one is how a contractor says “however much roof there is” without typing a number that could be wrong.
Formula builder with expression editor, field insertion and a live preview and test panel
The depth underneath, for contractors whose maths is their own. It validates and previews against sample values, because a pricing formula you cannot test is one you will not trust.
Three proposal option cards — Premium, Essential and Basic — with roof photography, item lists and prices
The output, and the reason for all of it. Three options a non-expert can compare at a kitchen table — assembled from the rules, not typed.

measured in production

rolling 90 days · In-app interaction events. Test and internal accounts excluded.

I keep a live dashboard on this, and the tile I open first isn’t volume — it’s every quote, proposal and CPQ event ranked by clicks, distinct users, and distinct companies. Workhorses at the top, prune candidates at the bottom.

That ranking is how the next round of design decisions gets made: what to build on, what to leave alone, and what to remove. The same dashboard carries abandonment and unsent-draft views, because the interesting question is never how many people finished — it’s where the ones who didn’t stopped.

These events carry no quote identifiers or values, so win rate and revenue are not derivable from them and I don’t claim either. That needs a different source.

what changed

what I'd do differently

The interface was never the hard part of CPQ — the pricing model was. I got there by building toward it rather than starting from it. Next time I’d design the precedence rules alongside the item rules instead of after them: deciding what happens when two rules disagree isn’t an edge case to tidy up later, it’s what determines whether a contractor trusts the output enough to put their name on it.

Open the full portfolio →