HVAC Job Costing: Chart of Accounts, Cost Codes and QuickBooks Setup
HVAC job costing, the full method: chart of accounts, cost codes by job type, burden rate, and QuickBooks class setup reconciled to your dispatch software.
The HVAC bookkeeping guide covers why treating install, service and maintenance work as one blended revenue line hides real differences between them, with a small worked example showing the mechanic. This post is the method behind that example: how to actually build a chart of accounts, cost codes, a burden rate, and a QuickBooks structure that produces those numbers every month without a manual reconstruction.
Start with the chart of accounts
Job costing fails most often at the chart of accounts, before a single transaction is ever entered. The standard mistake is a single “Cost of Services” or “Job Materials” account that catches everything — a condenser, a tube of sealant, a subcontractor invoice, a truck repair — with no way to separate what’s actually tied to a job from what’s general overhead.
A structure that supports job costing separates cost of goods sold into a small number of categories that map to how you actually buy things:
- Equipment and major materials — condensers, coils, furnaces, water heaters where applicable
- Job materials and supplies — refrigerant, line set, fittings, smaller parts
- Direct labor — technician wages and burden actually spent on jobs, as distinct from office staff
- Subcontractor costs — electrical tie-ins, crane rental, anything you pay someone else to do on a job
- Permits and inspection fees
Everything else — the shop lease, the office manager, insurance not tied to a specific job, marketing — stays in overhead, below the gross margin line. This is the same split covered in the guide’s COGS-versus-overhead section, and the chart of accounts is where it either gets enforced or doesn’t. If the accounts don’t exist to hold the distinction, nobody downstream can make it either, no matter how careful the bookkeeping is.
Cost codes: the layer beneath the chart of accounts
A chart of accounts tells you what kind of cost something is. A cost code tells you which job it belongs to and what activity it represents within that job. In QuickBooks Online, cost codes are usually implemented as items — “Install Labor,” “Service Labor,” “Refrigerant,” “Permit Fee” — each mapped to the correct COGS account, so that entering a bill or timesheet against the right item automatically lands it in the right account without anyone having to remember the mapping.
The practical setup: build one item list shared across all job types, rather than a separate list per service line. “Refrigerant” behaves the same whether it’s used on an install or a repair; what differs is which job and which class it’s tagged to, which is a separate layer (below) rather than a reason to duplicate the item list. A manageable HVAC item list usually runs 15–25 items — enough to separate what actually matters for costing decisions, not so many that data entry becomes a chore nobody does consistently.
Calculating a burden rate
Base wage is not what a technician-hour actually costs you. The gap between the two is the burden rate, and it’s worth building deliberately rather than guessing.
Two pieces of it are fixed by law and the same for every employer:
- FICA (employer share). 6.2% for Social Security (up to the annual wage base) plus 1.45% for Medicare — 7.65% combined on wages, per IRS guidance for employers.
- FUTA. The federal unemployment tax is 6.0% on the first $7,000 of wages per employee, though most employers receive a credit of up to 5.4% for paying state unemployment tax on time, netting the federal portion to as little as 0.6%. Your actual net rate depends on your state’s timely-payment status with the IRS.
Everything else in the burden rate is genuinely specific to your business and can’t be stated as one industry number: workers’ compensation (priced by your state and your class code, which vary by an order of magnitude between low-risk and high-risk trades), state unemployment insurance (varies by state and by your claims history), and any benefits you provide — health insurance, retirement contributions, paid time off funded through payroll.
A worked example, with illustrative inputs for the parts that vary by business: take a technician earning $29/hour base (the BLS-reported median for the occupation, used here as a stand-in — use your own actual wage). Add 7.65% FICA ($2.22), an illustrative 0.6% net FUTA/SUTA blend ($0.17), an illustrative 8% workers’ comp rate for this example only, not a stated industry rate ($2.32), and an illustrative $3.00/hour toward health insurance and PTO funding. That’s $7.71 in burden on top of $29.00 in wage — a loaded rate of $36.71/hour, about 27% above base wage. Change the workers’ comp class code or the benefits package and the number moves; the formula doesn’t.
Setting up QuickBooks classes or projects
QuickBooks Online supports two complementary tools for this, and using only one usually leaves a gap.
Classes segment your whole chart of accounts by category. Turn on class tracking under Settings, then create three classes — Install, Service, Maintenance — and tag every invoice and bill with the correct one as it’s entered. Run a Profit and Loss by Class report and you get exactly the category-level margin comparison the guide’s worked example showed by hand: install revenue and cost in one column, service in another, maintenance in a third.
Projects (QuickBooks Online’s sub-customer feature) track a single job from quote to close. Every invoice, bill, and timesheet entry gets attached to the specific project, and QuickBooks rolls those up into a project-level profitability report automatically. This is what tells you whether last Tuesday’s specific install job made money, as opposed to whether installs generally are profitable.
Used together: class tells you the category, project tells you the specific job. A technician’s timesheet entry for an install gets coded to both the Install class and that job’s project, and both reports stay accurate from the same entry — no double data entry, no reconciling two separate systems against each other.
Reconciling the structure to your dispatch platform
None of this works if the dispatch platform and QuickBooks disagree about which job is which, or if job-level detail from the field never makes it into the books at all. The monthly reconciliation the guide describes — dispatch-reported revenue against QuickBooks deposits — needs a second layer here: dispatch-reported job costs (labor hours, parts used) against what actually got entered against that job’s project in QuickBooks.
A workable monthly checklist:
- Pull the completed-jobs report from ServiceTitan, Housecall Pro or Jobber for the month, sorted by job type.
- Confirm each job has a matching project in QuickBooks with revenue tagged to the correct class.
- Spot-check a sample of jobs — not all of them — for labor hours and materials actually recorded against the project, not just the invoice total.
- Investigate anything missing a project tag or a class before the month closes, not after.
That last step matters more than it sounds. A job that’s invoiced correctly but never gets its costs tagged to a project or class still looks fine on the surface — revenue is right, the customer was billed correctly — but it silently drops out of every job-costing report that depends on that tag, which defeats the entire point of building the structure in the first place.
If you’d rather this be someone else’s monthly checklist than yours, see how we handle HVAC bookkeeping — job costing, burden rate and dispatch reconciliation included, from $299/month.
Questions about this
Both, usually, and they answer different questions. Classes segment revenue and cost by job type — install, service, maintenance — so you can pull a profit and loss for each category. Projects (sub-customers in QuickBooks Online) track a single job from start to finish, which is what you need to know whether a specific install made money. Most HVAC businesses want both: classes for the category-level view, projects for individual job margins.
There's no single correct number — it depends on your state's workers' comp rate for your class code and what benefits you offer, both of which vary too much to state as one figure. What is fixed and the same for everyone is the employer share of FICA (7.65% of wages up to the Social Security wage base) and the small FUTA/SUTA layer on top. Start there, add your actual workers' comp and benefits costs, and you'll have a real number instead of a guess.
A cost code is a category of cost within a job — labor, materials, permits, subcontractor — and it can exist in your dispatch software, a spreadsheet, or QuickBooks items. A QuickBooks class is a tag applied to a transaction so it can be reported on later. In practice, your cost codes usually become the items or sub-accounts you tag with a class, so the two work together rather than competing.
The mechanics are the same — job type, cost code, and a project or class tag — but where that structure lives differs. ServiceTitan has the most built-in job costing of the three and can push cost detail to QuickBooks directly. Housecall Pro and Jobber lean more on QuickBooks itself to hold the structure, with the dispatch platform mainly tracking what was billed.
Monthly, at minimum, on the same cycle as your books close. Waiting longer means more transactions to check when something doesn't match, and a small discrepancy is far easier to trace when it's three weeks old than when it's mixed in with five months of activity.
Got a question about your own books?
Thirty minutes, no pitch. We'll look at what you've got and tell you honestly what we see.
BOOK A FREE CALL