Cost per Job, and What Is Actually Inside It

Why this matters

Cost per job looks like the companion to your margin figure and it is not. It is computed over a different population of jobs, it holds a deliberately incomplete set of costs, and under the one condition every owner cares about - a rising load of free visits - it moves in the flattering direction while the shop gets worse. Most of the value in this number is in knowing what it leaves out, so that is where most of this card sits.

The denominator is not the margin figure's denominator

Cost per job is the mean of each completed job's direct cost, taken over every completed job in the period, including the ones that carried no revenue: the warranty return, the no-charge callback, the goodwill visit, the quote that took a truck.

The margin percentage sitting next to it excludes those jobs entirely, because a job with no revenue has no margin percentage to take.

So the two figures are computed over different populations by design, and no arithmetic reconciles them. That is not a defect to be fixed. A cost average wants every trip the shop paid for, because every one of them consumed labour and travel. A margin average wants only the jobs that had a price, because that is the only population where a percentage exists. Ask each one the question it is built for and stop trying to make them agree.

The worked month

A shop completes 34 jobs. 29 carried revenue; 5 did not (2 warranty returns, 3 no-charge callbacks). Index cost in units where 1.0 unit is roughly one hour of a technician plus the travel around it.

  • The 29 billed jobs carry direct cost averaging 2.4 units each, so 69.6 units in total.
  • The 2 warranty returns cost 1.9 units each (they carried parts), so 3.8 units.
  • The 3 no-charge callbacks cost 0.8 units each, so 2.4 units.
  • Free-visit cost absorbed: 3.8 plus 2.4, which is 6.2 units.

Cost per job is 69.6 plus 6.2, or 75.8 units, over 34 jobs: 2.23 units.

Cost per billed job is 69.6 over 29: 2.4 units.

The headline figure therefore reads 7.1 percent below what a job that earned actually cost to deliver, because (2.4 minus 2.23) over 2.4 is 0.071. On a shop with a small free-visit load that discount is negligible. On one with a large load it is the whole difference between what you think a job costs and what a paying job costs.

When the number moves the wrong way

Now hold the billed work completely still - same 29 jobs, same 69.6 units of cost - and let the free visits grow. Six more no-charge callbacks at 0.8 units each arrive, adding 4.8 units of absorbed cost.

  • Completed jobs: 40. Total cost: 75.8 plus 4.8, or 80.6 units.
  • Cost per job: 80.6 over 40, which is 2.02 units.

Cost per job just fell from 2.23 to 2.02 units, an improvement of 9.6 percent, in a month where the shop absorbed 11.0 units of free-visit cost against 6.2 the month before - a rise of 77 percent. Nothing about the paying work changed.

The mechanism is simple once you see it: free visits are usually cheap visits (no parts, short on site), so adding them to the denominator drags the mean down faster than their cost pushes the numerator up. Meanwhile the margin percentage never saw them, and average ticket never saw them either, because they have no invoice.

So a rising free-visit load makes cost per job look better. If you watch only this number, a quality problem or a scoping problem reads as cost control. The fix is not to change the figure, which is correctly built for its own purpose. It is to carry the free-visit count beside it, always.

What is inside the cost

Four components, and each one has a detail that changes the number materially:

  • Technician labour, at what an hour of that specific technician costs. An hourly technician is priced at their rate as it stands. A salaried technician is priced at the annual figure divided across the hours in a working year, conventionally 2,080 hours (40 hours a week times 52 weeks) - which assumes all 2,080 of those hours are worked, so it understates the hourly cost of a salaried technician, who is paid for the whole year but spends part of it on paid leave, holidays, training and shop time rather than on jobs. A per-job pay arrangement contributes its flat rate once per technician on the job, not once per hour. Get this wrong in the obvious way, by pricing a salaried technician's hours at the annual figure, and the job's labour cost comes out about 2,000 times too high, because the divisor that got skipped is the working year.
  • Parts, at the cost snapshotted when the part was used. Not the current catalogue cost. This is what stops a supplier price rise in June from quietly rewriting the margin on a job closed in March.
  • Travel. In most shops this is the one component still typed in rather than derived, which makes it the one most likely to be blank. A blank travel column does not read as missing data, it reads as a job with no drive, so the far-side-of-the-county call and the one two streets away come out identical. If your travel figures are mostly zeros, the cost figure is a labour-and-parts figure wearing a different name.
  • Permit fees and subcontractor cost the shop absorbed. Anything the customer or a general contractor pays separately is a passthrough and correctly drops out, which means the same permit on two jobs can land in cost on one and not the other. That is right, and it is also a reason to check how those rows are flagged before comparing job types.

What is deliberately outside it

This is the half that decides what the number can be used for. Not in cost per job:

  • The truck itself - payment, insurance, maintenance, licensing. Travel time is in; the vehicle is not.
  • Shop rent, utilities, phones, tools, software, insurance.
  • Office, dispatch and management wages.
  • The owner's time, whether or not the owner takes a wage.
  • Marketing, sales and estimating time on work that did not convert.

And the one that surprises people: labour burden may or may not be inside, and it depends entirely on which rate you entered. If the pay rate in your records is the number on the technician's pay stub, then payroll taxes, workers' compensation, benefits and paid time off are NOT in your cost per job, and the figure understates direct labour by the burden factor - which is not small. If you entered a fully burdened rate, they are in. Nothing in the figure itself tells you which, so go and look at one technician's stored rate before you trust any comparison built on it.

The consequence of the exclusion list is the single most important thing about this number: cost per job is a direct-cost figure, so a job priced above it has cleared delivery cost and nothing else. It has contributed nothing yet to rent, to the truck, to the office or to the owner. Pricing at cost per job plus a fixed markup is the standard way a shop stays busy and ends the year with nothing, because the markup has to carry every excluded item on that list before any of it is profit.

The cut that makes it useful

A single blended cost per job for a shop that runs both short calls and multi-day installs describes no job the shop actually did. Split the worked month's 29 billed jobs by type: 25 service calls at 1.2 units of cost each, which is 30.0 units, and 4 installs at 9.9 units each, which is 39.6 units. Those sum to 69.6 units, exactly the total used above, and the blended mean is still 2.4 units per billed job.

Not one of the 29 jobs cost 2.4 units. They cost 1.2 or 9.9. The mean sits in a gap where no job lives, and it will move every month purely on how many installs landed, with nothing about either type changing.

So the decision cost per job supports is a per-type one. Knowing a service call consumes 1.2 units of direct cost tells you the floor that a service call's price has to clear before any of the excluded overhead gets recovered, and it tells you what a second visit on that type really costs you to eat. Knowing the shop blend consumes 2.4 units tells you nothing you can price against. Compute it per job type, compare types against each other, and treat the shop-wide figure as a trend line at best.

The subtraction that is always wrong

The tempting move is to subtract cost per job from average ticket and call the difference profit per job. It is wrong three ways at once, and it survives because the answer usually looks plausible.

Take the worked month. Say average ticket reads 3.60 units, the month's 104.4 units of billed revenue over 29 invoices, before the sales tax a real ticket also carries. Cost per job reads 2.23 units. The difference is 1.37 units, which is 38.1 percent of the ticket, and that number will not look alarming to anybody.

Now the real figures. Margin on the billed work, weighted, meaning total billed revenue less total billed cost over total billed revenue, is (104.4 minus 69.6) over 104.4, or 33.3 percent. Weighted again after absorbing the free visits, it is (104.4 minus 75.8) over 104.4, or 27.4 percent. Neither is the per-job percentage average that sits beside cost per job. The naive subtraction landed at 38.1 percent, above both real figures, purely on this month's mix. Next month it can land between them or below both.

The three faults, in order of size: the denominators differ (invoices for the ticket, all completed jobs for the cost), average ticket carries sales tax and cost per job carries none, and the cost side excludes every item on the list above. Any one of them breaks the subtraction.

Checking yours

  1. Count completed jobs and count jobs with revenue for the same period. The difference is the free-visit load. Write it down every period next to the cost figure; it is the context that stops you misreading a fall.
  2. Compute cost per billed job as well - total cost over jobs with revenue - and keep both. The gap between them is the free-visit drag, and it is the number that moves when quality or scoping slips.
  3. Open one technician's stored pay rate and confirm whether it is the bare wage or a burdened rate. Then open one salaried technician's and confirm the annual figure is being divided by a working year rather than used as-is.
  4. Open one closed job from a quarter ago and one from last week that used the same part. If the recorded part cost differs and the catalogue price changed between them, snapshotting is working. If both show today's cost, it is not, and every historic margin in your records moves whenever a supplier does.

References

  • See related: Gross Margin per Job + Job Costing - how a single job's direct cost is assembled
  • See related: Labor Burden: The Real Cost of an Employee - what sits between a pay rate and an hour's true cost
  • See related: Zero-Revenue Jobs and Which Numbers They Touch
  • See related: Gross Margin Percent Is an Average of Averages - why the margin figure beside this one is computed on a different basis