HVAC Job Costing: How to Know If a Job Made Money
If the only time you learn whether you made money is when the accountant closes the books each year, it's too late to fix the jobs that lost it. Job costing means adding up what each job really cost (materials, burdened labor, drive time, callbacks, permits, subs, and its share of overhead) and comparing that to what you billed. This guide shows what goes into true job cost, how to split overhead fairly, a fully worked example, a 30-minute weekly routine, and how to feed what you learn back into your prices.
All worked examples below use made-up round numbers to show the math. Swap in your own.
Why job costing matters more than your P&L
Your profit and loss statement tells you whether the whole company made money. It can't tell you which jobs made it and which ones gave it away. A shop can have a decent year while one job type, one tech, or one kind of customer quietly loses money on every ticket. Profitable jobs cover for them, and nobody notices until a slow season takes away the cushion.
Job costing answers three questions your P&L can't:
- Which job types make money? Repairs, maintenance, changeouts, new construction, commercial.
- Are our estimates right? Did the job use the hours and parts we priced in?
- Where is money leaking? Unbilled parts, callbacks, long drives, jobs that ran over.
What goes into true job cost
"Job cost" is every dollar you spent because this job happened. If you only count the equipment and the tech's wage, the job will always look better than it was.
1. Materials (the full landed cost)
- Equipment and parts at what you actually paid, not list price.
- Sales tax you paid on materials, if your state charges it to contractors.
- Freight and delivery charges, including a supply house delivery fee.
- Returns and restocking fees. A wrong part sent back at a restocking fee is a cost of this job.
- Consumables. Refrigerant, fittings, line set, pad, disconnect, whip, tape, filters. Small stuff adds up. Either log it per job or use a flat per-job supplies charge based on your real annual spend.
2. Labor at burdened cost, not wage
An hour of a tech's time costs you more than their hourly wage. Add payroll taxes, workers' comp, health insurance, paid time off, retirement match, and bonuses or commissions paid on the job. That total, divided by hours paid, is your burdened labor rate. Use it for every hour on the job.
Our free HVAC labor burden calculator works out the burdened rate from your own payroll numbers. If you pay commission or spiffs, count them too: see our technician commission and spiff pay plans guide.
3. Drive time and supply house runs
Paid time in the truck on the way to, from, or for the job is labor on that job. So is the 45-minute run for a part that wasn't on the truck. Count it at the same burdened rate.
4. Callbacks and warranty work
A free return trip is still paid labor, fuel, and often a part. Charge it back to the original job, not to "general overhead." Otherwise the job that caused the callback looks profitable and the problem never shows up in your numbers.
5. Permits, inspections, and fees
Permit fees, inspection fees, re-inspection fees, disposal and recovery fees. These are easy to forget on the estimate and easy to pay out of pocket without tagging them to a job.
6. Subcontractors
Electrician, crane, duct fabrication, concrete, drywall patching. Record the sub's final invoice against the job, including any change they billed you for.
7. Job-specific equipment
Rentals (lift, crane, trencher) and anything bought for this job only. Your everyday tools and trucks are not job costs. They go in overhead, covered in the next section.
Allocating overhead: cost per billable hour
Overhead is everything you spend to keep the doors open that isn't tied to one job: rent, trucks, fuel, insurance, office and dispatch staff, software, marketing, phones, tools, accounting, and a fair salary for the owner.
The simplest fair way to spread it across jobs is overhead per billable hour:
Overhead per billable hour = annual overhead / total billable field hours per year
"Billable hours" means hours your field people spend on jobs, including drive time to jobs. It does not mean hours paid. Shop time, training, meetings, and waiting for calls are paid but not billable, which is exactly why they belong in the overhead rate instead.
Example: $390,000 of annual overhead and 6,500 billable field hours = $60 per billable hour. Every hour your crew puts on a job has to carry $60 of overhead on top of its labor cost.
Trucks are often the biggest piece of field overhead. Our free HVAC service truck cost calculator adds up payment, insurance, fuel, maintenance, and truck stock to show what one truck costs per billable hour and per job.
Our free HVAC break-even hourly rate calculator combines burdened labor and overhead into one break-even number per billable hour.
Gross profit vs net profit per job
These two numbers answer different questions. Track both.
- Gross profit = job revenue - direct job cost (materials, burdened labor, drive time, callbacks, permits, subs, job-specific equipment). It tells you whether the job paid for itself.
- Net profit = gross profit - allocated overhead (billable hours on the job x overhead per billable hour). It tells you whether the job actually added to the bottom line after paying its share of the business.
A job can have a healthy-looking gross profit and still lose money once overhead is added. Long jobs with low prices do this most often: every extra hour carries both labor and overhead.
A fully worked example
This is a made-up example with round numbers, not data from any real shop. A changeout job sold at $7,500, done by a lead tech and a helper.
Step 1: Materials
| Item | Cost |
|---|---|
| Equipment and parts (supplier invoice) | $3,000.00 |
| Sales tax paid on materials (7%) | $210.00 |
| Freight / delivery fee | $40.00 |
| Restocking fee on a wrong $100 part returned (15%) | $15.00 |
| Materials total | $3,265.00 |
Step 2: Labor at burdened cost (burden assumed at 35% of wage)
- Lead tech: $32/hr wage x 1.35 = $43.20/hr burdened
- Helper: $22/hr wage x 1.35 = $29.70/hr burdened
| Person | Hours (8 on site + 1 drive, + 0.5 supply run for lead) | Cost |
|---|---|---|
| Lead tech | 9.5 hrs x $43.20 | $410.40 |
| Helper | 9.0 hrs x $29.70 | $267.30 |
| Labor total | 18.5 hrs | $677.70 |
Step 3: Everything else direct
| Item | Cost |
|---|---|
| Permit | $150.00 |
| Electrician (subcontract) | $400.00 |
| Disposal fee | $25.00 |
| Callback two weeks later: lead tech 2 hrs x $43.20 + $20 part | $106.40 |
| Other direct total | $681.40 |
Step 4: Direct job cost and gross profit
- Direct job cost = $3,265.00 + $677.70 + $681.40 = $4,624.10
- Gross profit = $7,500.00 - $4,624.10 = $2,875.90
- Gross margin = $2,875.90 / $7,500.00 = 38.3%
Step 5: Overhead and net profit
- Billable hours on the job = 18.5 (install) + 2 (callback) = 20.5 hours
- Allocated overhead = 20.5 x $60 = $1,230.00
- Net profit = $2,875.90 - $1,230.00 = $1,645.90
- Net margin = $1,645.90 / $7,500.00 = 21.9%
Step 6: What if the job had run long? Each extra hour for the two-person crew costs $43.20 + $29.70 = $72.90 in labor plus 2 x $60 = $120 in overhead, so $192.90 per crew hour. If this job had run 6 hours over for both people:
- Extra cost = 6 x $192.90 = $1,157.40
- Net profit = $1,645.90 - $1,157.40 = $488.50, a net margin of about 6.5%
Same price, same equipment, and most of the profit gone. That's why hours are the number to watch.
Step 7: What price would have hit a 15% net margin? Total cost including overhead is $4,624.10 + $1,230.00 = $5,854.10. Price = $5,854.10 / (1 - 0.15) = $6,887.18. At $7,500 this job cleared the target. If the "6 hours over" version were typical, the price for a 15% net margin would be ($5,854.10 + $1,157.40) / 0.85 = $8,248.82.
Our free HVAC job profit calculator runs this kind of math for any single job.
A simple weekly job-costing routine
You don't need special software to start. You need the same habit every week.
Every day (5 minutes, done by the tech or dispatcher):
- Record clock-in / clock-out per job, including drive time.
- Snap a photo of every supply house receipt and tag it to the job number.
- Note any part pulled from truck stock.
Once a week (about 30 minutes, same day each week):
- List every job closed that week with its invoiced amount.
- Match supplier invoices, receipts, and truck-stock parts to each job. Anything left over is a leak to chase down.
- Add burdened labor hours, permits, subs, and any callback trips charged back to the original job.
- Work out gross profit and gross margin per job.
- Add overhead at your per-billable-hour rate and work out net profit.
- Flag any job below your target margin, and write one line on why (ran long, missed part, callback, underpriced).
- Once a month, group results by job type and by tech. Look for patterns, not one-off bad days.
A spreadsheet with one row per job and these columns is enough: job #, date, type, tech(s), revenue, materials, labor hours, labor cost, other direct, gross profit, gross margin %, overhead, net profit, net margin %, note.
Common leaks to look for
- Unbilled materials. Parts pulled from the truck and never added to the invoice. Compare truck restock purchases to parts billed each month. A gap means money walking out the door.
- Callbacks charged to overhead. If callbacks don't hit the original job, you can't see which jobs, techs, or installs cause them.
- Underestimated hours. Estimates built from your best-case jobs instead of your average ones. Compare estimated hours to actual on every install.
- Change orders done for free. "While you're here, can you..." work that never gets written up or signed. Get every change priced and approved in writing before doing it.
- Drive time and supply runs ignored. Especially on jobs far from the shop or when the right part wasn't on the truck.
- Wrong labor rate. Using wage instead of burdened cost makes every job look better than it is.
- Stale material prices. Estimating from last quarter's supplier prices when costs have gone up.
Feeding results back into pricing
Job costing only pays off if it changes what you charge or how you work.
- Update task times from actuals. If a job type averages 10 hours, not the 8 in your price book, price it at 10. Use the average, not the best job.
- Re-check your overhead rate every quarter. If billable hours drop (slow season, a tech leaves), overhead per billable hour goes up, and your prices need to cover it.
- Price with margin, not markup. A 50% markup is only a 33% margin. Our free markup vs margin calculator converts one to the other.
- Rebuild flat-rate prices from updated hours, burdened labor, and overhead. Our free HVAC flat-rate price calculator does this for each task. For the full method, see our flat-rate vs time and materials pricing guide.
- Stop or re-price losing job types. If one kind of job loses money month after month, raise the price, change how it's done, or stop selling it.
- Coach, don't punish. When one tech's jobs run long or come back more often, it's usually a training, tooling, or process gap. Treat the numbers as a starting point for a conversation.
- Track it as a KPI. Gross margin and net margin by job type belong on your monthly scorecard. See the HVAC KPIs every shop owner should track.
Bring a job to compare
If you'd like other owners to look over a costed job, bring one (numbers only, no customer details) to the Growth Room Discord.