Budget vs. actual is job costing's weekly report: one row per cost code, with the budget, the recorded cost, the committed cost, the remaining, and the variance. It only works if the budget and the costs use the same codes, which is why the estimate and the ledger should share a list. Read weekly, it finds the line that's drifting while there's still time to write a change order, switch a supplier or have the conversation with the client.
A worked number
Tile and flooring: budget $4,200, recorded $3,900, committed $1,100 for the entry tile still to be delivered. Projected $5,000, variance minus $800, 19% over. The job is otherwise on budget, so the overrun is one line and one cause, the pattern upgrade the client asked for on site, and it's a change order if it's written this week.
The mistake it hides
Reading actuals without commitments. A line that shows $3,900 against $4,200 looks fine until the $1,100 order lands; the committed column is what makes the report honest mid-job. The other mistake is a budget nobody updates after approved change orders, so every extra reads as an overrun.
In Obra
Every project carries a budget per category and shows recorded cost against it, with change orders adjusting the revenue side. What's still coming isn't a separate column: it lives in the forecast review as remaining to spend, which is where signed subs and placed orders belong. The free budget vs. actual tracker runs the same view on paper.