Why You're Busy But Not Making Money

The Most Common Call I Get
It usually starts with some version of the same sentence: "We had our best revenue year ever. I don't know where the money went."
I've heard this from more $2-8M contractors than I can count. The phones are ringing. The trucks are rolling. The crew is working six days a week. And at the end of the year, there's almost nothing left. Sometimes they're writing a check to the IRS. Sometimes they're drawing on their line of credit in December to make payroll. On paper, they're a $5M business. In their bank account, it doesn't feel like it.
This isn't bad luck. It's five specific profit leaks — each one invisible in isolation, devastating in combination. And the compounding effect is what catches contractors off guard. You can be growing your top line at 15% per year while your net margin quietly erodes from 11% to 4%. You're technically bigger and technically poorer.
Let me walk through exactly what's happening, using a realistic $5M HVAC contractor as the example.
The Baseline: What a $5M Contractor Should Look Like
Before we get into the leaks, let's set the benchmark. From reviewing 2,200+ contractor financials, a well-run $5M contractor should look roughly like this:
- Gross margin: 40-45% ($2.0-2.25M)
- Overhead: 28-32% of revenue ($1.4-1.6M)
- Net profit: 10-12% ($500-600K)
That's not a stretch goal — that's median performance for companies that track their numbers. The contractors coming to me who feel cash-poor are often running 4-6% net margins. On $5M, that's $200-300K instead of $500-600K. The difference — $300K annually — is entirely explainable when you find the leaks.
Leak 1: Overhead Creep
Revenue went up 30% over two years. Headcount went up 40%.
This is the most common pattern I see in growing contractors. You add a truck because you're turning away work. Then you hire a CSR because the phones are overwhelming. Then you bring on an office manager because the CSR is drowning. Each hire makes sense in isolation. In aggregate, you've added $300K in fixed overhead without a proportional increase in billable labor.
The math turns brutal fast. If your overhead was $1.0M on $4M of revenue (25%), and you've grown to $5M while overhead has grown to $1.45M (29%), you've given back almost half your revenue growth in fixed costs before a single variable cost changes.
The signal is revenue per employee. Across our dataset, the median is $28.5K in service agreement revenue per employee. Best-in-class contractors run $40K+. When a company hires ahead of revenue, that number drops — and it almost never bounces back without deliberate pruning.
In our $5M example: Two years ago, 18 employees at $4M revenue = $222K per employee. Today, 26 employees at $5M = $192K per employee. The company is 22% less efficient per head despite 25% revenue growth. At the old efficiency level, they'd need $5.8M to support 26 employees. They're under-earning their own headcount.
Leak 2: Pricing Hasn't Kept Up With Costs
Labor costs are up 20-30% since 2021. Parts and equipment are up 15-25%. Fuel is up. Insurance is up. Workers comp classifications have crept higher as your payroll has grown.
Meanwhile, many contractors haven't raised their service rates in two years. Some haven't raised them in three. I've seen HVAC companies still billing residential service at $110/hr when their fully loaded tech cost is $85/hr — before truck, insurance, or overhead.
The national median bill rate is $79/hr. But that number is anchored to what companies are actually charging, not what they should be charging. From the bill rate benchmarks, there's a wide range by market and trade — and a significant minority of contractors are priced below what their cost structure supports.
Here's the test: take your total labor cost (wages + payroll taxes + benefits + workers comp) and divide by total billable hours. Add your truck cost per billable hour. That's your fully loaded field cost per hour. If your bill rate isn't at least 2.5x that number, you're underpriced.
In our $5M example: Two years ago, bill rate of $100/hr with a $38/hr fully loaded cost = 2.6x markup. Today, fully loaded cost has crept to $52/hr (wage increases, new benefit package, higher WC) but bill rate is still $100/hr = 1.9x markup. On 20,000 annual billable hours, the pricing gap alone is worth $200-400K in missing margin.
This is the most fixable leak. A $10-15/hr rate increase on service work, implemented gradually over two billing cycles, closes most of it.
Leak 3: Unprofitable Customer Segments You Don't Know About
Every contractor has customers who drain margin. The property manager who sends 30 calls per year but negotiates a flat rate and calls back on every job. The GC who has you chasing payments for 90+ days and beats you up on change orders. The residential customer who lives 45 minutes from your service territory and needs three trips per visit.
The problem is that most contractors don't know which customers these are. They see total revenue, not margin by customer.
From the customer profitability data, the top 20% of customers by margin frequently generate 80%+ of the net profit. The bottom 20% are often margin-neutral at best, margin-negative at worst — once you account for collection friction, callbacks, drive time, and the back-office cost of managing difficult accounts.
I've walked contractors through this analysis on their own QuickBooks data and watched them go quiet when they realize their second-largest account by revenue is essentially unprofitable after true job costing. They'd been growing that relationship for three years. It looked like success. It was a treadmill.
In our $5M example: $1.2M of revenue is concentrated in 3 commercial accounts that run 28% gross margin (versus 44% on the rest of the book). That margin gap — 16 points on $1.2M — is $192K of missing gross profit. Those accounts feel important because they're large. They're actually subsidized by the residential and small commercial work that surrounds them.
Leak 4: Warranty and Callback Costs Nobody Tracks
Every callback is paid labor against a job you already closed. Every warranty repair is parts and labor you'll never bill. These costs live in the cracks of your P&L — lumped into job costs without a category, or written to overhead without attribution.
A typical residential service company runs 5-8% callback rates on service work. For installation, rework and warranty claims add another 2-4% of job cost. When you add it up, warranty and callback costs frequently represent 3-8% of revenue — almost entirely invisible in standard P&L reporting.
The insidious part: these costs are asymmetric. The jobs that generate callbacks are disproportionately the ones where the margin was already thin (rushed jobs, difficult sites, undertrained techs). You put in extra hours to close a borderline job, and then put in more hours fixing it.
This is closely tied to phantom margins — the difference between what you think a job made and what it actually made once callback and warranty costs are properly allocated.
In our $5M example: With $2.8M in direct labor and materials, a 5% callback rate represents $140K in unbilled rework. That's not on anybody's job report. It's buried in unbilled hours and parts credits. The company thinks they're running 43% gross margin. Subtract the callback load and they're at 40%. On $5M, that's $150K of real gross profit that doesn't exist.
Leak 5: Mix Shift Away From Service
This is the one contractors feel proudest of — and the one that quietly kills them.
You landed a $400K commercial retrofit project. Then another. Your revenue jumped 25%. You hired two more install crews. You're doing work you've never done before. The phones are full of opportunity.
But service work — residential maintenance contracts, small commercial service agreements, emergency calls — generates 47% labor margins and 40-45% gross margins. Install and construction work typically runs 28-35% gross margin because material costs are higher, labor is less productive (new install vs. familiar service), and change order recovery is harder.
When you shift 20% of your revenue from service to install, you're replacing your highest-margin work with your lowest-margin work. Total revenue goes up. Total gross margin dollars go flat or down.
The benchmark: well-run service-first contractors run 40-45% gross margins. Install-heavy or construction-heavy contractors run 28-35%. If your revenue is growing but your gross margin dollars aren't growing proportionally, check your mix.
In our $5M example: Two years ago, the company was 75% service, 25% install. Today it's 55% service, 45% install. Revenue grew from $4M to $5M. But blended gross margin dropped from 43% to 37%. In dollars: gross profit went from $1.72M to $1.85M — only $130K more despite $1M of additional revenue. They worked 25% harder for 7.5% more gross profit.
How They Compound: The $5M Contractor Reality
Here's what happens when all five leaks run simultaneously:
| Starting point | % | $ |
|---|---|---|
| Expected gross margin (benchmark) | 43% | $2,150,000 |
| Leak 1: Overhead creep (reduced gross, higher fixed) | — | — |
| Leak 2: Pricing gap (16 points lost on 40% of work) | -6.4% | -$320,000 |
| Leak 3: Unprofitable customers | -3.8% | -$192,000 |
| Leak 4: Callbacks unbilled | -3.0% | -$150,000 |
| Leak 5: Mix shift | -6.0% | -$300,000 |
| Actual gross margin | ~27.6% | $1,388,000 |
Then overhead at 29% ($1.45M) leaves negative net profit. The company is technically losing money on paper despite $5M in revenue, a full crew, and a waiting list for service.
This is not hypothetical. I've seen this exact scenario in real contractor P&Ls — where the owner is working 60 hours a week, turning down work, and making less than they made as a solo operator five years ago.
Where to Start
You don't have to fix all five at once. In order of impact and speed:
1. Raise prices first. This has the fastest payback and requires no headcount changes. A $10-15/hr increase on service calls takes two billing cycles and immediately lifts gross margin. Most customers don't leave over 10% rate increases when your response time and quality are good.
2. Run a customer profitability analysis. Pull job-level margin data for your top 20 accounts. Identify which ones are running below 35% gross margin. Have a rate renegotiation conversation or deprioritize dispatch to those accounts.
3. Create a callback tracking code in your field service software. You can't manage what you can't measure. Every callback should be tagged and attributed to the original job and technician. Do this for 90 days and you'll have a clear picture of your rework cost.
4. Protect your service mix. Be intentional about the ratio of install to service revenue. If a large install project comes in, ask whether your service capacity can absorb the crew reallocation — or whether you're temporarily sacrificing your highest-margin work for a shiny project.
5. Build a hiring ROI model before the next hire. Before you add the next truck or CSR, model the break-even: what revenue does this person need to generate (or enable) to justify their fully loaded cost? See the CFO vs. bookkeeper decision for how financial oversight catches these decisions before they're made emotionally.
Q: My revenue is growing but my bank balance isn't. Is that a cash flow problem or a profitability problem? A: Usually both, but they have different root causes. Profitability problems show up in the P&L — low gross margin, high overhead, leaking net profit. Cash flow problems show up in timing — slow collections, big material outlays before invoicing, seasonal gaps. You can have good profitability and bad cash flow (fast-growing contractors with slow billing cycles often do). You can also have adequate cash flow and poor profitability (drawing on a line of credit to mask thin margins). The diagnosis matters because the fixes are different. Level typically starts with a 90-day P&L review to separate the two.
Q: How do I know if my overhead rate is too high? A: The benchmark for $3-10M contractors is 20-28% of revenue allocated to overhead. If you're consistently above 30%, you have overhead creep. The most common culprits in the data: vehicles allocated to overhead instead of jobs, admin salaries that have grown faster than revenue, and insurance costs that haven't been shopped in 2+ years. A clean overhead analysis — which we run as part of our baseline engagement — typically identifies $50-150K of misallocated or excess overhead in companies this size.
Q: Can I fix the pricing problem without losing customers? A: In almost every case, yes — with the right sequencing. The contractors who lose customers on rate increases are the ones who raise prices reactively, without context, and without a service quality story. The ones who successfully raise rates by 15-20% do it with notice, with a clear rationale (cost increases are real and customers know it), and with confidence in their service quality. Your best customers — the ones you actually want to keep — rarely leave over a justified rate increase. Your price-sensitive customers who also generate callbacks and collection friction? They're the ones you can afford to lose.
About the author
Sam Young
Founder of Level. Former private equity investor and investment banker. Built AI-powered accounting products while building financial products for 1,000+ commercial contractors — benchmarking financial data across 2,200+ service businesses in contractors, healthcare, restaurants, cleaning, and staffing. Operations analytics work with PE-backed service business portfolios across multiple verticals. Co-founded a real estate tax optimization firm, where his team has analyzed over $1B in real estate assets. Stanford MBA.
LinkedIn