Trades and field service4 min read
Job costing for a service company: burden, callbacks and the 30% mistake
A technician's hour costs far more than the wage on the pay stub, parts go out on trucks without reaching a job, and a 30% markup is not a 30% margin. Here is how a job-margin report puts it right.
T. Wayne Meredith · Financial Management

Most owners of HVAC, plumbing, electrical and other service companies can tell you which jobs felt profitable. Fewer can show it. The job cost report in the field-service app looks reasonable, the price book was built a few years ago, and the business is busy. Then the year closes and the profit is a fraction of what the busy season suggested.
The gap is rarely one big mistake. It is three small ones repeated on every job: labour costed at the wage instead of what the hour really costs, materials that leave on the truck without reaching a job, and prices set with a markup while the budget assumes a margin.
What an hour of labour really costs
The wage is the start of the cost of a technician's hour, not the whole of it. On top of it sit payroll taxes, workers' compensation, health cover and any retirement match, paid time off, and the truck, fuel and phone the technician needs to work at all.
Then there is the time nobody bills. Drive time between calls, the morning at the supply house, training, the call that turned out to need a part, the warranty visit. Service shops report a billable efficiency target of 70–80% for a well-run operation.1 Whatever the figure in your shop, the cost of every paid hour has to be recovered through the hours you can bill.
With illustrative figures:
| Step | Per hour |
|---|---|
| Technician's wage | $30.00 |
| Payroll taxes, workers' comp and benefits, at 30% | $9.00 |
| Cost per paid hour | $39.00 |
| At 75% billable efficiency, cost per billable hour | $52.00 |
That $52, before the truck, the office, the dispatcher or the owner's salary, is the number a price book has to start from. A job costed at the $30 wage leaves out more than 40% of what its labour really cost.
Parts on the truck, callbacks off the invoice
Truck stock. Parts bought in bulk and kept on vans get expensed when they are bought, not when they go into a job. The job report then shows only the parts ordered specifically for it. Good jobs look better than they are, and the monthly margin swings with purchasing rather than with work. The fix is a truck-stock inventory that is replenished against jobs, so each part is costed where it was used.
Callbacks and warranty visits. A return trip for the same problem is real labour and often real parts, and it is rarely invoiced. If it is not recorded against the original job, that job's margin is overstated and nobody learns which work, or which technician, produces the returns. The benchmark behind the efficiency figure above reads in full: Well-run service shops target 70–80% billable efficiency and a 2–5% warranty callback rate.1
Markup is not margin
This is the arithmetic that catches the most owners: a 30% markup is a 23% margin.2 A price built as cost plus 30% gives a gross margin of 30 divided by 130, about 23% of the price. A budget that assumes 30% gross margin and a price book that adds 30% to cost will miss by seven points on every job, before any of the problems above.
To price to a target margin, divide instead of multiplying: cost divided by one minus the target. At a $52 hourly cost and a 50% target gross margin, the hourly rate is $104, not $78.
For context, the median HVAC contractor in the 2024 ACCA benchmarking study kept 5.8% of revenue as net profit.3 Seven points of pricing error is more than the whole margin of a typical shop.
What a job-margin report looks like
A useful report comes from the closed books, not the field app alone, and answers a few questions each month:
- Margin by job type. Service calls, installs, maintenance agreements and project work each have their own margin, and the mix moves the total.
- Margin by technician or crew. Not to rank people, but to find where time and parts are going unrecorded.
- Margin by truck. Which vans carry stock that never reaches an invoice.
- Callbacks. How many, on which jobs, and what they cost.
Behind it sits a job-cost structure in QuickBooks or Xero, with jobs, classes and items mapped to the field-service app, and labour posted at a burdened rate rather than the wage. When the app sync is left to run on its own, revenue can be posted twice and customers duplicated; reconciling it to the ledger each month is part of making the report true.
Rebuilding the price book
Once the burdened labour rate and the real material cost are known, the price book can be rebuilt from them: the hourly cost, overhead as a share of revenue, and a target net margin, with markup ladders by part class so cheap parts carry more margin than expensive equipment. It is worth repeating each year and after any large supplier increase.
How we handle it
In a MTL Services engagement for a service company, the job-cost structure, the monthly reconciliation of the field-service app to the ledger and the job-margin report are part of the close, with the time shown on your usage statement. A full price-book rebuild is a pricing and margin study, a fixed-fee project at $12,000-30,000 fixed.
If you are not sure what an hour of your labour really costs, bring the question to a free consult; it takes 30 minutes. No pitch. You get a one-page note on what we heard and what we would propose.
Sources
-
Steph's Books, “HVAC Profit Margins: 2026 Benchmarks”, 2026. A vendor figure, reported rather than measured. ↑ ↑
-
Relay, “HVAC Flat Rate Pricing: Build a Price Book That Holds”, accessed 2026-09-28. Arithmetic: 0.30 ÷ 1.30. ↑
-
Contractor In Charge, “Average Profit Margins for HVAC & Plumbing in 2026”, April 2026, citing the 2024 ACCA Financial Benchmarking Study. ↑


