Construction Job Costing Explained — The Right Way to Know If a Job Made Money
Most subcontractors find out a job lost money after it's done.
The closeout paperwork is finished, the retainage finally comes in, and someone adds it all up and realizes the margin was half of what was estimated. Or worse — the job was actually a loss.
By that point there's nothing you can do about it. The crew is gone. The materials are installed. The GC has moved on. You're just left sitting with the number.
That's what happens when job costing doesn't work. And at most subcontracting companies, job costing doesn't really work.
What job costing is supposed to do
Job costing is simple in concept. You assign every dollar you spend to a specific job. Labor, materials, equipment, subcontractors, permits, overhead allocation — it all gets tagged to the project it belongs to. Then you compare what you actually spent against what you estimated you'd spend.
That comparison is the whole point. It tells you:
- Whether this job is on track or off track right now
- Which phases are running over estimate and why
- Which types of work you consistently underprice
- Which GCs consistently cause scope creep and cost overruns
- Whether your estimating is accurate or you're winning jobs by accident
Without that comparison, you're flying blind. You might have a general sense that things are going okay or not going okay, but you don't know specifically what's wrong or how to fix it.
Why most subcontractor job costing doesn't actually work
Here's the problem. Most subcontractors have job costing set up in their accounting software. Costs are tagged to jobs. Reports get run. But the reports don't tell them anything useful. Here's why.
The cost categories don't match the estimate.
If your estimate breaks down labor into concrete forming, rebar, pour, and finishing — but your job costing just has one "labor" category — you can't compare them. You know labor ran over, but you don't know which phase or why. That information is useless for fixing the estimate or managing the next job.
The cost code structure in your accounting system has to match the way you estimate, line for line. If it doesn't, the actual vs. estimated comparison is meaningless.
Costs get entered too late.
Field guys finish a week of work. The timesheet gets submitted on Friday. The office enters it in the accounting system the following Tuesday. By the time the job cost report is run at the end of the month, the labor costs are three weeks old.
If a phase is running 20% over on labor and you find out three weeks later, you've already burned another three weeks of overrun labor that you couldn't do anything about. Real job costing requires timely cost entry — ideally same day or next day from the field.
Nobody looks at the reports.
Even when job costing is set up correctly and costs are entered on time, the reports often don't get reviewed until the job is closing out. Monthly job cost reviews — comparing actual costs to estimated costs by phase on every active job — are where the value actually comes from. The report is worthless sitting in a folder nobody opens.
What good job costing looks like in practice
A $5M SWPPP subcontractor we work with had job costing set up before they came to us. Costs were being tagged to jobs. Reports were available. But the cost categories were set up by a bookkeeper who didn't understand how SWPPP work is estimated — erosion control, inlet protection, fiber rolls, and hydroseeding were all lumped into "materials." The actual vs. estimated comparison showed materials ran over by $40,000 on a recent job, but nobody could tell which items drove it.
We rebuilt the cost code structure to match their estimating categories exactly. Within two months they identified that hydroseeding was consistently coming in 30% over estimate on highway jobs — something their estimator had no way of seeing before. They adjusted the unit price. The problem stopped.
That's what job costing is supposed to do.
The five things job costing has to get right
1. Cost codes match the estimate
Every line item in your estimate needs a corresponding cost code in your accounting system. If you break labor into phases in your estimate, break it into the same phases in job costing. This is the single most important setup decision.
2. Timely cost entry
Labor should be entered within 24-48 hours of being worked. Materials should be coded to jobs when the invoice arrives, not when it gets paid. Equipment costs should be allocated to jobs based on actual days or hours on site. The older the data, the less useful it is.
3. Overhead allocation
Every job should carry a proportional share of company overhead — rent, insurance, vehicles, office staff, phones. If you don't allocate overhead to jobs, your job cost reports will overstate profitability. A job that shows a 15% margin might only be generating 8% when overhead is properly allocated.
4. Regular review
Job cost reports should be reviewed monthly at minimum for every active job. The review should answer three questions: Are we within budget on costs to date? What does our cost-to-complete estimate look like? Are there any phases where actual is running significantly ahead of estimated that need attention?
5. Closeout comparison
When a job closes, run a final actual vs. estimated comparison and document what drove any variances. This becomes the data that improves your next estimate. Over time, your estimating gets more accurate because it's based on what jobs actually cost — not what you hoped they would cost.
What job costing tells you that the P&L never will
The P&L tells you how the whole company did over a period of time. Job costing tells you how each individual project performed. Those two things can look completely different.
A $2M electrical subcontractor we worked with had a solid P&L — decent revenue, reasonable margins, the company appeared healthy. When we built proper job costing for the first time, we discovered that two of their five regular GC relationships were consistently producing below-break-even jobs. The other three were profitable enough to carry the losers. The owner had no idea. He was working twice as hard on the unprofitable GC relationships because they gave him more volume.
He ended the two unprofitable relationships within 90 days of seeing the data. Revenue went down. Profitability went up. He started sleeping better.
That's the power of knowing what each job actually makes.
The software question
We use ControlQore for job costing with our clients. It's built specifically for construction subcontractors — the cost code structure is designed for trade work, the reporting connects job performance to cash flow, and it's priced at approximately $100 per month per $1M in revenue. For a $3M subcontractor that's $300 a month to have real job costing. That's not a cost. That's one discovered cost overrun per year paying for itself ten times over.
QuickBooks can tag costs to jobs but it wasn't built for construction job costing. Sage and Foundation have the right structure but are priced for larger contractors. ControlQore hits the right balance for the $1M to $12M subcontractor.
The bottom line
Job costing isn't a bookkeeping function. It's a management tool. When it's set up right and used consistently, it tells you — in real time — what every active job is making, where costs are running over, and what you need to do about it before the job closes.
When it's set up wrong, or not used consistently, it's just numbers in a system that nobody trusts and nobody uses.
The difference between those two outcomes is setup and habit. Get the cost codes right, enter costs on time, and review the reports monthly. That's it. Everything else follows from those three things.