ur quotes are built from a catalogue: a base price for the kind of thing being made, add-ons with their own prices, and a small number of multipliers for the situation — a larger organisation, a compressed timeline, a flexible one. All of the multipliers are decimals, and decimals do what decimals do.
So a rep would land on £7,458.75. Correct to the penny, and completely wrong as a thing to say to somebody on a phone call.
Apriceendingin75ptellstheclientaspreadsheetproducedit.Apriceendinginazerotellsthemapersondid.
This is not really about aesthetics. A quote with pennies on it invites a particular question — how exactly did you arrive at that — and the honest answer is "a multiplier", which is a bad answer even when the number is right. A round figure invites the better question, which is whether the scope is right.
In the pricing module, not the quote module, so that the price calculator can use it without a circular import. That sounds like a triviality and it is the whole reason this works: every surface that prices anything routes through the same function, so the calculator on the public site, the rep's price sheet, the proposal builder and the invoice all round identically. They cannot disagree with each other mid-call, which is the failure this codebase has already had once.
Ten pounds is the smallest step that kills the pennies. It moves any quote by at most five pounds — you can watch the exact drift in the demo above as you tick the multipliers. Nobody has ever noticed five pounds on a five-figure project. Everybody notices 75p.
Rounding is applied to multiplied totals. Bespoke lines — the ones a rep typed themselves, for work that is not in the catalogue — are never multiplied and never rounded. Those numbers were arrived at with a specific client's situation already in view, and a system that quietly adjusts a figure a person chose is a system that person stops trusting.