Skip to main content
2,200+ contractors in the research universe benchmarked. Do you know your gross profit per labor hour? See where you stand →
Level
Job Costing

Why You Don't Know Your Real Job Margin

Sam YangEx-CFO across trades, SaaS & services · $2.5B in total PE/banking transactions · Stanford MBA
Updated October 7, 2026·Originally published September 30, 2025·12 minute read
Share

From Level's proprietary contractor research

Revenue-only job reports create "phantom margins." Your P&L can look fine while individual jobs lose money invisibly.

2,200+ contractors analyzed across HVAC, plumbing, electrical, mechanical

12 minute readJob Costing

If this is you

Fictional example: You quoted and billed $48K. The job report shows $39K of cost, so you think you made $9K. Then you find 160 technician hours never coded to the job ($8K at an assumed $50 loaded cost per hour), $3K of van-stock materials posted to general materials expense, and a $2K sub invoice paid through AP but never linked. That is $13K of missing direct cost, so the job's gross profit is negative $4K, before any overhead. This is what happens when job costs are not attached to the work that created revenue.

The short answer

Revenue-only job reports create phantom margin because costs are never coded to the job. Across 1,747,089 completed jobs from 1,791 companies with job-level cost, Level measured a 44.3% median gross margin. Your P&L can look fine while individual jobs lose money invisibly.

Key takeaways

  • The measured margin distribution is broad: p10 is 10.8%, p25 is 28.4%, median is 44.3%, p75 is 60.2%, and p90 is 75.1%.
  • Cost tracking breaks at three points: labor hours not tagged to jobs, materials not assigned, and subcontractor invoices that never link back.
  • Flying blind causes three expensive outcomes: underpricing complex work, missing your most profitable service lines, and rewarding volume over margin.
  • Quick self-check: if more than half your jobs show 70%+ margins, or none show losses, inspect cost completeness. This is a review trigger, not proof of missing cost.

The Phantom Margin Problem

Here is the job-costing test every contractor should use: across 1,747,089 completed jobs from 1,791 companies with job-level cost, Level measured a 44.3% median gross margin. A report that cannot tie labor, materials, and subcontractor costs to the same work cannot make that comparison.

That is the benchmark, not a claim that every contractor sees that result. A job report becomes misleading when labor, materials, or subcontractor cost is not assigned to the work that produced the revenue. A $10,000 job with zero recorded direct cost can show a 100% margin on screen while the payroll and vendor costs sit elsewhere in the P&L.

What Real Margins Look Like

Among 1,747,089 completed jobs from 1,791 companies with revenue and actual cost, the margin distribution is broad:

PercentileJob gross marginWhat it means
P1010.8%Thin enough that overhead, rework, or a collection miss can erase the remaining profit.
P2528.4%A useful early warning band for underpriced or under-costed work.
Median44.3%The middle measured completed job, across the Level cohort.
P7560.2%Strong direct-margin result. Check whether it holds after every direct cost is assigned.
P9075.1%High result, worth validating against labor, material, and subcontractor completeness.

6.2% of measured completed jobs lost money, and 16% came in below 20% gross margin. The point is not that every contractor should target one universal percentage. The point is that a report with no low-margin work, or with a suspiciously tight 80% to 100% band, needs a cost-assignment check. The margin picture gets even murkier when you break it down by job size: short service calls can make up a large share of job count while carrying a much smaller share of revenue, and they add operational complexity. Job size on that page is grouped by logged hours and the published shares describe job count, so check your own revenue split by size before drawing conclusions.

Why This Happens

Cost tracking can break at three levels. Check each independently rather than assuming every contractor has all three.

1. Labor Isn't Tagged to Jobs

Start with labor because the payroll outflow is identifiable. Technicians show up, do the work, get paid, but their hours aren't allocated to the specific job in the system. The payroll goes out, the revenue comes in, and the job shows revenue with no labor cost.

Level's measured labor-hours comparison covers 315,393 jobs from 1,391 companies that recorded both budgeted and actual hours. Actual hours divided by budgeted hours had a median of 99.4%, a mean of 119%, and a p75 of 131.1%. 40% of those jobs ran over budget, and 18.3% ran past 150% of budget. That is an hours ratio per job, not a dollar cost or a profit ranking, and jobs with no hour budget are excluded. When a job runs far past its hour budget, check three distinct causes: the estimate was wrong, the scope changed without a change order, or hours from other jobs were coded here. If hours are never coded to jobs at all, none of this is visible.

2. Materials Aren't Assigned to Jobs

Parts come off the truck. Materials get ordered from the supply house. The PO goes against the vendor account, but nobody tags it to the job number. At month-end, the P&L shows $80K in materials expense across the company. But which jobs consumed those materials? Unknown.

This is especially common with HVAC contractors running service work. The tech uses a capacitor from their van stock, installs it, bills the customer $180, but the $40 cost of the part sits in general inventory expense. If the tech's hours also went uncoded, the job shows 100% margin. Even with labor coded, the missing $40 overstates the job's margin by about 22 points on $180 of revenue ($40 / $180). The company's overall margin tells a different story.

3. Subcontractor Costs Disappear

Subcontractor-heavy general and mechanical jobs need a separate completeness check. The sub invoices come in, get paid through AP, but never get linked back to the job. Revenue of $50K, sub costs of $35K that aren't visible at the job level. On paper, a home run. In reality, a 30% margin job that barely covers overhead.

Free benchmark review

See how your margins benchmark.

Start with a free conversation about your priorities. With agreed access to the relevant records, we compare your numbers with applicable benchmarks and identify what to review first.

The Real Cost of Flying Blind

When you don't know your real job margins, three things happen, all of them expensive:

You underprice your most complex work. If your estimating team thinks jobs run at 60% margins (because that's what the dashboard shows), they'll bid aggressively. But if real margins are 30%, every job you win at "competitive" pricing is eroding your bottom line.

You can't identify your most profitable service lines. Maybe your planned maintenance contracts run at 45% margins while your project work runs at 15%. Without job-level cost tracking, you can't see this split. You treat all revenue as equal when it's not even close.

You reward the wrong behavior. If you incentivize your team on revenue and don't track margins, you're encouraging them to chase volume at any price. The salesperson who brings in a $500K job at 8% margin gets celebrated. The one who brings in a $200K job at 40% margin gets ignored. Meanwhile, the second deal generated more gross profit.

How to Tell If You Have This Problem

Run this check right now in your QuickBooks or accounting system:

  1. Pull a job profitability report for the last 12 months
  2. Sort by gross margin, highest to lowest
  3. Count how many jobs show margins above 70%

If more than half your jobs show 70%+ margins, check cost completeness before celebrating. This is a screening rule, not a validated diagnosis; job mix and pricing can also explain high margins. Real 70%+ margins happen on some service calls and T&M work, but they shouldn't be your default.

Also look at the other end: if you have zero jobs showing negative margins or margins below 15%, that's another red flag. Warranty work, callbacks and misquoted projects can explain losses. If none appear, check whether they were excluded, grouped into another job or coded outside the job ledger. A loss-free sample alone does not prove a recording error.

What Good Looks Like

Practices that make job cost data usable:

They tag every transaction. Labor time, materials, subcontractor bills, everything gets a job number. This is table stakes. If your field service software doesn't enforce job coding on time entries, fix that first.

They review job margins weekly, not quarterly. Monthly is too slow to catch a job going sideways. Weekly reviews let you see cost overruns while there's still time to adjust scope or flag the customer.

They budget before the job starts. In the measured labor-hours data above, the median job landed close to its hour budget (99.4%) while a long tail ran well past it. You can't be under or over budget if you never set a budget. As a starting planning threshold, give every job above $5K budgeted labor hours and materials cost before work starts, then adjust the threshold to your job mix.

They separate labor from materials from subs. Aggregate cost data is almost useless. You need to know that the labor ran $8K over budget while materials came in $2K under. That tells you where to investigate. Extra hours can reflect changed scope, rework, a weak estimate or miscoding; they do not prove the crew was slow. A parts price or quantity variance needs a different check.

When Phantom Margins Don't Matter

A few honest caveats:

Under $1M in revenue, formal job costing can create more overhead than it's worth. If you're running 3-5 techs and can reliably see profitability per job, a full tracking build may not pay back. Focus on pricing and utilization first, and keep simple job coding on time and materials.

Pure T&M work gives you a billing trail, but the invoice is a price record, not a cost report. Match billed hours with paid hours and loaded labor cost, and parts sold with actual acquisition cost. Travel, callbacks, overtime, consumables and discounts can still create phantom margin. Fixed-price projects add estimate-to-complete risk.

If you're already tracking costs and your job margins genuinely run above 60.2%, that is above the p75 of measured completed jobs. A 50% margin is above the 44.3% median but below p75. These are job-level percentiles, not a company ranking. Just make sure you've checked your collection rate too, because high margins with low collection is a different kind of expensive.


The Bottom Line

A CFO Cannot Save Bad Unit Economics

Finance can show that a job type, customer exception, crew pattern, or service line destroys contribution margin. It cannot make the owner reprice the work, stop accepting the exception, correct rework, or change the mix.

That is the dividing line between visibility and value. A useful CFO engagement creates a decision while there is still time to affect the result. If the owner wants confirmation but will not change how work is sold or delivered, the analysis becomes an expensive description of the problem. Read why a fractional CFO may not fix the business before buying more reporting.

If costs aren't tagged to jobs, you can't see your real job margins, even though the data exists in payroll and AP. When you fix that, when every hour, every part, every sub invoice lands against the right job number, the dashboard stops lying to you.

In Level's measured cohort, the middle half of completed jobs ran between 28.4% and 60.2% gross margin. A report missing direct costs can show 80-100% margins. Your own range depends on trade, job mix, and cost completeness. Knowing the real number isn't demoralizing. It's the first step toward fixing the jobs that shouldn't be done at any price, repricing the ones that are too thin, and doubling down on the ones that actually make money.

Q: How does Level help with job cost tracking? A: We work from your QuickBooks and field service data (for example ServiceTitan, Jobber, or Housecall Pro) and map transactions to jobs where the source records carry enough detail to do it. For contractors with existing data, our first step is a profitability audit that shows margins by job, service line, and customer, and flags where cost is missing. The result can look very different from the dashboard. The first audit is free.

Q: How long does it take to fix? A: As an illustrative planning assumption, not a measured average, plan on 2-4 weeks of process changes to get job cost data flowing, and 30-60 days of consistent reinforcement before tagging becomes habit. Track progress with one number: the share of payroll hours and AP dollars coded to a job each week. Once that share is high and stable, the job reports become decision-grade.

Q: What if my margins really are high? A: If your margins are genuinely above 50% after proper cost allocation, you're above the measured job median. But verify that labor burden (benefits, workers comp, payroll taxes) is included in your job costs. Burden varies by company, and 25-35% of base pay is an illustrative planning range, not a measured figure. Fictional example: revenue $100, base labor $40 and materials $5, so the report shows a 55% margin. Adding 30% burden on $40 of labor adds $12 of cost, and margin drops to 43%. Count burden once. If your labor rate is already loaded, adding it again double-counts it.

Share

Get the next one

Want next week's benchmark in your inbox?

One email a week. Real numbers from 2,200+ contractors in the research universe. No fluff. Unsubscribe anytime.

Sam Yang

About the author

Sam Yang

Founder & CEO

Founder of Level, the always-on finance team for contractors, service businesses, and ecommerce brands. Ex-CFO across trades, SaaS, and service businesses. 4 years as Director of Growth Product at BuildOps, building financial tooling used by 1,000+ commercial contractors. Four years in PE and investment banking rolling up and acquiring service businesses, $2.5B in total transactions including M&A and IPOs. Stanford MBA, Brown undergrad. The Level founding team's analysis of 2,200+ contractors ($13.25B in job revenue) across operating, private-equity, and CFO roles anchors the Level Index benchmark research.

LinkedIn

See how your margins benchmark.

Start with a free conversation about your priorities. With agreed access to the relevant records, we compare your numbers with applicable benchmarks and identify what to review first.

2,200+ businesses benchmarked$13.25B in revenue analyzedWeekly action cadence

No credit card. Start with a 15-min call. We only follow up if we can actually help.

No commitment. Real numbers, not generic advice.