How to Cost Callbacks and Rework Honestly

Why this matters

A callback is the only kind of work a shop routinely performs, pays for, and then does not record as costing anything. It has no invoice, so revenue-driven reports never see it. The hours often get logged onto the original job or onto a general shop code, so job costing never sees it either. The result is a shop that believes a job type is profitable because the profitable part of it was measured and the unprofitable part was not. Costing rework honestly is not about assigning blame. It is about making sure the number you bid against next year includes everything the job actually consumed this year.

The rule the rest of this rests on

A callback answers two different questions, and they need two different fields.

Where was the cost consumed? On the callback visit. That is where the hours were worked and where they belong for counting, scheduling, and payroll purposes.

Where was the cost caused? On the original job. That is where it belongs for judging whether that job, and that job type, actually made money.

Collapse the two and you lose one of them. Log callback hours onto the original job and you can no longer count callbacks at all, and you have also corrupted the original job's estimate variance, because the estimate never contemplated a return trip and comparing against it is now meaningless. Log them only on the callback and never link back, and you can count callbacks but never attribute them, so no job type ever learns anything.

Step 1: Open a real job for every callback, with no exceptions for the quick ones

Every return visit gets its own job record, including the ten-minute one, including the one where a tech was passing by anyway, including the one nobody intends to bill. A zero-charge visit is not a zero-cost visit, and a visit that exists only in someone's memory cannot be counted.

One gate comes before any of this. If the callback is reported as a gas odor, tell the customer on the phone to get everyone out of the building immediately, touch no switches and no thermostat, use no phone inside, and call the utility and you from outside. If it involves water in contact with energized equipment, tell them to stay out of the area and shut off power at the panel only if the panel itself is dry and reachable without standing in water, otherwise leave it and call the utility. Dispatch on the hazard first. The cost coding happens after the site is safe, and it happens on the same day, not from memory at month end.

Step 2: Book the hours where they were consumed, then link where they were caused

The callback job carries the hours, the parts, and the drive. It also carries one mandatory field: the original job number. Make that field required to close the callback, because an unlinked callback is an anonymous cost and will end up in overhead.

Keep the original job's estimate-versus-actual figures untouched by the callback. Those numbers grade the estimate. Then derive a second figure for the original job, its true cost including linked rework, which grades the job. Both are real, they answer different questions, and a shop needs both. Reporting only the first flatters your estimating. Reporting only the second makes it impossible to tell a bad estimate from a bad execution.

Step 3: Assign one cause code at close, from a short fixed list

Six codes is the working maximum. More than that and techs pick whichever one is nearest the cursor. A workable set:

  • Workmanship - it was installed, connected, set, or adjusted wrong.
  • Diagnosis - the first visit fixed something that was not the fault, or missed a second fault.
  • Part failure - the component failed on its own inside its warranty.
  • Customer-caused - settings changed, the equipment was misused, something else on the property caused it.
  • Scope or expectation - the work was correct but did not cover what the customer thought it would.
  • Unknown - genuinely undetermined after the visit.

Assign exactly one, at close, by the tech who went back. Not by the office, and not by the person who did the original job, for reasons that are obvious and worth stating out loud once to the crew.

If the "unknown" bucket exceeds roughly one in ten of your callbacks, the codes are not being taken seriously and the whole dataset will be soft.

Step 4: Set an attribution window and stop arguing about it

You need a rule for how long after a job a return visit still counts against it. Default to 90 days, or the length of your labor warranty if that is longer, and apply it mechanically. Ninety days is long enough to catch the workmanship failures that show up under load or under a season change, and short enough that you are not attributing a two-year-old service call to an install crew that has since turned over.

Outside the window, a return visit is a new job with its own economics. Inside it, the visit attaches to the original whether or not you decide to charge for it. Deciding to charge is a customer conversation. Attribution is a bookkeeping fact and it does not move based on who pays.

Step 5: Cost the callback fully, especially the parts you gave away

The callback job carries the same cost structure as any other: labor hours at burdened cost, round-trip drive, and every part consumed, at what you paid, even when the customer was charged nothing. A part fitted free on a callback is a cost. Booking it as shop stock or a warranty write-off outside job costing removes it from the job type that caused it.

Where a component was replaced under a supplier warranty, record the part cost as recovered and the labor as not, because that is what actually happened. Supplier part warranties almost never reimburse your labor, and treating a part-warranty callback as costless is one of the more common ways a failure-prone component keeps getting specified.

Step 6: Restate the original job's margin, and keep both numbers

Once the callback closes, recompute the original job's realized margin including the linked rework, and keep that alongside the pre-rework figure. Roll the rework-inclusive number up to the job type. That rolled-up figure is the one to bid against, and it is usually the first time an owner sees what a job type genuinely earns.

A worked case: one repair type, one quarter

Forty-six jobs of a repair type closed in the quarter, carrying 128 billed labor hours between them, an average of 2.78 hours per job. Five callbacks landed inside the 90-day window, a callback rate of 5 of 46, about 10.9% of jobs of this type.

The five callbacks consumed 11.5 labor hours plus 3.0 hours of round-trip drive, so 14.5 loaded hours, which is 14.5 against 128 billed hours, about 11.3% of the type's billed labor. None of it was invoiced except as noted below.

By cause code:

Cause Callbacks Loaded hours Recovered?
Workmanship 3 9.5 No
Part failure 1 2.4 Part only, labor not
Customer-caused 1 2.6 Yes, billed at normal rates

The customer-caused visit was billed, so its 2.6 hours come out of the unrecovered pool. That leaves 14.5 - 2.6 = 11.9 unrecovered loaded hours, which is 11.9 against 128 billed hours, about 9.3% of the type's billed labor given away. Of those 11.9 hours, workmanship accounts for 9.5, roughly 80%, and all three of those callbacks trace back to the same step in the procedure.

What it does to one job. Take the worst of the three. The original job billed 3.0 labor hours; the callback consumed 3.4 loaded hours, so true labor was 6.4 hours, more than twice what was billed. Index that job's original cost to 1.00 with labor at 0.55 and parts at 0.45, priced at 1.85 times cost for a quoted margin of 0.85 / 1.85 = 45.9% of price. Adding the callback labor at 3.4 against 3.0 original hours raises the labor component to 0.55 x (3.4 / 3.0) = 0.62 on top of the original 0.55, taking total cost to 1.62. Realized margin becomes (1.85 - 1.62) / 1.85 = 0.23 / 1.85 = 12.4% of price. One callback took that job from 45.9% to 12.4%.

What it does to the type. Spread the 11.9 unrecovered hours across all 46 jobs and the average job picks up 11.9 / 128 = 9.3% more labor, which on a cost mix of 0.55 labor adds 0.55 x 0.093 = 0.05 to a cost index of 1.00. Blended margin for the type falls from 45.9% to (1.85 - 1.05) / 1.85 = 0.80 / 1.85 = 43.2% of price, a drop of 2.7 percentage points.

That contrast is the reason callbacks stay invisible. Individually they are catastrophic, and averaged across a quarter they present as a couple of margin points that look like noise. Neither view is wrong. The individual view is what tells you to fix the install step; the blended view is what tells you the type's labor line needs to carry about 9% more hours than the field consumes on a clean job, until the fix is proven.

What changes the answer

Time and materials work. On genuine T and M, a callback caused by your workmanship is still not billable, so the treatment above is unchanged. A callback caused by the customer usually is billable, and the coding is what determines the conversation.

When a callback turns into a sale. It happens, and it should not be laundered. Book the rework hours as rework and the new work as its own job with its own revenue. Netting them makes a workmanship failure look like a good day.

Multi-tech shops. Send someone other than the original tech where you can, and make the cause code the returning tech's call. This is a data-quality decision more than a fairness one: the person who made the mistake is the least reliable narrator of what the mistake was.

Short warranties. If your labor warranty is 30 days, you still want the 90-day window for costing, because the causal link does not expire when the obligation does. Attribute inside 90 days, and decide separately whether you charge.

How to verify the numbers are honest

Three checks, all fast.

Count the blanks. Callback jobs with no original-job link, and callback jobs with no cause code. Both should be zero. Any number above zero means the required fields are not actually required.

Reconcile the hours. Total callback labor hours for the period should be a sensible fraction of total paid hours. A shop that believes it has a 10% callback rate and can only find 1% of its hours on callback jobs is not measuring, it is estimating.

Look for the zero-charge visits. Search for completed jobs with cost and no invoice at all. If your system contains none, that is not a sign of quality, it is a sign that free visits are being handled outside the system entirely, which is the exact behaviour this whole procedure exists to stop.

References

  • U.S. Small Business Administration (SBA), cost control and quality cost guidance for small business
  • Trade-standard practice for warranty and rework cost capture
  • See related: Tracking Callbacks to Find Your Real Warranty Cost, Deciding Whether a Callback Is Warranty or Billable, The Callback Root Cause Log That Pays for Itself, The True Cost of a Return Trip