← All posts

Job Costing After the Job Closes: Did You Actually Make Money?

September 3, 2026

Ask a contractor how job #47 went and you'll usually get a vibe, not a number. "Went fine, client was happy, I think we made out okay on it." That's not job costing — that's a feeling. The bank account went up over those six weeks, but so did it for every other job running at the same time, and payroll and material bills for job #48 were also coming out of that same account. Without pulling job #47 apart on its own, you genuinely don't know if it was the profitable one paying for the others, or the one quietly eating the margin from a different job.

Job costing is the fix: closing out each project by comparing what you estimated against what it actually cost, line by line. It takes 20–30 minutes per job and it's the only thing that turns "I think we did okay" into "we made 22% gross margin on this one, and here's exactly where the other 8 points went."

Why the bank balance lies to you

If you're running two or three jobs at once — which most contractors are — cash in the account at any given moment reflects deposits collected, draws paid out, and expenses across all of them, not the profitability of any single one. A big deposit on a new kitchen job can make the month look great while the bathroom remodel that closed out last week actually lost money. You won't see that unless you isolate it.

The other lie is timing. You might get paid for job #47 in October but have paid the tile sub and bought the vanity back in September. Cash flow and job profitability move on different clocks — job costing looks at the job's own numbers regardless of when the cash actually crossed your account.

What to compare, line by line

Pull up the original estimate and lay it next to what actually happened. Four categories, same order every time so jobs are comparable to each other:

Labor. Estimated hours × rate, per task, next to actual hours logged × rate. This is where the biggest surprises live. A tile job estimated at 24 hours that actually took 34 isn't a rounding error — it's 40% more labor cost than priced, on a task you'll bid again next month unless you catch it here.

Materials. What you priced at bid time versus what you actually paid at the register or on the supplier invoice. Include waste — if you bought 12 sheets of drywall and used 9, that's real money even though it wasn't "cost overrun," it was over-ordering, and it's a different fix (tighter takeoffs, not a higher waste factor).

Change orders and discovered conditions. Add every approved change order into the actual-cost side — these should already be priced correctly since you priced them properly when they happened, but confirm the labor and material on them actually landed where you priced them, not just that the client paid.

Subs and permits/fees. Actual invoices from every sub against what you budgeted for their scope, plus permit and inspection costs against what you estimated — these get missed more than people expect, especially re-inspection fees when a first inspection fails.

The math that matters

Once actuals are in, three numbers tell you almost everything:

  • Estimated gross margin — what you priced the job to make, as a percentage of the contract price.
  • Actual gross margin — (contract price − actual total cost) ÷ contract price.
  • The gap between them, and which category caused it.

A job priced at 25% margin that actually landed at 25% is a job you can trust your process on. A job priced at 25% that landed at 9% didn't lose money because the client didn't pay enough — it lost money because something in the estimate was wrong, and if you don't isolate which category, you'll make the same wrong guess on the next bid.

What the gaps usually turn out to be

Run this on five or six closed jobs and a pattern almost always shows up, and it's almost never "materials were more expensive than expected" — material prices are looked up, not guessed. It's nearly always one of these:

  • Labor hours estimated optimistically. Not because the estimator is bad at math, but because the number in their head is "how long it takes when everything goes right," and everything rarely does. If actual labor is running 15–25% over estimate across multiple jobs of the same type, that's not five bad jobs — that's your labor estimate for that task type being wrong, and it needs to move for every future bid, not get written off as bad luck each time.
  • Punch list and callback time never got estimated at all. The last two hours fixing a squeaky door and touching up paint after the client walk-through rarely has a line item, and it adds up across a year of jobs.
  • A markup or overhead number that doesn't actually cover overhead. If margin is consistently short by roughly the same few points across different job types, the estimate structure itself — not any one job — has a hole in it. That's a markup problem, not an execution problem.

Do it the same day the job closes

Job costing that happens six months later, in a end-of-year scramble with a stack of invoices, gets skipped or done badly — the details are gone and it turns into an afternoon of receipt archaeology instead of a 20-minute review. Do it within a few days of final payment, while the job's still fresh: pull the estimate, pull the actual costs, run the four categories, write the margin gap and its cause in one sentence. "Bathroom remodel, priced at 25%, landed at 17%, gap was tile labor running 30% over estimate — bump tile labor hours on future bids by 20%." That sentence is worth more to your next ten estimates than any amount of general "get better at estimating" advice.

Feed it back into the next bid, not just the file cabinet

The whole point of the review is that it changes the next estimate, not that it produces a tidy record of the last one. If tile labor keeps running long, the labor hours on tile tasks go up in your next estimate — not your gut feel about tile, the actual number from actual jobs. If a sub's invoices keep coming in higher than what you budgeted for their scope, that's a conversation with the sub or a higher number budgeted for them next time, decided before the next bid instead of discovered again after it.

JobPencil keeps every estimate's line items — labor by task, materials with quantities, change orders — as a saved record you can pull back up once the job's done, so the post-job review starts from the actual numbers you priced instead of a memory of them. Build and save your estimates free in the browser, no account required until you save.

Ready to build your estimate?
Free to use — no account needed until you save.
Start an estimate