Illustrative example. Fictional company; benchmarks are sourced.
Inside the Numbers / Case 3 / Last reviewed: 2026-10-29
The $2.1 Million HVAC Company That Thought It Needed More Technicians
Inside the Numbers | Case File #3
The $2.1 Million HVAC Company That Thought It Needed More Technicians
Real-world business decisions. Illustrative companies. Verified industry data.
Lessons you can apply.
| Snapshot | |
|---|---|
| Industry | Residential HVAC service and replacement (NAICS 238220) |
| Size | $2.1 million in sales, 7 service technicians |
| Model | Service calls, maintenance plans, separate installation crew |
| Entity stage | LLC taxed as an S corporation; owner paid through payroll |
| Region | U.S. suburban market (fictional, unspecified) |
| Decision | Hire two more technicians, or get more from the hours already on payroll |
| Presented by | Ava |
Illustrative example. Fictional company; benchmarks are sourced.
The takeaway
The owner wanted two more technicians. First we fixed his books, where truck loan payments had been expensed in full. Corrected, he kept $61,000 of net profit before owner taxes, 2.90% of sales, below the 4% and 7% averages contractors report to ACCA.
With technicians billing 60% of paid hours and a stale price book, our model moves net profit to $181,000 (8.01%) in 12 months with no new hires.
Meet the business
This is a fictional residential HVAC company built from a pattern common in home services, not one real company or owner. If your schedule is full and your bank account is not, you will see your business in it.
Service work (repairs, diagnostics, maintenance) brings in $1.44 million; replacement installations by a separate crew bring in $660,000. Seven service technicians run the calls, supported by a dispatcher and a small office. Customers pay per ticket, mostly on flat-rate pricing.
About 400 homeowners hold maintenance plans at $240 a year; that $96,000 is already inside service sales.
The company is an LLC taxed as an S corporation. The owner is paid a market-rate general manager salary through payroll, inside operating expenses, so every profit figure is after a fair wage for his job.
The owner's problem
The phones were busy and customers waited days for a repair, so the owner concluded he needed two more technicians. Yet on more than $2 million of sales, his books showed only $80,000 of EBITDA and $40,000 of net profit. He believed the fix was volume.
That skips two questions. Are the books right? And how much paid time turns into billed work at a price that covers its cost?
If existing hours leak, new hours leak the same way.
The financial snapshot
Step one: clean the books. In this scenario, we worked through it with the owner, starting where every review should start: the balance sheet. The truck loan showed $118,000 on the books but $97,000 on the lender's statement.
Each $3,000 monthly payment had been coded in full to auto expense: $36,000 a year, of which only $15,000 was interest. The other $21,000 was principal, which pays down the loan and is not an expense.
| Cleanup | Before | After | Effect |
|---|---|---|---|
| Truck loan balance on the books | $118,000 | $97,000 | Matches lender statement |
| Loan payments in operating expenses | $36,000 | $0 | Removed from opex |
| Interest expense (below EBITDA) | $0 | $15,000 | Shown on its own line |
| Principal (balance sheet) | expensed | $21,000 | Reduces the loan |
| Cash in the bank | unchanged | unchanged | Bookkeeping fix only |
Annual P&L, reported and corrected (fictional assumption unless marked)
| Line | Reported | Corrected | Kind |
|---|---|---|---|
| Service revenue | $1,440,000 | $1,440,000 | Fictional assumption |
| Installation revenue | $660,000 | $660,000 | Fictional assumption |
| Total sales | $2,100,000 | $2,100,000 | Calculated output |
| Direct costs (labor, parts, job costs) | $1,370,000 | $1,370,000 | Fictional assumption |
| Gross profit | $730,000 | $730,000 | Calculated output |
| Operating expenses before D&A (incl. owner/GM salary) | $650,000 | $614,000 | Fictional assumption / calculated |
| EBITDA | $80,000 | $116,000 | Calculated output |
| Depreciation and amortization | $40,000 | $40,000 | Fictional assumption |
| Interest | $0 | $15,000 | Fictional assumption |
| Net profit before owner taxes | $40,000 | $61,000 | Calculated output |
| Net margin | 1.90% | 2.90% | Calculated output |
The corrected column is the starting point. EBITDA rose $36,000 because the payments left operating expenses; net profit rose only the $21,000 of principal, because interest is still a cost.
Key numbers (corrected)
| KPI | Value | Kind |
|---|---|---|
| Paid technician hours per year | 13,440 | Calculated output |
| Completed billable hours per year | 8,064 | Calculated output |
| Billable utilization | 60.0% | Calculated output |
| Service revenue per completed billable hour | $178.57 | Calculated output |
How it compares
| Measure | This company (corrected) | Benchmark | Kind |
|---|---|---|---|
| Net profit, contractors using other pricing methods | 2.90% | 4% average | Sourced benchmark |
| Net profit, contractors using flat-rate service pricing | 2.90% | 7% average | Sourced benchmark |
| HVAC mechanic and installer pay, U.S. median | Not stated in the model | $61,010 a year ($29.33 an hour), May 2025 | Sourced benchmark |
We compare net to net. As a pass-through, the company pays no entity-level income tax in this model, so net profit before owner taxes is the comparable line. Read it with care: ACCA's figures are self-reported averages from more than 1,000 HVACR contractors, the exact net-profit definition is not published, tax treatment varies by respondent, and respondents may not deduct a market salary for the owner as this model does.
Higher profit at flat-rate firms is an association, not proof of cause.
The gap. At 2.90%, the company sits 1.10 points below the 4% average. On $2.1 million of sales that is about $23,000 a year.
Against the 7% flat-rate average, the gap is 4.10 points, or about $86,000 a year.
Where it leaks. No public benchmark exists for utilization or callback cost, so the overspent lines come from the company's own numbers: direct labor on 5,376 paid hours a year never billed (the 504 hours the model recovers carry $90,000 of service revenue at today's yield), $40,000 a year of callback parts, fuel and warranty costs outside technician hours (the model halves it), and a flat-rate book priced below cost (modeled at $70,000 a year).
The BLS figure is national base pay, not burdened cost or a billing rate. Use it to sanity-check wage assumptions only.
The diagnosis
Three things were happening at once.
First, hours leaked.
Paid hours = 7 technicians × 40 hours × 48 weeks = 13,440
Billable hours = 7 technicians × 24 hours × 48 weeks = 8,064
Billable utilization = 8,064 ÷ 13,440 = 60.0%
Travel, training and safety steps are necessary, but nobody measured the split, so nobody could manage it.
Second, the flat-rate book had not been rebuilt against current labor burden and parts cost.
Service revenue per completed billable hour = $1,440,000 ÷ 8,064 = $178.57
That is a yield figure including parts and markup, not a labor rate or a cost per hour.
Third, callbacks. Every repeat visit uses a paid hour and earns nothing.
The options
| Option | Cost | Upside | Risk |
|---|---|---|---|
| A. Hire two technicians now | Two wages plus burden, trucks and tools (not modeled) | Capacity, if profitable demand exists | Fixed cost at a 2.90% net margin; new hours leak too |
| B. Fix pricing, hours and callbacks first | $10,000 a year training, plus $50,000 direct cost of extra work | Modeled net profit of $181,000 | Price pushback; demand may not fill the hours |
| C. Change nothing | None | None | Net profit stays near $61,000 |
The recommendation
- Keep the books clean. Reconcile bank, card and loan accounts to statements monthly; split every loan payment into interest and principal.
- Run a 30-day ticket audit. Record billable hours, revenue, parts, callbacks and cash collected per ticket.
- Rebuild the price book from fully burdened cost. Modeled: $70,000 more revenue on the same work, if customers accept it.
- Fix dispatch and track callbacks. 1.5 more billable hours per technician per week adds 504 hours a year. Modeled: $90,000 more service revenue, less $50,000 of direct cost, plus $20,000 saved on callbacks.
- Cost the maintenance plans. Do 400 plans at $240 cover their visits and discounts?
- Hire when the data says so. Add technicians once the audit shows profitable demand the team cannot serve.
Entity stage and next step. One LLC taxed as an S corporation fits today. As profit rises, the next step is a yearly check, with your tax professional, that the owner's payroll salary is still reasonable compensation for his work; profit above that is paid as distributions.
Talk to your tax professional about your own situation.
Before and after
| EBITDA bridge, 12 months | Amount | Kind |
|---|---|---|
| Corrected baseline EBITDA | $116,000 | Calculated output |
| Price realization | +$70,000 | Modeled projection |
| Extra completed work (504 hours) | +$90,000 | Modeled projection |
| Direct cost of extra work | −$50,000 | Modeled projection |
| Callback savings | +$20,000 | Modeled projection |
| Training and price-book upkeep | −$10,000 | Modeled projection |
| Modeled EBITDA | $236,000 | Modeled projection |
| Depreciation and interest (held flat) | −$55,000 | Fictional assumption |
| Modeled net profit before owner taxes | $181,000 | Modeled projection |
Extra billable hours = 7 × 1.5 × 48 = 504
Extra service revenue = 504 × $178.57 = $90,000
Start, 90 days and 12 months. The 90-day column is an annualized run rate: books cleaned, audit done, half the price change and half the callback savings in place, no extra hours yet. Kind: start columns are fictional assumptions and calculated outputs; both after columns are modeled projections, not results.
| Line | Start (reported) | Start (corrected) | 90 days (modeled) | 12 months (modeled) |
|---|---|---|---|---|
| Total sales | $2,100,000 | $2,100,000 | $2,135,000 | $2,260,000 |
| Direct costs | $1,370,000 | $1,370,000 | $1,360,000 | $1,400,000 |
| Gross margin | 34.76% | 34.76% | 36.30% | 38.05% |
| Operating expenses before D&A | $650,000 | $614,000 | $624,000 | $624,000 |
| EBITDA | $80,000 | $116,000 | $151,000 | $236,000 |
| EBITDA margin | 3.81% | 5.52% | 7.07% | 10.44% |
| Net profit before owner taxes | $40,000 | $61,000 | $96,000 | $181,000 |
| Net margin | 1.90% | 2.90% | 4.50% | 8.01% |
| Billable utilization | 60.0% | 60.0% | 60.0% | 63.75% |
Interest is held flat for simplicity. No figure here is cash flow: owner taxes, loan principal, equipment and working capital still come out.
Risks and what still didn't work
What if it is only half as good? In the downside case every lever lands at half (+$35,000 price, +$45,000 work, −$25,000 direct cost, +$10,000 callbacks) and the $10,000 setup cost stays in full.
| Line | Modeled | Half case |
|---|---|---|
| EBITDA | $236,000 | $171,000 |
| Net profit before owner taxes | $181,000 | $116,000 |
| Sales | $2,260,000 | $2,180,000 |
| Net margin | 8.01% | 5.32% |
The half case clears the 4% average but not 7%. Watch for customers lost to the price change, extra hours that sit empty, and pressure to rush diagnosis or skip safety steps.
Weekly scorecard
| Number to watch | Target (from the model) |
|---|---|
| Billable hours per technician per week | 25.5 |
| Billable utilization | 63.75% |
| Service revenue per completed billable hour | $186.74 |
| Service revenue per working week | $33,333 |
| Gross margin | 38.05% |
| Callback cost avoided per working week | $417 |
| Bank, card and loan accounts reconciled to statements | Every month |
Apply it to your business
Three questions
- Does every loan on your balance sheet match the lender's statement, and is each payment split into interest and principal?
- Of the hours you paid technicians for last month, how many were billed?
- When was your price book last rebuilt from current labor burden and parts cost?
Checklist
- Bank, card and loan accounts reconciled monthly; no negative balances
- Paid and billable hours tracked by technician weekly
- Flat-rate tasks priced from fully burdened cost
- Callbacks logged as their own job type
- A 13-week cash forecast before any new hire
The one action this week: Compare your truck or equipment loan statement to your books. Then divide last week's service revenue for one technician by billable hours. That is your yield per hour.
Work through the same steps: price your work with the markup and margin calculator and the cost-plus pricing worksheet, find a technician's real hourly cost with the employee cost calculator, and take the Pricing for Margin course. Plan cash before any hire with the contractor 13-week cash flow template. More cases like this one are in Case Files.
Want help applying it to your own numbers? Request a walkthrough. It is a way to work through the process, not a promised result.
Sources and method
Benchmark evidence records
| Field | ACCA flat-rate pricing finding | BLS HVAC wage |
|---|---|---|
| Metric and definition | Average net profit, self-reported; precise definition not published in the summary | Median annual and hourly wage |
| Industry and code | HVACR contractors (closest NAICS 238220) | HVAC mechanics and installers (occupation, all industries) |
| Business type and size | Contractors of all sizes, survey respondents | Employees, all employers |
| Geography | United States | United States |
| Period | 2025 study | May 2025 |
| Statistic | Average; more than 1,000 contractors surveyed | Median |
| Source | ACCA, see Sources below | BLS, see Sources below |
| Status | Verified against public summary | Verified |
| Limits | Association, not cause; tax treatment and definition vary by respondent; subgroup sizes not published | Base wage only; not burdened cost or billing rate |
| Last checked | 2026-10-27 | 2026-10-27 |
Fictional assumptions: all company sales, costs, staff counts, hours, plan counts and prices; the entity type; the truck loan ($3,000 monthly payment, $15,000 annual interest, $21,000 principal, $118,000 book balance, $97,000 lender balance); $40,000 depreciation and amortization; 48 working weeks; 40 paid hours per week; 24 billable hours per technician per week at baseline; 1.5-hour weekly gain; $70,000 price realization; $50,000 direct cost of extra work; $40,000 annual callback cost outside technician hours, of which $20,000 is saved; $10,000 training cost; the 90-day run-rate mix. No matched public benchmark exists for technician utilization or callback cost, so none is shown.
Method: Schedules were built and checked before writing. Margins are recomputed from dollars. Owner pay is inside operating expenses at an assumed market rate.
Net profit is before owner-level income taxes because the entity is a pass-through. Interest is held flat. No figure is cash flow.
Disclosure: This is a fictional educational scenario. The company, owner, statements and outcomes are invented, and all company numbers are modeled. It is not a real client, testimonial or observed result.
Industry statistics are cited separately and are not the company's results. This is general education, not tax, legal or financial advice. Talk to your tax professional about your own business.
Presented by Ava. Reviewed by a person before publication.
Sources
- Inside the Contractor of the Future Study: Key Findings from 1,000 Contractors, Air Conditioning Contractors of America (ACCA), ACCA blog
- Heating, Air Conditioning, and Refrigeration Mechanics and Installers, U.S. Bureau of Labor Statistics, Occupational Outlook Handbook