High revenue does not automatically mean high profit.
In HVAC, one of the most common financial mistakes is the Profitability Trap: a business appears busy, invoices are going out, top-line sales look healthy, but management still cannot explain why margins remain tight.
The cause is usually simple. The business does not understand its true COGS (Cost of Goods Sold) at the job level.
When labor is underloaded, drive time is ignored, consumables are not tracked, and warranty exposure is treated as an afterthought, quotes look competitive on paper but underperform in the P&L. The result is a business that grows revenue while quietly compressing profit.
01 : The challenge: Why HVAC job pricing fails at the cost layer
Most pricing problems in HVAC do not start in sales. They start in accounting.
A contractor may know the equipment cost and the technician's hourly wage, but that is not enough to price work accurately. True job costing requires a line-by-line view of every direct and semi-direct cost that follows the job from dispatch to completion.
The issue is that many growing HVAC businesses still rely on scattered spreadsheets, memory, and rough percentage markups. That creates predictable errors:
- Base wages are mistaken for labor cost: A $30/hour technician is rarely a $30/hour cost to the business.
- Small operational costs disappear into overhead: Tape, zip ties, wire nuts, fuel-adjacent vehicle wear, disposal charges, and permit admin time are often left out of the quote.
- Non-billable time is ignored: Drive time, supply runs, and unproductive gaps between jobs still consume payroll and vehicle capacity.
- Warranty exposure is not priced in: Callbacks and minor rework reduce margin unless a buffer is built into the estimate.
The consequence is a distorted gross margin. On paper, the job looks profitable. In reality, the business is subsidising work with costs it never priced.
02 : The solution: Build pricing from fully loaded cost, not hourly wage
Accurate HVAC pricing starts with one rule: price from fully loaded cost, then allocate overhead, then apply target margin.
Fully loaded labor: why $30/hour becomes $50–$60/hour
A technician's wage is only the starting point. The true labor cost includes statutory burdens, benefits, paid non-productive time, and the reality that not every paid hour is billable.
Here is a practical example for a technician paid $30/hour:
| Cost component | Example hourly impact |
|---|---|
| Base wage | $30.00 |
| FICA / payroll tax | $2.30 |
| Workers' comp | $1.50 - $4.00 |
| Benefits / health contribution | $3.00 - $6.00 |
| PTO / holidays / sick leave accrual | $2.00 - $3.50 |
| Training / meetings / shop time | $1.50 - $3.00 |
| Unbillable drive time and idle time allocation | $8.00 - $12.00 |
| Estimated fully loaded labor cost | $50.30 - $60.80 |
That last line is where many HVAC businesses lose margin. If you quote using a $30 labor assumption, but your real labor cost is $50 to $60 per paid hour once burdened and normalised across billable time, every install and service call starts from an inaccurate cost base.
The hidden costs table: the line items contractors miss
The next step is to make hidden costs explicit instead of treating them as "small stuff."
| Hidden cost line item | What it includes | Why it gets missed |
|---|---|---|
| FICA/Payroll Tax | Employer payroll tax burden attached to wages | Often assumed to be absorbed elsewhere in payroll |
| Workers' Comp | Insurance cost tied to field labor classification | Rates vary and are rarely translated into hourly job cost |
| Vehicle Depreciation | Wear, replacement value loss, and fleet capital consumption | Fuel may be tracked, but depreciation usually is not |
| Small Consumables | Tape, zip ties, wire nuts, anchors, screws, sealants | Individually cheap, collectively material over hundreds of jobs |
| Disposal/Recycling Fees | Refrigerant handling, scrap disposal, dump fees, recycling charges | Often treated as one-off exceptions rather than standard cost inputs |
| Warranty Buffers (2-3%) | Expected callbacks, touch-ups, minor warranty labor | Margin gets hit later if no buffer is included upfront |
| Administrative Overhead | Permit filing time, job file setup, compliance handling, closeout admin | Office time is real labor, but often not assigned to the job |
A disciplined job costing model forces each of these items into the estimate instead of letting them leak into month-end overhead.
How to calculate overhead per billable hour
Once direct costs are clear, overhead needs to be spread across the hours that actually generate revenue.
Use this formula:
Overhead per Billable Hour = Total Monthly Overhead ÷ Total Monthly Billable Hours
Example:
- Total monthly overhead = $85,000
- Total monthly billable hours = 1,700
$85,000 ÷ 1,700 = $50.00 overhead per billable hour
That means every billable field hour must recover:
- Fully loaded labor cost
- Allocated overhead per billable hour
- Materials and equipment
- Warranty allowance
- Target net profit margin
If your fully loaded technician labor is $54/hour and overhead per billable hour is $50/hour, your cost base is already $104/hour before materials, subcontractors, disposal, or profit.
That is why simplistic hourly markups fail. They ignore the cost structure underneath the work.
03 : The results: Better pricing discipline and cleaner margins
When HVAC businesses shift from wage-based quoting to accounting-based job costing, the outcome is not theoretical. It shows up directly in gross margin control.
A proper costing model improves decision-making in three ways:
- More accurate quoting: Estimates reflect actual labor burden, not just pay rates.
- Cleaner margin analysis: Owners can identify which job types, crews, or service categories are genuinely profitable.
- Stronger pricing confidence: Teams stop discounting from incomplete numbers and start pricing from fact.
It also changes how management reads performance.
Instead of asking, "Why are we busy but not making money?" the better question becomes, "Did we recover full labor burden, hidden direct costs, overhead, and target margin on every billable hour?"
Costing Snapshot
A reliable HVAC pricing model should capture these core metrics at minimum:
- Fully Loaded Labor: ↑ from $30/hour base pay to $50-$60/hour true cost
- Warranty Buffer: ↑ 2-3% built into quoted value
- Overhead Recovery: ↑ calculated per billable hour, not guessed
- Hidden Cost Visibility: ↑ every recurring operational cost assigned before quoting
Manual spreadsheets are the enemy of accuracy because they depend on perfect data entry, perfect formulas, and perfect follow-through. At a certain size, that breaks. A system like Ascora automates job costing inputs, overhead allocation, and reporting so you do not have to be a full-time accountant to price HVAC work properly.