How to Read a Contractor P&L
The benchmark numbers are only useful if you can compute your own. This is a fully worked, representative $6M HVAC contractor P&L with the exact math behind every metric, job margin, WIP, labor variance, collection rate, and quote conversion. Representative company, real method. Re-run it on your own books.
Illustrative annual P&L, $6M HVAC contractor
Anchored to contractor-median cost structure. Every downstream computation below traces back to these lines.
| Line | Amount | % of revenue | Note |
|---|---|---|---|
| Revenue | $6,000,000 | 100.0% | Service + install + service agreements |
| Direct labor (loaded) | $1,740,000 | 29.0% | At contractor median labor share of ~29% |
| Materials | $1,980,000 | 33.0% | Median materials share ~33% |
| Equipment + subs | $600,000 | 10.0% | |
| Total cost of revenue | $4,320,000 | 72.0% | |
| Gross profit | $1,680,000 | 28.0% | Company-wide GM, below the 44.3% job median because of overruns |
| Overhead (SG&A) | $1,140,000 | 19.0% | |
| Operating profit | $540,000 | 9.0% |
The math behind each metric
Every formula, worked on the numbers above. Reproducible by construction.
Job gross margin
(Revenue − Direct cost) ÷ Revenue
One job billed $18,000 with $10,260 direct cost → ($18,000 − $10,260) ÷ $18,000 = 43%. That's right at the contractor median (44.3%). Company-wide GM lands lower (28%) because the loss-making minority of jobs drags the blended number down.
Labor-hour variance
Actual hours ÷ Budgeted hours
A job budgeted at 80 hours used 100 → 125% of budget (one of the 40% of jobs that go over). The extra 20 hours at a $65 loaded rate = $1,300 of margin erased on that job alone.
WIP / underbilling
Earned revenue − Billed revenue, where Earned = Contract × % complete
A $400,000 project 60% complete has earned $240,000. If only $200,000 was billed, $40,000 sits in underbilled WIP, work done, cash not yet requested.
Collection rate
Cash collected ÷ Amount billed
Bill $6,000,000, collect $5,106,000 → 85.1% (the contractor median). Closing the gap to a 94% target would free roughly $530,000 of cash currently stuck in AR.
Quote conversion
Won ÷ (Won + Lost) vs Won ÷ All quotes issued
Of decided quotes, 74% convert (near the 73.9% median). But counting every quote issued, including the ones that never got a decision, only ~38% turn into revenue. The other 62% was estimating effort that earned nothing.
Related Reading
Frequently Asked Questions
How do you calculate gross margin on a contractor job?
Job gross margin = (job revenue minus job cost) divided by job revenue. Job cost includes direct labor at fully-loaded rates, materials, equipment, and subcontractors, not overhead. In the worked example below, a job billed at $18,000 with $10,260 of direct cost has a gross margin of ($18,000 - $10,260) / $18,000 = 43%, right at the contractor median of 44.3%. The mistake most owners make is leaving unbilled labor or under-applied burden out of job cost, which overstates margin.
How is WIP (work-in-process) calculated for a contractor?
For a job billed on percentage-of-completion, earned revenue = total contract value multiplied by percent complete (costs incurred to date divided by total estimated cost). WIP is the difference between earned revenue and what you've actually billed. Underbilling means you've done more work than you've invoiced, cash you're owed but haven't asked for. In the example, a $400,000 project 60% complete has earned $240,000; if only $200,000 was billed, $40,000 sits in underbilled WIP.
What is labor-hour variance and why does it matter?
Labor-hour variance = actual hours divided by budgeted hours for a job. At 100% you're on budget. The contractor data shows 40% of jobs exceed their budget and 18% run past 150%. Because the hours were sold at a fixed price, every over-budget hour comes straight out of gross margin. In the worked example, a job budgeted at 80 hours that used 100 ran at 125%, the extra 20 hours at a $65 loaded rate erased $1,300 of margin.
Is this a real company, and can I trust the math?
It is a representative $6M HVAC contractor, a composite built from real patterns across Level's contractor research, with no single company named. The method and the benchmark ranges it is anchored to are real (contractor median gross margin 44.3%, collection rate 85.1%, and so on, from Level's contractor research). The point is reproducibility: every figure is computed from the line items shown, so you can re-run the same math on your own books and see where you land.
From clients
What contractors say after working with us.
“Thought we were running 22% net. Real number was 11 once Sam allocated overhead correctly across labor and materials. Painful conversation but I needed it. We've been repricing every job since.”
“We had 40 service contracts and no idea which ones actually made money once you included drive time and callbacks. Sam ran the analysis, three of our biggest were underwater. Repriced or dropped them, net margin went from 8% to 14% in one quarter.”
“My CPA is great at taxes but nobody was looking at the actual business. Sam found $140K in overhead we were eating on service calls because our flat rates were 3 years out of date. Repriced the menu in 30 days. The pricing fix alone covers his fee for years.”
Simple pricing
Three tiers, one ladder.
$99-$500/mo
Bookkeeping
The clean data layer: monthly books, reconciliations, and organized financials AI can work with.
$1,500-$5,000/mo
Scale
The full AI operating layer: custom agents, weekly actions, and benchmarks to grow margin per hour.
Custom
Platform / Multi-Office
Multi-branch benchmarking and scorecards for PE-backed and multi-location groups.
Want this run on your actual books?
We'll compute your job margin, WIP, labor variance, and collection rate the same way, and show you where the money leaks. Free audit included.
No commitment. Real numbers, not generic advice.