Job cost accounting answers the only question that actually matters in this business: did this project make money? Not the company overall, this specific job.
Standard accounting runs on the calendar: revenue and expenses by month, quarter, year. Job cost accounting runs on the project: costs and revenue tied to a specific job, tracked against a specific estimate. That distinction matters because your overall profitability is just the sum of how each individual job performed, and that number can swing wildly from one project to the next even at the same size and scope.
What getting it wrong actually costs
Bad job cost data doesn't just look bad, it compounds. Every future estimate gets built on the last job's numbers, so if those numbers were wrong, the next bid is wrong too. Estimating mistakes cost roughly 3% in profit on otherwise successful bids, a real hit when the industry's average net margin is already 5-6%. And it hides problems on live jobs: a project that looks on-budget based on last month's data might already be over budget on costs that just haven't been entered yet.
Setting up a cost code system that doesn't get ignored
Every transaction gets coded to a job and a cost code, together telling you what was spent, where, and why. The standard starting point is CSI MasterFormat, a numbering system organized by trade division that most subs customize down for their own work.
The failure mode runs in both directions: too many cost codes and field crews stop filling them out accurately, too few and the reports don't tell you anything useful. Most specialty trade subs land somewhere around 8-15 cost codes per job type. Break direct costs into labor, materials, equipment, and sub-tier subcontractor costs if you use them. Break indirect costs into supervision, small tools, temp facilities, cleanup, and punch list. Then pick one method for allocating overhead across jobs and stick with it.
Build every estimate on the same cost codes as your accounting system. That's the single most valuable feedback loop in construction finance: when the categories match, a PM can see in real time that labor is running 12% over on rough-in while materials are 5% under on fixtures. When they don't match, estimate-to-actual comparisons require manual translation that, in practice, usually just doesn't happen.
Getting costs in the system before they're stale
The value of job cost data depends entirely on how fast it gets recorded. Batching receipts and timesheets for a Friday data-entry session is one of the most common sources of bad job costing, because by Friday the problem the data would have flagged already happened.
Digital time tracking lets field workers log hours against a job from their phone instead of a handwritten timesheet transcribed days later. Receipt capture photographs and extracts data from material tickets at the point of purchase. Automated invoice processing codes vendor invoices to the right job as they arrive instead of sitting in a stack. The goal in all three cases is the same: shrink the gap between when the cost happens and when it shows up in the system.
AI-powered platforms like Cru take this further by learning the pattern instead of requiring someone to code every transaction by hand: recognizing that invoices from a specific vendor always hit materials, or that a specific employee always works the same project. The practical win isn't just speed, it's that the system doesn't forget, doesn't miskey a job number, and doesn't defer entry to "later this week."
Reading a WIP report without guessing
The Work-in-Progress report is the most important document a subcontractor produces. It compares contract value, costs incurred to date, and estimated cost to complete, and from those three numbers tells you whether you're overbilled or underbilled on a job.
Overbilled means you've billed ahead of actual progress, a short-term cash cushion that becomes a liability the moment you have to finish work you already got paid for. Underbilled means you've done more work than you've billed for, which is a receivable you still need to collect. Banks, bonding companies, and lenders all read WIP reports to gauge financial health, and a rising overbilling trend across multiple jobs is usually the first visible sign that future cash is quietly funding current operations.
Beyond WIP, the same cost code data supports gross margin by project (watch the trend more than the current number), cost code variance analysis (a labor overrun on one task type across multiple jobs usually points to an estimating error, not bad luck on one crew), and earned value analysis for a sharper read than a simple budget-versus-actual line.
A useful habit: a formal cost review at 25%, 50%, and 75% completion on every job, comparing actual to estimate and updating the cost-to-complete number each time. And when a job closes, capture actual production rates and material waste percentages while they're still fresh. That data is what makes next year's bids more accurate than this year's.
TL;DR
- Job costing tracks money by project, not by calendar month, because construction profitability lives at the job level.
- Estimating errors cost roughly 3% of profit on a business already running 5-6% margins.
- Match your estimate's cost codes to your accounting system's cost codes, or estimate-vs-actual comparisons quietly stop happening.
- Shrink the gap between when a cost happens and when it's recorded. That gap is where most bad job cost data comes from.
- Review cost data at 25/50/75% completion, and mine every closeout for data that improves the next bid.
See how Cru's Job Costing Agent codes and flags variances in real time →
Sources
Ready to automate your job cost tracking? Explore Cru — AI-powered job cost accounting built specifically for construction subcontractors.
.jpg)