The Contractor's Guide to Job Costing (Without an Accountant)
Most contractors know their revenue per job. Half know their gross margin. Almost none know their true margin after labor allocation, equipment depreciation, truck fuel, and the hour their estimator spent re-bidding a change order on a Sunday. The gap between gross margin and true margin is where contractors who think they're making 30% find out they're making 11%.
What job costing actually requires
You don't need an accountant. You need three categories tracked per job:
- Direct material — every receipt, tied to a job number.
- Direct labor — every payroll hour, tied to a job number, at the loaded labor rate (wage + 28-35% burden for taxes, comp, benefits).
- Direct overhead — sub costs, permit fees, equipment rental, dump fees.
That's it. Everything else (truck, tools, office, owner draw) lives in indirect overhead and gets covered by the markup.
The setup
Three columns in whatever bookkeeping software you already have (QuickBooks, Wave, Xero, a spreadsheet — the tool doesn't matter):
- Job Number — sequential, one per project. JOB-2024-001.
- Category — Material, Labor, Subs, Permits, Equipment, Other.
- Amount + Date.
Train the crew to write the job number on every receipt. Train the office to enter the receipt against the job number, not against "Cost of Goods Sold" generic. Two weeks of habit and you have data.
The three reports
Once the data is flowing, three reports answer every question worth asking:
Job P&L. For every closed job: revenue minus direct costs equals gross margin. Sort by gross margin %. The bottom 20% of jobs is where you're leaking money. Pattern-match them. Same crew? Same trade? Same customer? The fix is usually obvious once the data is in one place.
Trade-mix P&L. Aggregate gross margin by trade. Maybe roofing makes 38% and kitchen remodel makes 22%. That's a sales-team conversation, not a bidding conversation. The contractor who knows this stops bidding the 22% scope as aggressively.
Customer P&L. Aggregate gross margin by customer. Repeat customers usually run higher margin because the trust premium reduces the time-to-bid and the change-order friction. The contractor who knows this stops chasing first-time customers and starts re-engaging the third-time customer.
Where most contractors leak
Three categories where the leak is usually obvious in the data:
- Crew labor on change orders. The change order added $1,500 of material and 8 hours of work. The bid covered the material. The 8 hours got eaten because the contractor "rounded down."
- Equipment rental. The mini-excavator rental for a 3-day job ran 5 days. Nobody updated the job costing. The bid covered 3 days.
- Markup on subs. The drywall sub charged $4,200 and the contractor billed the customer $4,200. No markup on the sub means no margin on the sub. Add 15% minimum.
How Estimate.Pro handles it
The bid review pass inside Estimate.Pro carries forward the assumed labor hours, material cost, and sub markup into the job. Once a job closes, the actuals get tagged against the bid — the contractor sees variance per category in one click. The pattern that took six months to spot in a paper P&L shows up in week two on the Estimate.Pro dashboard.
The bottom line
Job costing isn't an accounting exercise. It's a survival mechanism. The contractor who knows their true margin per job sets their bidding floor with data instead of optimism.