Job Costing for Contractors: Know Which Jobs Make Money
Job costing for contractors made simple: true labor burden, real material prices, overhead per hour, and the 20-minute review that shows which jobs pay.

Ask most small-shop owners what they did in revenue last month and they will tell you within a few hundred dollars. Ask which of last month's jobs actually made money and the room goes quiet. Revenue is easy because the bank statement does it for you. Profit per job is where the real answers live, and almost nobody in a 1 to 8 truck shop can see it.
That gap is not a character flaw. It is a bookkeeping problem. The accountant tells you in April whether the year worked out, but by then the money is already made or lost. Job costing moves that answer from tax time to this week, one job at a time. Here is a method simple enough to actually stick.
What job costing for contractors actually means
Job costing is just answering one question honestly for each job: what did it truly cost us to deliver this, and what was left over? The word that matters is truly. Most owners who "know their costs" are counting the wage and the parts receipt and nothing else. The real number has four pieces.
True labor burden, not the wage
Your tech's wage is the starting line, not the cost. Say you pay a service tech $32 an hour. Add payroll taxes, workers comp, health contribution, the truck payment, fuel, insurance, phone, and tool allowance, and that tech costs you closer to $50 an hour on the clock. Now the part everyone skips: he is not billable for every hour you pay him. Drive time, supply-house runs, shop mornings, and slow Tuesdays mean a full-time tech might produce 1,400 billable hours out of 2,080 paid ones. Divide the total annual cost of keeping him rolling by the hours you can actually bill and the true burdened rate lands in the $60 to $70 range. That is the number to cost jobs with. Anything less and every job looks more profitable than it is.
Materials at real supplier prices
Cost materials at what you actually paid this month, not what the price book said in January. Copper, refrigerant, wire, and PVC have all moved enough in recent years that a stale price sheet quietly eats two or three points of margin on every job. Keep it simple: cost the job from the supplier invoice, not from memory.
Overhead per billable hour
Rent, office help, software, marketing, insurance, your own salary. Add up a year of it, divide by your shop's total billable hours, and you get an overhead load per hour. For many small shops that lands between $15 and $30 per billable hour. Every job carries its share. A job that ignores overhead is not profitable, it is just donating to the jobs that do carry it.
Callbacks, the silent eraser
A callback is a job cost that shows up after the job is closed, which is why it never gets counted. A $250 return visit against an $1,800 job takes a healthy 35% margin down to about 21% and nobody ever writes it down. If you track one thing beyond labor and materials, track which jobs came back. It pairs directly with the callback rate we covered in the metrics that matter for a small shop.
Job costing for contractors: three worked examples
Numbers make this real. Yours will differ, the method will not.
HVAC changeout. Sold at $8,400. Equipment $3,900, materials and permit $450. Two techs, 18 combined hours at a $62 burdened rate is $1,116. Overhead at $25 per billable hour across 18 hours is $450. Total cost $5,916, gross profit $2,484, about 30%. Healthy, and now you know it instead of feeling it.
HVAC service call. $340 ticket for a diagnostic and a capacitor. The part cost $19. But the tech burned 2.5 hours including the drive, which is $155 of burdened labor plus $63 of overhead. Total cost $237, profit $103, about 30% on paper but only $103 of actual dollars for half a morning of truck time. This is exactly why flat-rate pricing on service calls matters so much: the margin percentage can look fine while the dollars per hour quietly starve you.
Landscaping route. A two-man crew cuts 22 lawns at $55, so $1,210 for the day. Eighteen combined hours at a $38 burdened rate is $684, fuel and trimmer line maybe $50, overhead around $200. The day nets roughly $276. Now cost the two lawns at the far end of the route that add 50 minutes of windshield time. Those $55 cuts cost you close to $70 each to deliver. The route is profitable. Those two stops are not. That is a decision you can only make with job-level numbers.
Revenue tells you the shop is busy. Job costing tells you which jobs are worth being busy on.
The 20-minute weekly job-cost review
You do not need a controller. You need 20 minutes, once a week, same day every week.
- Pull last week's completed jobs. Skim, do not audit.
- Flag any job where labor hours ran more than 20% over the estimate.
- Flag any job where material cost beat the quote.
- Note every callback and pin it to the original job and tech.
- Pick the single worst job and ask why, out loud, once.
That last step is the whole game. One honest "why did the Hendersons' repipe eat 6 extra hours" per week fixes pricing, estimating, and training faster than any quarterly report ever will.
Why the spreadsheet dies by August
Every owner who tries this on a spreadsheet builds it in February, full of resolve. By August it is three weeks behind, half the material receipts are in a truck door pocket, and the tab quietly stops getting opened. The problem is not discipline. It is that a spreadsheet asks you to re-enter, at night, information that already existed during the job: the hours worked, the parts used, the return visit. Job costing done as a second shift of data entry always loses to sleep.
The fix is capturing costs as the job happens instead of reconstructing them at tax time. When the tech's time logs from the jobsite, materials come off the estimate or the supplier invoice, and a callback links itself to the original job, the job-cost report is a byproduct of doing the work, not homework stacked on top of it. That is how we built FieldCommerce: the 20-minute review is just reading what the week already recorded, and the burdened labor rate and overhead load are baked in so every closed job shows its real margin, not its flattering one. And a profitable job with a 45-day collection lag is its own problem, one we covered in cutting your DSO.
Start this week, even on paper. Cost your last five jobs with the full burdened rate and the overhead load, and at least one result will surprise you. When you are ready to have the numbers show up on their own, get in touch and we will walk through it on your jobs, or see how it fits your trade at FieldCommerce for HVAC.