A roof truss manufacturer — wooden roof structures sized for a specific roof, a specific rafter spacing, a specific snow load. Every quote bespoke, every one calculated separately in Excel by a sales rep. Three months later, instead of two hours in Excel it takes five minutes in the browser — and zero wrong quotes.
Context: a product that does not fit a price list
The client has been making roof trusses for eighteen years. Thirty people, two production halls, deliveries to construction sites within a 300 km radius. A truss is not a shelf product — it is a roof structure designed for a specific build, with a specific roof geometry, angles, spacing, climate-zone snow load, span length and timber class.
Every quote is unique. The customer (developer, design office, individual investor) shows up with a roof PDF or a parameter list. The sales rep analyses the structure, picks truss types, calculates quantities, checks current timber and gangnail prices from the supplier's price list, applies a margin tuned to the customer type and packs it into a quote.
We started working together in 2025. The client came to us after trying to buy an off-the-shelf product from a foreign vendor — only to find out it was structural design software (for stress calculations), not quoting software. Quoting was supposed to stay in Excel. The client said: "I don't want another Excel. I want a tool that takes parameters and spits out a PDF I can send to a customer in 5 minutes."
Starting point: 2 hours in Excel, 5 versions of "the current" file
The status quo looked like this. Each of the five sales reps had their own copy of the "main" Excel, modified to taste. The timber price list lived in a different Excel, updated by hand by the procurement manager. The gangnail price list — in a third Excel. Margins — from memory, "because Mr Janek knows what to give to which customer."
The consequences were painful and measurable:
- About 2 hours to prepare a single quote. With 60–80 enquiries a month that is ~140 hours of sales-rep time, much of it spent re-typing numbers between spreadsheets.
- The customer waited 2–3 days for a quote. On construction projects, where the investor sends an enquiry to three manufacturers, whoever replies first often wins the order.
- Wrong quotes — about one in ten quotes had an error: a stale timber price, a miscounted quantity, a misapplied margin. Some were caught by review, some went to the customer. Complaints, renegotiations, the occasional loss on the order.
- No history. A year in, nobody remembered what we had quoted customer X for a similar roof or what margin we gave.
What we considered and what we ruled out
The first idea was "let's improve Excel." We could build a complex sheet with VBA, macros and cell protection. We talked the client out of it: every such sheet becomes unmanageable after a year, nobody knows who changed what, no new sales rep ever learns it.
The second option was an off-the-shelf CPQ (Configure-Price-Quote). We evaluated three. All were aimed at distribution firms with a product catalogue — not at a manufacturer sizing a structure to a specific roof. The domain logic would have to be written as customisation; licence + customisation costs exceeded the cost of a bespoke solution.
We chose a bespoke web system. Three reasons: (1) the domain logic needed a precise model (truss types, geometry, loads) — easier to write from scratch than to bolt onto a CPQ schema; (2) the client wanted the system to grow — adding a B2B portal and a production integration in later phases; (3) build cost was lower than the 3-year TCO of an off-the-shelf CPQ.
Solution: configurator + price lists + PDF generator
Step by step
- Truss selection
- Supplier price lists
- Margin rules
- Versioning
The most important part was the quoting engine. We designed it as a separate domain module with unit tests covering every truss type. The sales rep enters roof parameters (geometry, rafter spacing, snow zone, timber class), the system picks the right truss type from the library, calculates the number of boards, the number of gangnail plates, lengths, sections, weight and finally the price.
Timber and gangnail price lists are pulled once a day from supplier Excels (we kept that format, because the suppliers will not change it — middleware reads them and loads the data into the database). Margins and discount policy are encoded as rules: customer type A → margin X%, customer type B → margin Y%, winter season → bonus Z%.
The sales rep generates a quote with one button. The PDF (QuestPDF) contains: a roof sketch (rendered from parameters), truss tables with dimensions and weight, the cost breakdown, delivery terms, lead time, the company's address and the rep's contact details. Company branding, clean layout, ready to email in one click.
Three decisions that paid off
- Price-list versioning. Every quote stores the price from a specific price-list version. Three months in, a customer asked "why was that quote cheaper" — the system showed which price list was active on the issue date.
- Configurator in Polish. The sales reps did not want "the typical English SaaS." Everything in Polish, no jargon, with the Polish truss-type names they use on the shop floor.
- Production export. Once a quote is accepted, the system produces a package for the production team: bill of materials, cutting plan, labels. One more manual step gone.
Rollout: 3 months, 4 sprints, one team
We worked in four two-week sprints. Sprint 1 — domain model and quoting engine (engine only, no UI, covered by tests using real examples from the client's Excels). Sprint 2 — configurator UI and basic end-to-end calculation. Sprint 3 — PDF generator, price-list integration, authorisation, audit. Sprint 4 — production export, migration of historical quotes (the 300 most recent into the database), training the sales reps.
Every sprint ended with a demo for the sales reps and the board. Several important tweaks (e.g. simplifying the geometry-input screen) came from those demos — sales reps saw the thing early and reported specifics nobody would have thought of around a desk.
Results 9 months after rollout
The client increased the number of enquiries handled by about a third without growing the sales team — sales reps now have time to talk to customers instead of sitting in Excel. Response time on enquiries dropped from 2–3 days to same-day, which noticeably improved conversion to orders (the customer does not have time to ask a competitor).
The value did not arrive when the code was written. It arrived the first time a sales rep sent a quote 8 minutes after the customer's phone call and the customer replied "wow, that was fast."
What's next
The system is live and the client keeps growing it. In 2026 we are planning phase two: a customer portal where developers and design offices submit enquiries themselves and get an instant indicative quote (the sales rep just approves and sends the PDF). Plus an integration with the client's production system so that an accepted quote drops in as a production order.
This is a good example of a project that starts with one, very specific pain point (quoting) and ends up tidying up the whole front-office along the way. We do not rewrite the ERP. We do not change the processes. We pick the most painful point and automate it — and the rest grows around it in subsequent phases.
Does your firm price products to the customer's spec, by hand? Let's talk for 30 minutes about what could be automated — no commitment.
Book your free consultation →