Skip to main content
2,200+ service businesses benchmarked. How do your margins stack up? See where you stand →
Level
Pillar guide

Job Costing for Contractors

91% of jobs in our dataset have revenue logged but no cost data attached. That's why owners feel busy but unprofitable — the math literally isn't there. This guide is the full playbook on what real job costing looks like, what good benchmarks are, and the 90-day fix.

91%

of jobs in our dataset have revenue but no cost data

100 pts

spread between bottom-decile and top-decile gross margin

1%

of jobs (80–200 hrs) generate 49% of contractor revenue

What job costing actually is — and what it isn't

Job costing is the practice of allocating every dollar of cost — labor, materials, equipment, subcontractors, overhead — to the specific job that consumed it. The output is one number per job: gross margin. The input is a process most contractors never finish setting up.

Most contractors think they have job costing because their FSM tracks job revenue. They don't. Revenue is half the equation. Without cost allocation tied to the same job, you have a revenue ledger and a payroll ledger, but no margin.

The takeaway: If you can't pull a list of every job last month with revenue, cost, and margin in three columns, you don't have job costing. You have a revenue report.

The 91% problem: most jobs have no cost data attached

Across 2,200+ contractors and 3.84M jobs in our dataset, 91% of jobs have revenue logged but no labor, material, or subcontractor cost coded to the same job. The costs exist — they're in payroll runs and AP invoices — but they're not allocated.

This is the silent killer of contractor profitability. Profitable jobs subsidize unprofitable ones, the owner sees a healthy company-level P&L, and individual losers stay invisible until cash gets tight.

The fix starts with operational discipline — every timesheet codes to a job, every PO references a job, every receipt gets allocated — but it requires accounting to mirror the field. Most contractors stop at one of those two halves.

What good looks like: percentile benchmarks

Among the 9% of jobs that DO have cost data attached, gross margins distribute normally between 20% and 50% — exactly what CFMA benchmarks predict for the trades. By trade we see medians around 38% gross margin for HVAC, plumbing, and mechanical, with electrical slightly lower at ~35% and roofing closer to 30%.

Top quartile contractors run 50%+ gross margins on a blended book. Bottom quartile sits below 20% and often doesn't realize it because the company-level P&L looks fine.

The spread between bottom and top decile is 100 points across our sample. That spread is what cost visibility unlocks — not pricing alone, but the ability to see which jobs are killing you and re-bid them.

Get the next one

Get next week's benchmark by email

Real numbers from 2,200+ service businesses. One email a week.

The small-jobs trap: where margin blindness compounds

1% of jobs (in the 80–200 hour range) generate 49% of revenue across our dataset. The other 99% — 767K service calls under 4 hours — generate just 8% of revenue but consume more than half the operational complexity.

Most cost tracking discipline gets applied to the big jobs. The small ones get bucketed, billed, and forgotten. If even 20% of those small jobs run at a loss, that's $140M in revenue subsidizing losses across the dataset — and nobody can see it.

The fix isn't to chase a perfect time sheet on every $200 service call. It's to use job-type averages from the jobs you DO track to flag the ones that look out of pattern. A $300 job that took 6 hours and used $150 in parts isn't profitable — but it'll never get flagged unless you're building the average and comparing.

Fixing the process: the 90-day playbook

  • Audit your last 90 days of completed jobs. Pull every job with revenue and check whether labor cost, material cost, and subcontractor cost are coded to that job. Compute the percentage. If it's under 80%, the problem is operational, not accounting.
  • Set a rule: every timesheet codes to a job, every PO references a job, every credit-card receipt gets allocated within 7 days. No exceptions. The exceptions are where margin disappears.
  • Pick a job-type taxonomy you can actually maintain. Five categories beat fifty. PM, callback, install, T&M project, change order is enough for most service contractors.
  • Build the weekly report: every job completed last week with revenue, cost, and margin. Sort by margin descending. The bottom 10% is your re-bid list, your scope-creep list, or your customer-fire list.
  • Reconcile monthly. The job-level P&L should sum to the company P&L within rounding. If it doesn't, something is unallocated and your numbers are wrong.

The takeaway: You don't need new software. Most contractors with broken job costing have ServiceTitan, BuildOps, or QuickBooks Projects already configured. They just don't have a closed loop between field, ops, and accounting.

When DIY stops working

Job costing is the kind of problem where the cost of getting it wrong scales with revenue. A $1M contractor with broken job costing has $50–$100K of margin hidden somewhere. A $20M contractor with the same broken process has $1–$2M in compounded blind spots and probably can't sell the business at a fair multiple.

If you've tried to fix this internally twice and it didn't stick, the issue isn't your team — it's that the gap between operations and accounting needs someone whose job is to bridge them. That's what a real CFO accelerated by AI is for.

Use the data yourself

Frequently asked

What's the difference between job costing and project accounting?

Project accounting is the accounting treatment of long-running construction projects (WIP schedules, percentage-of-completion revenue recognition, retainage, AIA billing). Job costing is the operational practice of allocating every dollar of cost to the job that incurred it. You can have job costing without project accounting if your work is short-cycle service. You cannot have project accounting without job costing because the WIP schedule depends on accurate job-level costs.

Can QuickBooks Online do real job costing for contractors?

It can, with caveats. QBO Projects supports job-level revenue and cost tracking, but it doesn't handle progress billing, retainage, or AIA G702/G703 forms natively. For service contractors under $5M, properly configured QBO Projects plus a strong FSM is usually enough. For commercial contractors over $5–10M with project work, you typically outgrow QBO and need Sage Intacct, Spectrum, or similar.

How often should I review job-level margin?

Weekly for completed jobs (so you catch the losers before next quote uses the same assumptions). Monthly for trends by job type and customer (so you catch the patterns). Quarterly for repricing decisions and customer-fire calls.

What gross margin should we target?

It depends on trade and mix. For service-heavy HVAC, plumbing, and mechanical contractors, 38–45% gross margin is the median range, with top-quartile operators at 50%+. Electrical tends to run 35–42%. Roofing 28–35%. These are blended numbers — service work typically runs 10–15 points higher than install work, so a service-heavy book should beat the median.

Find out which jobs are actually making money.

We connect to your books and rank every job by real margin — not what your software shows. Free audit included.

2,200+ service businesses benchmarked$13.25B in revenue analyzed24-hour response

No credit card. 30-min audit. We only follow up if we can actually help.

No commitment. Real numbers, not generic advice.