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 componentExample 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 itemWhat it includesWhy it gets missed
FICA/Payroll TaxEmployer payroll tax burden attached to wagesOften assumed to be absorbed elsewhere in payroll
Workers' CompInsurance cost tied to field labor classificationRates vary and are rarely translated into hourly job cost
Vehicle DepreciationWear, replacement value loss, and fleet capital consumptionFuel may be tracked, but depreciation usually is not
Small ConsumablesTape, zip ties, wire nuts, anchors, screws, sealantsIndividually cheap, collectively material over hundreds of jobs
Disposal/Recycling FeesRefrigerant handling, scrap disposal, dump fees, recycling chargesOften treated as one-off exceptions rather than standard cost inputs
Warranty Buffers (2-3%)Expected callbacks, touch-ups, minor warranty laborMargin gets hit later if no buffer is included upfront
Administrative OverheadPermit filing time, job file setup, compliance handling, closeout adminOffice 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.