Many HVAC owners assume their financial reports are telling them the truth. Often they aren't. When service calls, replacement installs, maintenance agreements, and commercial contracts all feed one revenue line, your profit and loss statement is a scoreboard with no context. You can't tell which work is making you money, which is draining it, or where to focus next season.
The problem starts at the foundation: your chart of accounts. A generic small-business template was never designed for burdened labor rates, truck cost allocation, warranty reserves, or the very different margins of a service agreement versus a new install. Getting this structure right isn't a bookkeeping detail. It's the prerequisite for every useful report your business will produce.
This guide walks through building an HVAC chart of accounts from the ground up: revenue structure, cost of goods sold, overlooked operating expenses, job costing, and how to set it up whether you're starting fresh or moving off a default template.
With a default small-business template, nearly every dollar of revenue lands in one place. A residential tune-up, a commercial rooftop replacement, a maintenance agreement, and a warranty callback all flow into the same income line. At year-end, the P&L tells you whether the business made money. It can't tell you which work made it, which work quietly lost it, or what to change next year.
The revenue problem. Service calls usually carry far higher gross margins than equipment installs. Well-run maintenance agreements can run higher still. Warranty callbacks generate zero revenue and pure cost. When all four share one account, the margins blend into a number that represents none of them. An owner looking at that figure can't tell whether residential service is carrying the business or bleeding it, or whether commercial installs won on price are dragging the average down.
The cost problem. Generic cost-of-goods-sold accounts make it worse. A $4,000 condenser, $12 in capacitors, a tech's burdened labor, a subcontractor's invoice, and truck fuel all land in one bucket. Each has a different margin profile and a different fix. Lumped together, none of them show up as individual problems.
Labor burden, the gap between a tech's hourly wage and their true field cost, is invisible in a generic setup, which means every job estimate starts out understated.
Why setup is the moment to fix it. Every report, tax return, and pricing model is built on the chart of accounts. Restructuring later is much harder than building it right from the start. If the accounts are wrong, the reports are wrong, and every decision made from them carries the error forward.
Each exists because the underlying costs are different. Residential service runs on flat-rate pricing with solo techs and same-day parts. Commercial service involves longer diagnostics, possible subcontractors, and net-30 terms. Residential installs are usually one- or two-day jobs with one unit. Commercial installs bring engineering coordination, phased permits, and different suppliers. Combine any two and you get a margin number that's accurate for nothing.
Commercial work carries different labor rates, permit costs, supplier relationships, and payment cycles. When a commercial install with a 45-day receivable and a residential tune-up paid by card on site share one revenue line, both your cash picture and your margin picture are wrong.
When a customer pays $299 upfront for an annual agreement, that money isn't income yet. Under ASC 606, revenue is recognized as the promised service is delivered. Until the tune-ups are performed, the $299 sits in deferred revenue, a liability on your balance sheet, not income on your P&L. Recognizing it right away overstates current income and hides what you still owe.
Warranty callbacks are often recorded as $0 transactions, with their labor and parts absorbed into normal service costs. That makes residential service margins look worse than they are and hides what warranty obligations actually cost. A dedicated warranty account makes the cost visible, so you can factor warranty exposure into install pricing.
Add sub-accounts where your volume justifies it. A company running 200 residential service calls a month alongside commercial installs might split 5300 into 5310 Residential Service Labor and 5320 Commercial Installation Labor.
A $4,000 condenser and a $12 capacitor are both "parts" in a generic setup, but they're nothing alike. Equipment costs track with installation revenue and are usually negotiated with distributors. Parts are used on every job type, including service calls, and that's where material waste and inconsistent markup tend to hide. Combined, a month with heavy equipment sales looks like heavy parts usage, and the accounts tell you nothing useful.
Direct labor is the most commonly underpriced line in HVAC, because owners use the hourly wage instead of the fully loaded rate. The loaded rate includes FICA, federal and state unemployment, workers' comp, health insurance, paid time off, and training. Workers' comp is a big piece for a physically hazardous trade, and in a generic setup it gets buried in a pooled insurance line instead of flowing into job labor costs. Every estimate using raw wages comes in low, often substantially.
If you haven't calculated your burden rate yet, use a meaningful multiplier above base wage until you run the real numbers. An overstated labor cost that gets corrected later is recoverable. A year of underpriced jobs isn't.
Subcontractor costs get their own account, separate from employee labor. The markup logic is different, and blending them makes it impossible to tell whether your sub relationships are making or costing you money.
Vehicle allocation (5500) captures the job-level cost of getting a tech to the site, usually as a daily or per-job rate based on actual truck operating costs. Even a rough allocation beats zero, and you can refine it as data builds.
With these five accounts, every slip in gross margin has a traceable source.
A single "Vehicle Expenses" line hides an aging truck running $1,800 a month in repairs inside an average. Track each vehicle separately, with sub-accounts for fuel, maintenance, insurance, and depreciation. Asset-level records also matter for depreciation: 100% bonus depreciation now applies to qualifying property acquired and placed in service after January 19, 2025, and claiming it correctly takes vehicle-level records. When one truck's maintenance outruns its value, the data makes the replacement decision obvious.
When a unit is installed, part of that job's economics belongs to future callback risk. Expensing warranty costs only when callbacks happen distorts the month they occur and makes the original install look more profitable than it was.
For your books, the accrual approach is: at installation, debit a warranty expense account and credit a warranty reserve liability. When a callback happens, its cost draws down the reserve instead of hitting that month's income. That gives you a P&L that reflects real job economics. The tax treatment is different (warranty costs are generally deductible when actually incurred, not when reserved), so coordinate with your CPA.
Generic templates often dump these into "Other Expenses":
When overhead sits in clean accounts, you can allocate it to jobs with a consistent rate: total monthly overhead divided by billable labor hours gives you an overhead rate per hour to apply to every ticket. When overhead is pooled or hidden in catch-all categories, that rate is a guess, and a guessed margin leads to different pricing decisions than a real one.
Job costing isn't a separate system layered on top of your books. It's a direct output of your account structure. If labor, parts, and equipment land in separate cost accounts, pulling per-job costs is a reporting step. If they're collapsed into one line, there's nothing to pull.
Two service calls, same tech, same two hours.
Call 1: a residential tune-up billed at $149. Burdened labor plus parts leaves a healthy gross margin.
Call 2: a warranty callback billed at $0. The same labor and parts produce a deeply negative margin.
On a P&L that lumps warranty work in with regular service, the callback disappears into the average. With its own account, that negative margin shows up immediately, and you can see what callbacks cost across a month or a quarter.
With consistent weekly tracking, patterns usually become clear within weeks. Many owners find one or two job types are carrying the business while others run near zero or below. That's not a guess. It's data.
The contractors who review job costing on every ticket weekly, not just on big installs or at year-end, are the ones who catch margin problems early. The account structure is what makes weekly review practical. When transactions code to the right accounts automatically, a job cost report is a few clicks, not an afternoon.
New files. Before adding HVAC accounts, make inactive any default accounts that don't apply. A cluttered chart causes miscoding, because whoever enters transactions will eventually pick the wrong one. Clear out the noise, then build the HVAC structure on a clean foundation.
Moving off a default template. Don't simply rename your old "Sales" account to one of the new names. Renaming relabels every past transaction, so years of installs and agreements would suddenly show up as, say, residential service. Instead, create the new revenue and cost accounts, pick a clean start date, and code everything from that date forward into the new structure. Leave the old account alone for history and make it inactive once it's no longer used. Historical comparisons will be limited for about a year. Accept that trade-off, because the alternative is more months of P&Ls that can't tell you which part of the business is profitable.
Turn on account numbers. Both QuickBooks Online and Xero support account codes. With numbers active, whoever codes a parts receipt enters 5200 instead of choosing between "Parts and Materials," "Materials and Supplies," and "Job Materials." The 4100 to 4600 and 5100 to 5500 structure above works directly with that.
Add a second dimension for division-level reporting. Account structure alone doesn't produce a P&L by division. In QuickBooks Online, use class tracking; in Xero, use tracking categories. Map them to Residential Service, Commercial Service, Residential Install, and Commercial Install. The account says what the cost is; the class or tracking category says where it belongs. Together, they produce the division-level margin reports that make job costing actionable.
Your chart of accounts isn't an administrative formality. A P&L built on a generic template tells you whether you made money. A properly structured HVAC chart of accounts tells you where you made it, which job types fund the business, and which need a price increase or a hard look at field execution.
The five changes with the most impact:
911 Bookkeepers sets up and cleans up charts of accounts for HVAC companies in Xero. If your current P&L feels more like a mystery than a management tool, book a free call and we'll show you where your structure is hiding the numbers you need.
Related reading
Jeremy Brewer is the founder of 911 Bookkeepers LLC in Baton Rouge, Louisiana. He worked in the field as an HVAC tech before building books for the trades, and he serves as a licensed paramedic in EMS. He is a Xero Certified Advisor.
Book a free 30-minute financial checkup and find out exactly where your business stands.