Gross Margin per Job + Job Costing
Why this matters
Most service-business owners track revenue per job + maybe materials cost. Very few track TRUE gross margin per job - labor + materials + truck cost + warranty reserve + everything that touches that specific job. The owners who track this catch the loss-leader jobs before they bleed the business + spot the high-margin work to chase. The owners who don't track this leave 8 - 20% margin on the table month after month.
The full job cost equation
For any job, the true cost to deliver is:
Direct labor cost
+ Materials cost (at YOUR cost, not retail)
+ Subcontractor payments
+ Truck cost allocated (fuel + maintenance + depreciation)
+ Disposal / dump fees
+ Permit fees
+ Job-specific equipment rental
+ Warranty / callback reserve
+ Sales commission (if applicable)
= TOTAL JOB COST
Subtract this from the customer invoice = TRUE Gross Profit. Divide by invoice = TRUE Gross Margin %.
This is different from the simplified "invoice minus materials" most operators use.
Direct labor cost (most-mis-calculated)
Labor cost is NOT just wage × hours. Add: payroll taxes (~13 - 15%), workers comp (3 - 15% trade-specific), health insurance, PTO/benefits (~10%), plus non-billable time (40 - 60% utilization typical).
Example tech: wage + payroll + WC + health + PTO = loaded. At 60% utilization.60 = ** hour**.
That's the real cost. Charge = ~53% margin (good). Charge = ~30% margin (underpriced). Most operators calculate against unloaded wage + lose money.
Materials cost at YOUR cost
Materials cost = what YOU paid the supplier for the parts (NOT what you charged the customer).
Common operator mistake: thinking "I make 30% on materials" without tracking actual supplier cost.
Markup options:
- Standard markup: 30 - 100% over your cost (typical residential service)
- Flat-rate book: customer-facing rate that incorporates parts + labor + margin
- Cost-plus: time + materials at YOUR cost + agreed markup percentage (commercial work)
Track materials at supplier-invoice cost. The receipt is the source of truth.
Truck cost allocation
The truck delivering the tech to the job costs money:
- Loan interest (if financed)
Allocate to jobs:
- Hours method: total truck cost ÷ annual billable hours = truck cost per billable hour
- Mile method: cost per mile × miles driven per job
- Simpler: add 5 - 10% of revenue per job as "truck cost"
Pick a method + stay consistent for tracking.
Warranty / callback reserve
Reality: some jobs come back. Customer reports the heater isn't working 3 weeks after install; tech returns at no charge.
The cost of callbacks is real. Track + reserve:
- Industry average callback rate: 3 - 8% of jobs
- Reserve: 1 - 3% of revenue per job as "warranty reserve"
- Funds the inevitable warranty + callback work
Operators who don't reserve get hit by callbacks that erode margin invisibly.
Job costing example: HVAC repair
Customer's blower motor failed; replacement install.
- Gross margin: 51% - healthy for HVAC
If you'd skipped truck cost + warranty reserve, you'd think margin was 61% - overstating by 10 points.
Job costing example: roof replacement
Tear-off + new shingle. Invoice . Materials (at your cost), labor 32 hrs × = disposal truck (5%) warranty (2%) . Total cost → gross profit = 34% margin.
Quoted at instead → gross profit = 26%. Same job, underpricing kills margin.
What to do with this analysis
Track each job in the same format
Most modern field-service software (Manuall, ServiceTitan, Housecall Pro) has job costing built in. Use it. Enter:
- Time logged per tech per job (mandatory)
- Material cost per job (entered at procurement, not estimated)
- Truck allocation auto-applied
- Reserve auto-applied
- Compute margin per job automatically
Review monthly
- Sort jobs by margin %
- Identify the loss leaders (margin < 25%)
- Identify the winners (margin > 50%)
- Patterns: customer type, job type, tech, day-of-week, time-of-day
Action on patterns
- Loss-leader customer: drop them OR repricing conversation
- Loss-leader job type: raise pricing OR stop offering
- Winner job type: market for more of these
- Winner tech: study what they do differently
The single most-impactful job-costing change for most operators is tracking TIME ACCURATELY. Techs underreport time on jobs (they don't track drive time + diagnostic time + paperwork time). The real time per job is 40 - 80% MORE than what gets logged. Use GPS timestamps from job-to-job in your dispatch app + auto-allocate drive time as billable. Suddenly your "60% utilization" job costing reveals true labor cost is 1.4 - 1.8x what you assumed. Pricing recovers. Margin reappears.
Diagnostic + repair vs install: different margin reality
Service businesses typically have a margin gradient:
- Diagnostic (single visit, time-only): 60 - 80% margin (high)
- Small repair (1-hour fix, simple parts): 50 - 70% margin
- Medium repair (multi-hour, multiple parts): 40 - 60% margin
- Install (whole-system replacement): 25 - 40% margin (lower)
- Maintenance contract (recurring): 55 - 70% margin (high)
This is why "selling membership" + "selling maintenance" drives so much profitability - those service lines have the highest margins.
References
- "Pricing for Profit" - Profit First framework adaptation
- NEXTAR Manual / Job Costing Best Practices
- ServiceTitan, Housecall Pro, Manuall job-costing reports
- Manuall internal: Reading a P&L Statement for a Service Business, Pricing Strategy Fundamentals