Progress billing is the hard part, not the estimate
Most construction projects can be quoted in a spreadsheet. What a spreadsheet cannot hold is the month after: certified percentages, retention held per contract, variation orders approved at different rates, and an invoice that has to reconcile to all three. In Odoo this runs on the project and its analytic account, so a certificate raised against completion writes to the same cost object the purchase orders and timesheets already post to. The invoice stops being a re-keying exercise.
Committed cost is what tells you the margin, and it is the number nobody has
Actual cost arrives late, when the supplier invoice does. Committed cost, the value of purchase orders raised but not yet invoiced, is what tells you where a project is heading while you can still act. Odoo shows both against budget on the same project, which is usually the first time a commercial team sees a live margin rather than one assembled after close.
In-house manufacturing has to answer to the project, not the warehouse
Joinery, metalwork and fit-out production create a second planning problem: work orders that exist because a project needs them on a date. Running MRP against project demand rather than replenishment stock keeps that link, so a slipped site date reschedules the shop floor instead of quietly building inventory nobody asked for.
