The Short Version
I've reviewed job cost reports for hundreds of construction companies. The pattern is consistent: builders who feel like they work hard and make little money almost always have the same set of tracking failures. Not pricing failures — tracking failures. The margin was there on paper at the estimate stage. It disappeared during execution because the cost data was incomplete, miscategorized, or reviewed too late to act on. Fix the tracking, and the margin reappears.
Sound Familiar?
Signs your job costing has one or more of these problems:
- You finish jobs estimated at 18–22% gross margin but they close at 10–13% — and you can't explain where the gap came from
- Your job cost reports show a single line for 'Subcontractors' or 'Materials' instead of a breakdown by phase or trade
- You find out a job went over budget when the final invoice arrives — not three weeks earlier when there was still time to adjust
- Your cost codes don't capture owner time spent on jobs, so the most labor-intensive jobs look artificially profitable
- You've had a job close with a positive margin on paper, then received a warranty callback six months later that wiped out the profit
What We Found
The Coding Mistakes That Make Job Cost Reports Meaningless
The most common reason job cost reports don't match reality is that costs are entering the system in the wrong places. Not because anyone is careless — but because the cost code structure makes it easier to lump things together than to track them precisely. There are two coding mistakes I see in almost every construction business I audit.
Mistake 1: Lumping subcontractor and supplier invoices under broad codes
The pattern looks like this: a builder has a cost code called "Subcontractors" and another called "Materials." Every subcontractor invoice goes to one. Every supplier invoice goes to the other. The job cost report shows $180,000 in subcontractors and $62,000 in materials on a $420,000 project. That tells you almost nothing useful. It doesn't tell you which phases ran over. It doesn't tell you whether the framing sub came in at budget or 14% over. It doesn't let you compare this kitchen remodel to the last one to see whether your labor costs are moving in the right direction.
The fix is allocating every invoice to the phase-level code it belongs to. Framing sub invoice → 02-Structure-Framing Labor. Plumbing rough invoice → 03-Mechanicals-Plumbing Rough. Drywall material invoice → 05-Interior Finishes-Drywall Materials. It takes an extra 30 seconds per invoice. Over the course of a job, it converts your job cost report from a useless summary into a phase-by-phase profitability analysis you can actually act on.
In my experience across 312+ builder engagements, builders who make this switch typically discover that 2–3 phases are consistently running 15–25% over their estimates — and that the overruns in those phases are masking performance in the phases that are actually on budget. You can't see that with lumped codes. You can only see it with phase-level allocation.
The Lumped Code Problem in Numbers
A custom home builder I worked with in Colorado had been tracking all labor under a single "Labor" cost code for three years. When we rebuilt his cost code structure and reallocated 18 months of historical data, we found his rough framing labor was averaging 22% over estimate while his finish carpentry labor was consistently 8% under. He'd been repricing both incorrectly for years — raising his finish carpentry rates unnecessarily while accepting framing bids that were consistently too low. The data was there. The code structure was hiding it.
Mistake 2: Not matching job cost codes to your estimate structure
The second coding mistake is more subtle but equally damaging: your job cost codes don't match your estimate line items, so you can never make a direct comparison between what you bid and what you spent.
Here's how this happens. Your estimate was built with 47 line items. Your job cost system has 23 cost codes. The estimate had "Framing Labor" and "Framing Materials" as separate lines. Your cost codes combine them into "Framing." The estimate broke out "Rough Plumbing," "Rough Electrical," and "Rough HVAC" separately. Your cost codes have "Mechanicals - Rough." When the job closes, you try to compare estimated to actual and you're reconciling two completely different structures. It takes an hour of manual work and the results are still fuzzy.
The solution is building your estimate template and your cost code structure simultaneously, from the same hierarchy. Every estimate line item has a corresponding cost code. Every invoice maps to a code that has a corresponding estimate line. The comparison is automatic. The variance is visible. When they're not aligned, the system produces noise instead of insight.
The Missing Costs Nobody Tracks — Until the Job Closes Broke
Even when invoice coding is clean, many builders are systematically undercounting their job costs because entire categories of real expense never make it into the job cost system at all. The two most common: owner and supervisor labor, and indirect project costs treated as overhead.
Mistake 3: Leaving owner and supervisor time off the job cost report
This is the mistake that makes the most profitable-looking jobs the least actually profitable. A builder doing $1.5M in annual revenue typically has 20–30% of their projects receiving significant owner involvement — site visits that turn into half-days, client calls that stretch into problem-solving sessions, personal work done because a sub didn't show. None of that time makes it onto the job cost report. Jobs where the owner puts in 40 hours close at 19% gross margin. Jobs where a PM runs everything without owner involvement close at 16%. The owner concludes their best jobs are the ones they show up on. The opposite is almost certainly true.
The fix requires two things. First, the owner needs to log their time by job — even roughly. An hour a day allocated to the right job is enough. Second, that time needs to be valued. Your labor has a cost: at minimum, your salary equivalent as an employee, typically $75–$120/hour for a working owner in the $1M–$3M revenue range. Log 40 hours × $90/hour = $3,600 of job cost that the report was missing.
What Owner Time Costs Look Like at Scale
A remodeler I worked with in the Pacific Northwest was spending approximately 25 hours per week on active jobs — site visits, sub coordination, client issues, material pickups. He wasn't logging any of it. When we calculated his burdened hourly rate ($95/hour including benefits, vehicle, and phone) and allocated those hours across his active jobs, his "best" job of the year lost $4,200 of its reported $11,000 gross profit. His actual margin was 6.2%, not 14.1%. He'd been celebrating a job that barely broke even.
Mistake 4: Treating indirect project costs as overhead instead of direct job costs
Permits, dumpsters, portable toilets, temporary power, job site storage containers, final cleaning — these are direct project expenses. They happen on a specific job. They're paid for a specific job. But in most construction company books, they live in overhead accounts: "Office Expense," "Miscellaneous," or simply "Overhead." They get spread across all jobs equally through the overhead rate instead of being assigned to the job that incurred them.
This creates two problems. First, your overhead rate is inflated by costs that aren't really overhead — they're direct costs that should be in your job budget. Second, jobs that incur high indirect costs (permits for a complex addition, multiple dumpster pulls on a demo-heavy remodel) look artificially better than they are, while simpler jobs look worse.
The correction is straightforward: create cost codes for indirect project costs and allocate them by job. "07 — General Conditions — Permits," "07 — General Conditions — Waste Disposal," "07 — General Conditions — Temporary Utilities." Include these codes in your estimates. When the actual costs come in, allocate them to the job.
In my experience, builders who reallocate indirect project costs from overhead to job-level codes typically see their overhead rate drop 3–6 percentage points and their average job profitability variance improve by 4–8%. The money didn't appear from nowhere — it just became visible where it actually lived.
The Timing Problems That Let Overruns Hide Until It's Too Late
The first two categories of mistakes are about what goes into your job cost system and where. This third category is about when you look at it — and what you're looking at when you do. The timing of cost review is what separates builders who catch overruns while there's still time to adjust from builders who discover them at the closeout meeting.
Mistake 5: Reviewing job costs only at close
The most dangerous habit in construction financial management is treating job cost review as a post-mortem activity. "We'll see how we did when the job is done." By the time a job closes, every budget decision has been made. Every subcontractor has been paid or owes a final invoice. The client is in possession. There's nothing to adjust. The review tells you what happened — it doesn't give you the opportunity to change the outcome.
The builders who consistently hit their margin targets review job costs weekly. They're looking at three numbers for each active job: (1) what was budgeted, (2) what has been committed (signed subcontractor agreements, approved purchase orders), and (3) what has actually been invoiced and entered. The gap between committed costs and budgeted costs is where overruns live before they're real — and it's the only window where you can act on them.
Here's what acting on them looks like in practice. On a kitchen remodel budgeted at $187,000 in direct costs, you're at the rough-in phase and your committed costs already total $181,000 — $6,000 above budget, with finish carpentry, fixtures, painting, and final cleaning still ahead. That's visible at week 4 of an 8-week project. You can have an honest conversation with the client about a scope item that's running over. You can negotiate differently with the finish trades. All of those options exist at week 4. None of them exist at week 9, when the job is done and the $6,000 overrun is simply a loss.
Mistake 6: Confusing "costs entered" with "costs committed"
The final timing mistake is technically nuanced but practically significant: treating "costs entered in the system" as the same thing as "costs committed to the job."
Here's why it matters. Your framing sub signs a contract for $68,000. That contract is signed on day one of framing. But the invoice doesn't arrive until week 6. If your job cost report only shows costs that have been invoiced and entered, your job looks $68,000 better than it actually is for five weeks. You look at the report on week 3 and see $42,000 of costs on a job where you've actually committed to $110,000 in signed subcontractor agreements. The job appears 32% complete at cost. It's actually 52% committed.
This distinction — committed costs versus invoiced costs — is what makes WIP (Work-in-Progress) accounting valuable and why properly configured job cost software tracks both. In JobTread, a signed subcontractor agreement or approved purchase order creates a committed cost entry even before the invoice arrives. In QuickBooks without a proper job cost workflow, only the posted invoice creates an entry. Builders who rely on QuickBooks alone for job costing are systematically seeing an incomplete picture of where each job actually stands.
The Cost Commitment Gap on a Real Job
A $2.1M builder I worked with in Texas was reviewing his job cost reports weekly — which was good. But he was pulling them from QuickBooks, which only showed invoiced and entered costs. On his largest active project ($680,000 contract), the QuickBooks report showed $312,000 in costs at the halfway point. His actual committed costs — subcontractor agreements plus approved POs — were $487,000. The job wasn't 46% complete at cost. It was 72% committed. He had $193,000 of expected cost that his report wasn't showing him. Moving his job cost review to JobTread's committed cost view changed how he managed every project after that.
The diagnostic question that surfaces all six mistakes
There's one question I ask every builder at the start of an engagement that quickly reveals which of these mistakes are present: "Pull up your most recently completed project and show me the actual margin versus estimated margin, broken down by phase, including your own time and all general conditions costs, using committed costs as of three weeks before close."
Almost no one can answer it. Not because the information doesn't exist — but because the tracking system isn't set up to produce it. Fix the coding structure (Mistakes 1–2), add the missing cost categories (Mistakes 3–4), and shift to committed-cost weekly review (Mistakes 5–6), and you can answer that question for every active job, every week. That's the level of visibility where margin management becomes a real-time activity instead of a forensic one.
Find Out Which Job Costing Gaps Are Costing You
Take the JobTread Pathfinder diagnostic to identify exactly which tracking mistakes are eroding your margins — and get a prioritized fix list specific to your operation.
Take the JobTread Pathfinder Quiz →Frequently Asked Questions
The most common job costing mistake is lumping subcontractor and supplier invoices under broad cost codes like 'Subcontractors' or 'Materials' instead of allocating them by phase. This makes it impossible to compare actual costs to estimates by trade or phase, so overruns are invisible until the job closes. The second most common mistake is reviewing job costs only at the end of a project instead of weekly during execution — by the time you see the overrun at close, there's nothing left to do about it.
Job cost reports don't match estimates when the cost code structure and the estimate line items use different categories. If your estimate has 'Framing Labor' and 'Framing Materials' as separate lines but your cost codes combine them into 'Framing,' the comparison requires manual reconciliation and produces fuzzy results. The fix is building your estimate template and cost code structure from the same hierarchy — so every invoice maps to a code that has a corresponding estimate line and variance is calculated automatically.
Yes. Owner and supervisor time spent on active jobs is a direct project cost, even if you're not writing yourself a separate check for each job. If you spend 30 hours on a project and your burdened rate is $90/hour, that's $2,700 of real cost that should appear on the job cost report. Leaving it out makes jobs where you're heavily involved look artificially profitable — and leads to systematic under-pricing of your most complex work.
Committed costs are expenses you've contractually agreed to pay — signed subcontractor agreements, approved purchase orders — even if the invoice hasn't arrived yet. Actual (or posted) costs are expenses that have been invoiced and entered in your system. The gap between them can be substantial: a signed framing contract for $68,000 is a committed cost from day one of framing, but it may not appear as an actual cost until the invoice arrives 4–6 weeks later. Job cost reports that only show actual costs systematically understate where a job stands financially.
Weekly, at minimum. Monthly job cost review is not frequent enough to catch overruns while there's still time to address them. Block 30 minutes per week to review all active jobs: budgeted vs. committed vs. actual for each phase, with any variance over 5% flagged. The builders who consistently hit their margins treat job cost review as an ongoing management function, not an end-of-project activity.