Two HVAC companies each report a 45 percent gross margin. One puts technician wages and burden in cost of sales. The other puts them in overhead. One is pricing correctly and paying its installers well. The other is one slow shoulder season away from a cash problem. The number on the page cannot tell you which is which, and neither can the owner until someone rebuilds the income statement.
This article defines gross margin the way an operator and a lender need it defined, separates the three lines of business that every residential and light commercial HVAC company runs under one roof, lists what belongs in cost of sales and what does not, gives illustrative ranges labeled as illustrative, and shows the pricing arithmetic that most often goes wrong. It closes with what to set up in ServiceTitan so the report you read on Monday is the same number your accountant closes on the 15th.
Three businesses under one roof
Demand service is the repair business: the no-cool call in July, the diagnostic fee, the capacitor, the contactor, the two hours on site. Tickets are small, labor is the largest cost, and parts are marked up well above cost because the customer is paying for the truck in the driveway, not the part in the box. Margin on this line is high in percentage terms and modest in dollars.
Installation and replacement is the equipment business: a condenser, an air handler or furnace, a coil, a line set, a crane if the roof requires it, an electrician if the panel does, and a permit. Tickets are large, equipment is often the biggest single cost, and margin in percentage terms is lower than service while gross profit dollars per job are far higher. This is also the line where a 40 percent markup gets mistaken for a 40 percent margin, which is the subject of a later section.
Maintenance agreements are the membership business: two visits a year, a filter, a discount on repairs, priority scheduling, and a recurring charge. On a fully costed basis the visit itself often earns little or nothing. The agreement exists to hold the customer, generate repair opportunities, and put your technician in front of a 14-year-old system before the competitor's technician gets there. Revenue on agreements should be recognized as visits are performed or ratably over the term, not when the card is charged. A company that books a year of memberships as revenue in the month it sells them has a great month and a confusing year.
What belongs in cost of sales
The most common error is the simplest one: cost of sales includes parts and equipment only, so gross margin reads 65 or 70 percent and overhead looks bloated. The owner concludes the office is the problem. The office is not the problem. The labor that produced the revenue is sitting in the wrong section of the income statement, and every pricing decision built on that report is wrong by the same amount.
- Direct labor: technician and installer wages for hours worked on jobs, including overtime premium.
- Labor burden: payroll taxes, workers' compensation, health insurance, retirement match, paid time off, and uniforms, applied to direct hours at a burden rate you refresh at least twice a year.
- Materials and parts: everything pulled from the truck or the warehouse for the job, at cost, including refrigerant, line sets, pads, and disconnects.
- Equipment: condensers, air handlers, furnaces, coils, heat pumps, thermostats, and indoor air quality products, at landed cost including freight.
- Permits and inspection fees.
- Subcontractors: crane, electrical, duct fabrication, roofing patches, and any trade you do not self-perform.
- Warranty labor and parts on your own prior work, recorded against the line that produced it.
- Sales commissions and technician spiffs, if they are paid per job. Some companies show these as selling expense instead. Either treatment is defensible; pick one, document it, and never switch mid-year.
- Unapplied labor: technician time not charged to a job, such as shop time, training, parts runs, and the drive to a canceled call. Show it as its own line in cost of sales so you can see it, rather than burying it in overhead where nobody will.
What stays out: office and customer service staff, dispatch, rent, marketing, software subscriptions, owner compensation, and general insurance. Vehicle fuel and maintenance can go either way; companies that track cost per truck usually put them in cost of sales as a direct line, and companies that do not put them in overhead. Consistency matters more than the choice. Overhead is where costs go to become someone else's problem, so keep the list of what lives there short and deliberate.
Computing it correctly
Gross margin is revenue minus cost of sales, divided by revenue, expressed as a percentage. Compute it three ways: by line of business, by job type within each line, and by technician or crew. The first tells you where the money is. The second tells you which services to promote and which to reprice. The third tells you who to coach. All three depend on the same two inputs being right: a loaded labor rate and a clean split of revenue and cost by line.
The loaded labor rate is wages plus burden, divided by the hours you actually bill. A technician paid $32 per hour with a 30 percent burden costs $41.60 per hour worked. If that technician bills 60 percent of paid hours, which is typical for a residential service technician once drive time, parts runs, and callbacks are counted, the cost per billable hour is $69.33. That is the number pricing must clear, and it is almost double the wage rate on the pay stub.
Timing is the other trap. Equipment bought in May for a job invoiced in June makes May look terrible and June look brilliant. Book equipment to a job cost or inventory account when purchased, and release it to cost of sales when the job is invoiced. Membership revenue follows the same principle in reverse: defer it when collected, recognize it when earned. A monthly margin that swings 15 points with no change in pricing is usually a timing problem, not a business problem.
Illustrative ranges
The table below shows illustrative gross margin ranges for a residential and light commercial HVAC company that puts direct labor, burden, materials, equipment, permits, and subcontractors in cost of sales. These are not survey results or industry statistics. They describe what the method tends to produce for a well-run company, and your own numbers will depend on mix, market, and what you decided to put in cost of sales.
| Line of business | Illustrative gross margin | Why it lands there |
|---|---|---|
| Demand service and repair | 55 to 65 percent | Labor-heavy, parts marked up well above cost, diagnostic fee covers drive time |
| Installation and replacement | 35 to 45 percent | Equipment is a large share of the ticket and is priced closer to cost |
| Maintenance agreement visits | 20 to 40 percent | Discounted, labor-only visits; value is in retention and repair opportunities |
| Blended company | 40 to 50 percent | Depends on the mix of service, install, and membership revenue |
A company outside these ranges is not automatically in trouble, and one inside them is not automatically fine. A 30 percent install margin can be deliberate in a market where replacements feed a high-margin service book. A 65 percent service margin can hide a technician who is upselling parts that were not needed and generating callbacks. The range is the starting point for a question, not the answer to it.
The pricing math
Margin and markup are different arithmetic, and confusing them is the most expensive spreadsheet error in the trades. Markup is added to cost. Margin is a share of price. A 40 percent markup on cost produces a 28.6 percent margin on price. To hit a 40 percent margin, you divide cost by 0.60, which is a 66.7 percent markup. The owner who prices at cost times 1.4 while believing the company earns 40 percent has been leaving a third of the intended profit on every install ticket.
Take an illustrative replacement job. Equipment at landed cost is $4,200. Materials are $600. Labor is 16 crew hours at a loaded $69 per billable hour, or $1,104. The permit is $150. The electrical subcontractor is $400. Total cost of sales is $6,454. At a 40 percent markup the price is $9,036 and the margin is 28.6 percent. At a 40 percent margin the price is $10,757. The difference is $1,721 per job. Across 200 installs a year, that is roughly $344,000 of gross profit that the markup version never collects, and none of it required a single extra truck.
Service pricing works the same way, per hour. If the loaded cost per billable hour is $69.33 and the target margin on labor is 60 percent, the labor rate must be $173 per hour before parts. If that rate is not what the market will bear, the answer is not to accept 45 percent. It is to raise billable efficiency, so the same wage is spread over more billed hours, or to price the diagnostic fee so it recovers the drive. Every one of those levers shows up in the margin report if the report was built correctly.
Getting the numbers out of ServiceTitan
ServiceTitan will produce gross margin by business unit, by job type, and by technician, but only if it was set up to. Create a business unit for each line: service, install, and maintenance, and residential and commercial variants if the economics differ. Map every invoice item and every purchase order to a general ledger account by business unit. Load technician hourly cost and a burden rate in payroll settings, and capture non-job time on timesheets so unapplied labor is measured rather than assumed. Then run the job costing and business unit reports for the same period your accountant is closing.
Reconcile ServiceTitan revenue and cost of sales to the general ledger every month. If they differ by more than rounding, the margin report is fiction, and the usual causes are invoices edited after export, purchase orders received without a job number, and membership revenue recognized on two different schedules. A dashboard nobody reconciles is a screensaver. A dashboard that ties to the books is the best pricing tool an HVAC owner will ever own.
Gross margin is only as honest as the labor rate and burden you loaded into it. Refresh both every time wages, insurance renewals, or the health plan change.
Where a fractional Controller or CFO fits
Most HVAC companies between $3 million and $50 million have a bookkeeper who records what happened and a ServiceTitan administrator who built the reports the way the implementation consultant suggested. Nobody owns the connection between the two. A fractional Controller builds the chart of accounts by business unit, sets the burden rate and refreshes it, reconciles ServiceTitan to the ledger each month, and produces a departmental income statement that shows service, install, and maintenance margins on one page. A fractional CFO uses that page to reset pricing, review the service-to-install mix, plan the shoulder-season cash dip, and prepare the numbers a lender or buyer will ask for.
The result is a margin number the owner can act on: which line to grow, which technician to coach, which price book to update, and how much cash the summer will produce. That is what the report was always for. The rest is setup, and setup is the part most companies never finished.