The file as it arrives

A specialty contractor, around $4M a year, eight open jobs, books in QBO kept by a competent generalist. The P&L says the year is going well: revenue up, margins steady, cash comfortable. The owner wants bookkeeping help because "the CPA keeps asking questions we can't answer."

The tell is what's missing. There's no WIP schedule anywhere in the file. Revenue is whatever was billed; costs are whatever was paid. Those are two different clocks, and nobody is comparing them.

What the books said vs. what was true

Take one job — call it Job 4102, a $1.2M contract. By month seven, the project manager has billed aggressively off the schedule of values: $840,000 billed. Costs to date are $612,000 against an estimated $1,000,000 total cost. The P&L reads billed minus cost and shows a fat margin.

The percentage-of-completion math says otherwise. At $612,000 of $1,000,000 estimated cost, the job is 61.2% complete, so earned revenue is 61.2% of $1.2M — $734,400. The extra $105,600 that was billed hasn't been earned. It's billings in excess of costs: a liability, sitting on the P&L dressed as profit.

$0 $400k $800k $1.2M Mo 1 Mo 10 overbilled — reads as profit, is a liability underbilled — cash the contractor fronted billed to date earned revenue

Exhibit: billed vs. earned across the job. The gap between the lines is the number the P&L never shows.

Why the generalist missed it

Nothing was miscoded, and that's the point. Every invoice was entered correctly, every check posted to the right account. The error isn't in any transaction — it's in the absence of a schedule comparing earned revenue to billed revenue. QBO will never produce that on its own, because it doesn't know the contract value or the estimated cost to complete. Someone has to maintain those numbers and do the math, monthly, with the PM in the loop.

The rebuild, step by step

  • Confirm contract values, including every approved change order, for all open jobs — three had stale contract values, which alone shifted percent-complete on each.
  • Sit with the PM and pressure-test estimated cost to complete, job by job. This is the judgment step; the schedule is only as honest as these estimates.
  • Compute cost-to-cost percent complete and earned revenue per job, and post over/under billing to the balance sheet where it belongs.
  • Split retainage receivable out of regular AR so the collectible number stops being overstated.
  • Make it monthly. A WIP schedule updated once a year at tax time is archaeology, not accounting.

What changed

The owner learned two of eight jobs were carrying most of the year's apparent profit as unearned billing — money that would burn off as those jobs finished their cost curves. Pricing on the next bids changed. The CPA got a schedule that tied instead of a shoebox, and year-end stopped being a rebuild. None of that required new software; it required someone who knew the schedule had to exist.

This teardown is a composite of patterns we see repeatedly in contractor cleanups, with representative numbers. It isn't a specific client's file. The mechanics — billed vs. earned, cost-to-cost percent complete, over/under billing on the balance sheet — are exactly how the work is done.

Is your P&L telling this same story?

If there's no WIP schedule in your file, it probably is. We'll look, and tell you plainly.