The Error That Hid in the Books for Eleven Months

Why this matters

The bookkeeping errors that do real damage are not the ones that break something. They are the ones that make a report agree with itself. Every account reconciled every month. The statements went out on the fifth working day all year. The bookkeeper did nothing wrong, and neither did the technicians. The error was created by a sentence in a coding rule that did not anticipate a situation, and it survived eleven months because nothing in the system was designed to notice a cost that had quietly stopped belonging to anything.

This is a reconstruction. The error had already been corrected by the time the full picture came together, so the work was reading backwards from what got written down, and the most useful part of the finding turned out to be what was not written down.

The complaint that did not match the numbers

A shop of nine, mixed residential service and small commercial. In the twelfth month the owner sat down to price a commercial bid for a repair category the job-cost report ranked as the best-margin work in the shop: 52% gross margin against a shop blended margin of 42%.

The lead technician's reaction, more or less: that job type is the one we keep going back out on.

Two things were true at once, and both had evidence. The report said the work was the most profitable in the shop. The people doing it said it consumed more time than any other category. That contradiction is the signal, and it is worth naming as a general one: when the report and the crew disagree about the same work, the report is usually measuring a smaller thing than the crew is living.

Starting from the ledger rather than the symptom

The instinct is to re-cost some jobs. That was skipped deliberately, because re-costing individual jobs tests whether the arithmetic is right and the arithmetic was never in question. What was in question was whether the boundary of a job was drawn where everyone assumed.

So the first move was to look at the chart of accounts for anything holding cost that no job was attached to.

One account stood out: an overhead category, roughly translatable as "warranty and rework." Its first entry was dated in the second month of the year. It had received entries in every month since, a total of eleven months including the month of discovery, and it had grown steadily.

Nobody in the shop could say who decided to create it or why. That absence is the first gap in the record, and it is a finding, not a dead end. An account that appears without a decision behind it is almost always an answer to a question somebody had and never asked out loud.

What the ticket record showed

Reading forward from the account's first entry date and matching it against the field records produced the sequence.

Around that time the shop had started flagging callback visits as no-charge tickets. A tech going back out to finish or redo work opened a ticket like any other, logged their hours like any other, and marked it no charge. Sensible workflow, correctly used, and adopted without anyone thinking of it as an accounting change.

The coding rule in use read, in substance, that direct job cost attaches to the job that generated the revenue. A no-charge ticket generates no revenue. Under the rule as written, the labor on that ticket had nowhere to go, so the bookkeeper did the reasonable thing: created a bucket for it and coded consistently to that bucket every month for eleven months.

Which surfaced the second gap in the record. The no-charge tickets carried no link to the job that caused them. The field system allowed a callback to be opened without naming a parent job, and most of them were. So even someone who wanted to push those hours back to the originating work had nothing to push them back with, except the technician's memory and the customer address.

Pushing the hours back where they belonged

The reconstruction used the address and the customer to match callbacks to their originating jobs, which was slow and imperfect and good enough. Here is what came out for the repair category in question, over the eleven months.

  • Jobs of that type completed: 210
  • Callback tickets traced to them: 38, a callback rate of about 18.1%
  • Billable labor on an average original ticket of that type: 3.2 hours
  • Labor on an average callback: 2.4 hours, which includes the second travel leg and re-diagnosis

Original labor across the 210 jobs is 672 hours. Callback labor is 91.2 hours. The callbacks added about 13.6% to the labor hours that job type actually consumed, and none of those hours had ever appeared against it.

Converting that into the margin figure the owner was about to bid from. The job type's reported cost structure was 30% of revenue in direct labor and 18% in materials, so 48% direct cost and 52% gross margin. Add 13.6% to the labor share and it becomes about 34.1%. Callbacks also consumed parts, on 21 of the 38 visits, adding an estimated 2 points to materials, taking it to 20%.

Corrected direct cost is about 54.1%, so the true gross margin on that job type was about 46%, not 52%. Six points lower, on the number the owner was about to build a multi-year commercial bid around.

Note honestly what that does and does not prove. At about 46% the work is still above the shop's 42% blend, with one caveat that matters: the 42% is pre-correction, computed with the same rework hours still parked in overhead. Push rework back shop-wide and the blend drops about a point too, so the real gap is slightly wider than it looks. Correct the comparator or say it is uncorrected; do not compare a fixed number against an unfixed one. It did not turn out to be a loser. It turned out to be ordinary rather than exceptional, and the practical consequence is not that the shop should stop doing it, it is that the bid would have been priced with a 6-point cushion that did not exist.

The shop-level number that made it a system problem

Running the same push-back across all job types over the same eleven months:

  • Total callback tickets: 118, averaging 2.2 hours each, so about 259.6 hours of rework labor
  • Total direct labor hours in the period: about 6,100
  • Rework as a share of direct labor: about 4.3%

Slightly over four percent of the shop's labor was work that had been performed, paid for, and made invisible to every costing decision the shop made that year.

The distribution mattered more than the total. That repair category was 210 of 1,240 completed jobs, about 16.9% of the shop's volume, and it produced 38 of 118 callbacks, about 32.2%. It generated roughly 1.9 times its share of rework. That ratio is the actual finding, and it is one no financial statement would ever show, because at the statement level the rework was one flat overhead line whose only visible property was that it grew.

The four gaps that let it run

Each of these is a place where the record was silent, and each silence did specific work.

  1. The coding rule did not say what happens to a cost on a job with no revenue. This is the root cause. The rule was not wrong, it was incomplete, and an incomplete rule gets completed by whoever hits the gap first.
  2. The new account was created without a recorded decision. With an exceptions list in place, the bookkeeper's entirely reasonable question would have gone to the owner in week one instead of being solved locally.
  3. Callback tickets had no parent-job link. This is what made the error unrecoverable rather than merely undetected. Cost that cannot be traced back to its cause is not costed, whatever account it sits in.
  4. Nothing reviewed accounts that hold cost with no revenue attached. The monthly variance review compared each account against its own trailing average, and an account that grows steadily from a standing start passes that test forever.

Gaps 1 and 2 are about the relationship between owner and bookkeeper. Gaps 3 and 4 are about the system. All four had to be open for eleven months to pass.

What got fixed, and in what order

First, the parent-job link, before anything in the accounting file was touched. A no-charge ticket now cannot be closed without naming the job it relates to. Fixing this first is deliberate: it stops the record from getting less recoverable while the rest is sorted out.

Second, the coding rule, extended by one clause: rework labor codes to the job that caused it, and where the causing job cannot be identified, the ticket goes on the exceptions list rather than into a bucket.

Third, an exceptions list, which the shop had never had.

Fourth, a standing quarterly review of any account holding cost with no revenue attached. The trigger they set: when traceable rework exceeds 2% of direct labor hours in a quarter, measured at shop level, the hours get pushed back to job types that quarter rather than annually. Below 2%, an annual push-back is enough. Hours rather than currency, because hours are what the field records natively and what a job type's price has to cover.

What was not done: the financial statements for the year were not restated. Total costs were right and the net result was right. Be precise about what did move, though: the misplacement was between an overhead account and job cost, and that is exactly the line gross margin is drawn above, so reported gross margin was overstated all year while the bottom line was not. It is a management-reporting problem rather than a misstatement of results, but do not tell a lender that nothing moved. The job-cost reports were rebuilt for decision purposes. Whether any of it warranted more than that was put to the shop's accountant rather than decided in-house, because the answer depends on what those statements were used for outside the business.

The portable version

Any account that holds cost with no revenue attached to it is a suspense account for your job costing, whatever it is named. Warranty, rework, callbacks, shop time, non-billable, goodwill: these are all the same object. Each of them is a place where the link between what a job cost and what a job earned has been cut, and every one of them makes the job types that fill it look better than they are, by exactly the amount they fill it.

You do not need to abolish those accounts. You need to know, every quarter, which job types are feeding them, which means the link back to the causing job has to be captured at the moment the ticket is opened. Nobody can reconstruct it later from an address and a memory, and the eleven months it takes to notice is time spent pricing off the wrong number.

References

  • See related: How to Spot a Bookkeeping Error Before It Compounds; Job Profitability by Service Type; What the Owner Must Own and What the Bookkeeper Owns