Why is the job costing in our field service software wrong?
Because it counts what was billed and only some of what was spent. The usual omissions are drive time, unbilled return visits, warranty callbacks, materials pulled from truck stock without being recorded, and any overhead at all. The gross margin your system shows is really a line-item margin. It is useful for comparing jobs to each other and misleading if you read it as profit.
What the system knows and what it assumes
Job costing in most field service platforms is built from three inputs: labor hours recorded against the job, materials attached to the job, and a labor rate you configured. Each of those is an approximation, and the errors run in the same direction — understating cost, which overstates margin.
The labor rate is usually a wage, not a loaded cost. Recorded hours usually start when the technician arrives. Materials only count if someone recorded them. None of this is a defect in the software; it is a limit of what the software can observe.
The five leaks, roughly in order of size
- Drive time. Paid, sometimes substantial, and frequently not attached to any job. In dense urban routes this is smaller than owners expect; in rural service areas it can dominate.
- Return visits and callbacks. A warranty return has labor and no revenue. If it is logged as a separate zero-revenue job, the original job still looks profitable and the callback looks like a loss out of nowhere.
- Truck stock. Consumables and small parts pulled without being recorded on the job. Invisible individually, material in aggregate.
- Loaded labor cost. Wage plus payroll taxes, insurance, benefits, vehicle and non-billable time. The multiplier over base wage is significant and specific to your business.
- Overhead allocation. Dispatch, office, marketing and management costs are not in the job record at all, by design.
How to make it usable without rebuilding accounting
You do not need perfect job costing. You need consistent job costing, because the main use is comparison. Two changes get most of the way there: load the labor rate so it reflects real cost rather than wage, and make callbacks link to their original job so the pair can be evaluated together.
After that, compare within categories rather than across them. Two replacements are comparable. A replacement and a service call are not, and ranking a mixed list by margin mostly ranks it by job type.
The number worth adding
Revenue per available technician hour — total revenue divided by hours the team was on the clock and available — is often more decision-useful than per-job margin, because it captures the drive time and idle time that job costing drops. It is also harder to game.
Getting to it requires joining payroll or time data to job data, which is ordinary integration work, and it is the kind of derived metric that belongs in a custom dashboard rather than in the field service platform's own reporting.
Topics: job costing · margin · labor · reporting
Have a version of this question about your own business?
The useful answer usually depends on which systems you run and how they're connected. That's a conversation, not a blog post.