How Do I Know If a Job Is Profitable? A Walkthrough for Contractors
Ask most contractors what a specific job made and you'll get one of three answers: "I think we did okay on that one," "the customer paid the invoice, so we're fine," or a long pause followed by "I'd have to pull it up." None of those are profit. They're proxies for profit, and they're how shops at $1-3M end up working hard for less margin than they think they're earning.
This post is the walkthrough I wish I'd seen when I first started looking at this problem. By the end you'll know the exact line items that determine real per-job profit and the three places contractors most often get it wrong.
The Formula (It's Actually Simple)
Real per-job profit is a six-line calculation:
Job revenue - Direct materials (everything you bought for this job) - Direct labor (hours × loaded labor rate, all techs) - Subcontractors (anyone you paid that wasn't on payroll) - Callbacks (revisits, warranty work, refrigerant top-offs) - Allocated overhead (your overhead rate × revenue or hours) = Real per-job profit
The math is easy. Getting the inputs right is where contractors lose the plot.
Direct Materials: Get the Receipts
This one is straightforward in concept and a nightmare in practice. You need every material purchase that went into the job: equipment, supplies, fittings, refrigerant, line set, fasteners, the trip to the supply house for the part you forgot.
The mistake most contractors make is using the estimate as a proxy. The estimate said you'd use $3,200 of equipment; the actual cost was $3,400 because the supplier updated prices mid-month. If you don't reconcile the actual purchase receipts back to the job, you're missing $200 of cost on every job — and over a year that's real money.
The other mistake: forgetting the small stuff. The $40 fitting from the supply-house run. The $25 of fasteners. The $60 of refrigerant. Each individually trivial, collectively 3-5% of cost on most jobs.
Direct Labor: Use the Loaded Rate, Not the Base Wage
This is the single biggest mistake contractors make. Your tech earns $30/hour. So you cost labor at $30/hour, right?
Wrong. Your real labor cost per hour worked is the loaded rate, which adds:
- Payroll taxes (FICA, Medicare, SUTA, FUTA) — typically 8-10% of wage
- Workers' compensation insurance — 4-8% for HVAC, higher for roofing
- Health insurance and benefits — varies, often $400-800/month
- Paid time off (you pay them when they're not working)
- Truck and equipment costs allocated per labor hour
For most HVAC, plumbing, and electrical contractors, the loaded labor rate is 1.7-2.0× the base wage. A tech at $30/hour costs you $51-60/hour loaded. If you've been costing jobs at the base wage, you're understating labor cost by 30-45% on every job, and your per-job margins look better than they really are.
Callbacks: The Profit Killer Nobody Tracks
A callback is a revisit to a job after it was closed — to fix something, replace a defective part, or address a complaint. Industry callback rate target for HVAC residential installs is under 8%. Most shops are running 15-30% and don't know it.
Why callbacks destroy margin: a $200 callback eats roughly half the profit on a typical $4,000 service call. Two callbacks on the same job can flip a profitable job into a losing job entirely. And because the callback is usually scheduled days or weeks after the original job closes, it never gets associated back to the job in your accounting.
If you don't tag callbacks back to the original job, you're not measuring real profitability. You're measuring "profitability if everything went right the first time."
Allocated Overhead: The Hardest Honest Number
Overhead is everything that isn't direct cost: rent, insurance, vehicle payments, office staff, software subscriptions, owner salary. It has to get spread across your jobs somehow.
Three common methods:
- % of revenue — simple, works for most service shops. If your overhead runs 15% of revenue, allocate 15% of each job's revenue as overhead.
- $ per direct labor hour — better for labor-heavy work. If overhead is $300K/year and you bill 6,000 direct labor hours, that's $50/hour of overhead on top of the loaded labor rate.
- % of direct cost — fine for shops where labor and materials roughly track together.
The mistake here isn't picking the wrong method — any consistent method beats no method. The mistake is not allocating at all. If you only look at gross profit (revenue minus direct cost) and never apply overhead at the job level, you have no idea whether a 25%-gross-profit job is actually profitable after you spread your overhead across it.
A Worked Example
Let's do a 16-SEER AC changeout. Customer pays $14,800.
- Revenue: $14,800
- Materials (equipment, coil, line set, refrigerant, misc): -$4,650
- Labor (lead tech 14 hrs × $85 loaded + helper 12 hrs × $55 loaded): -$1,850
- Subcontractor (electrical 240V upgrade): -$400
- Callback five days later (low refrigerant, tech revisit + top-off): -$210
- Allocated overhead (8.1% of revenue, 90-day shop average): -$1,200
- Real profit: $6,490 (43.9% margin)
Without callback tracking and proper allocation, the same job looked like a $7,650 profit at 51.7% margin in the gut estimate. The 6-point margin gap is the real number — and across 30 jobs a month, it's the difference between a great year and a fine year.
The Way Out of Spreadsheet Math
If you've made it this far, you're already doing better than 80% of contractors. Most won't even attempt the math because the inputs are scattered across five systems: QuickBooks, your scheduling tool, your supplier invoices, your time tracker, and your bank account.
That's the problem Accomptant solves. It plugs into your QuickBooks in about 10 minutes, pulls actual materials cost from your supplier transactions, pulls labor from your time entries (with loaded rates configured per tech), tags callbacks back to the original job automatically, and applies your overhead rate. The result is a per-job profit report like the one above, generated automatically, the same day you connect. Here's a sample of what comes out.
You don't need a spreadsheet. You need a system that uses the data you already have. $149/month, 14-day free trial, no credit card.