Skip to content
← Back to tax posts

Bookkeeping

Construction Bookkeeping: Why the Job Looked Profitable Until It Finished

Job costing, WIP and retainage are where contractor books break. Here's how each one goes wrong, why the reports still look tidy, and what it costs you.

Reviewed by Haziq Inayat, EA For equity-comp employees in DFW and NYC
  • If the crew and the bookkeeper name jobs differently, every report is wrong.
  • WIP built on bad job costs is fiction, and it's fiction you make decisions from.
  • Retainage is money you earned and haven't collected. Most books lose it.
Illustration of a half-built timber frame with a row of job folders along its base, one pulled out of line and highlighted, and a stack of coins partly hidden behind the structure

The short version

Three things break contractor books: costs coded to the wrong job, a WIP schedule built on those wrong costs, and retainage recorded as if it were ordinary revenue. All three leave the reports looking tidy while the job performance stays hidden.

The worst conversation in construction bookkeeping happens at closeout. The job's done, the last invoice went out, and somebody finally adds it all up — and a job everyone was pleased with turns out to have made almost nothing. Sometimes less than nothing.

Nobody was lying. The reports said it was fine. The reports were just built on the wrong numbers, and they'd been wrong since about week three.

What actually breaks

Three things, and they compound in order: costs coded to the wrong job, a WIP schedule built on those wrong costs, and retainage recorded as though it were ordinary revenue. Each one is survivable alone. Together they produce books that look perfectly tidy while the job performance underneath them is invisible.

Job costing: the crew and the bookkeeper are using different names

This is the least glamorous failure on the list and it causes the most damage.

Your foreman calls it the Henderson job. The invoice says Henderson Residence — Phase II. The bookkeeper opens a job called Henderson, and a second one called Henderson II three weeks later because a bill arrived that didn't match. Now labour is landing in one, materials in another, and the change order is sitting in neither.

Nothing here is a mistake anyone would notice. Payroll still runs. The bank still reconciles. The P&L still balances. But the job-level report — the only one that tells you whether the work is making money — is quietly built from three piles that should have been one.

The rule is unglamorous and absolute: one job, one name, everywhere. The field, the invoices, the payroll allocation and the books all use the same identifier. If that isn't true, everything downstream is decoration.

WIP: a schedule is only as honest as what feeds it

A work-in-progress schedule does two comparisons. It sets your actual costs against your estimated costs, and your billings against your percentage of completion. Done properly it tells you, mid-job, whether you're over-billed or under-billed and whether the estimate is holding.

Done on bad job-cost data, it becomes a confident-looking document that is simply wrong. And that's worse than not having one, because you'll make decisions from it — whether to take the next job, whether to add a crew, whether you can afford the truck.

The tell is that everything looks calm. Payroll runs, costs land somewhere, the totals are right at company level. It's only at job level that the picture falls apart, and job level is the only level that matters when you're deciding what to bid next.

Retainage: the part almost everyone gets wrong

This is the one worth the whole article.

Retainage is money you have earned but not yet collected — held back until the job closes. It's easy to ignore precisely because it's coming later. And it gets recorded wrong in three distinct ways:

  1. Booked as if the full invoice were collected. Then the payment arrives short and nobody can explain the difference. This produces months of small unexplained variances that get "fixed" with adjusting entries.
  2. Never recorded as a retainage receivable at all. The money simply isn't on your balance sheet. You are understating your own assets — and if you're borrowing against them, that has consequences beyond the books.
  3. Accidentally expensed. Money you earned, treated as money you spent.

Buried inside ordinary receivables, retainage stops being visible as a category — and then you can't answer the question that matters: how much have I earned that clients are still holding, and on which jobs? On a contractor doing several jobs at once, that number is frequently the difference between comfortable and tight.

Why this keeps happening

Not incompetence. Most bookkeepers are good at bookkeeping. Construction just isn't general bookkeeping — it has its own vocabulary, and a bookkeeper who's never worked a job doesn't know what to ask for.

They won't ask why the change order hasn't been coded. They won't notice that a draw schedule doesn't line up with percentage of completion. They won't flag that retainage has quietly grown to a number you'd want to know about. None of that is on a standard monthly close checklist, because on most businesses it doesn't exist.

It's the reason we have a general contractor on our team. Not as a credential to put on a page — because when we ask you about a job, you're not going to be explaining what retainage is first.

What to check this week

  1. Pull a job-cost report and look for duplicate jobs. Near-identical names are the fingerprint. If you find them, the problem is upstream of the books.
  2. Find your retainage. If you can't say what you're owed in retainage across open jobs in under a minute, it isn't tracked as its own line.
  3. Compare one WIP line to reality. Take a job you know well. Does the schedule's percentage of completion match what you'd say standing on the site? If not, the inputs are wrong.
  4. Check whether labour is allocated or lumped. Payroll landing in a single overhead bucket instead of by job is one of the most common causes of a job that "looked fine."

If any of those checks came back badly, the books can be corrected — and it's much cheaper to do it now than at year-end with a tax deadline attached. We'll look at what you have and tell you honestly whether it needs a cleanup, a catch-up, or just a better monthly process.

See how we do bookkeeping

Common questions

Can't I just run on cash basis and keep it simple?

You can, and plenty of smaller contractors do. The trade-off is that cash basis tells you what moved through the bank, not what a job earned — so a month where you collected a big draw looks fantastic and a month where you paid for materials looks terrible, regardless of how the work is actually performing. It also makes a WIP schedule impossible, which matters the moment a bank or a bonding company asks for one.

At what size do I actually need WIP reporting?

Less about revenue than about overlap and duration. If you run several jobs at once, or jobs that span months and get billed in draws, you need it — that's exactly the situation where company-level numbers hide job-level problems. A single-job-at-a-time contractor can often get by without one.

My books are a mess mid-year. Is it too late to fix this year?

No, and mid-year is a much better time than after year-end. Reconstructing job costs is easier while the crew still remembers the work and the paperwork is findable. Waiting until a tax deadline means doing the same job under time pressure, which costs more and produces a worse result.

Does construction accounting software solve it?

Partly. Good software makes correct job costing possible; it doesn't make it happen. If the field and the office still name jobs differently, or costs get coded at the end of the month from memory, the software faithfully records the wrong thing. The process has to be right first — then the software is genuinely useful.

The place it usually breaks is the join. Most contractors end up running a field or project system alongside their accounting system, and the two were never properly connected — so jobs get created twice under different names, costs land in one and not the other, and someone re-keys the difference every month. That's the duplicate-job problem from earlier, arriving through the software rather than despite it.

Can you set the systems up so they actually talk to each other?

Yes, and we treat it as its own engagement rather than folding it into monthly work. We work with ServiceTitan and its QuickBooks integration — both the Online and Desktop paths — and getting that mapping right once is what makes the monthly bookkeeping cheap and accurate afterwards.

It's usually worth doing before the bookkeeping rather than after. Cleaning up a year of records and then connecting the systems means the cleanup has to be repeated; connecting first means the cleanup only happens once. If you already run something and it isn't feeding your books properly, that's a specific, finite project with an end date — not an open-ended retainer.

My ServiceTitan revenue doesn't match my P&L. What causes that?

Almost always the GL mapping between the two systems, and almost never anything dramatic. The usual culprits are unglamorous:

  • Sub-accounts. An account set up as a sub-account in QuickBooks but not in ServiceTitan. ServiceTitan needs the full Parent Account:Sub-account Name format or the export fails to land where you expect.
  • Names that don't match exactly. A difference in spacing or capitalisation is enough. So is a special character sitting in an account name on either side.
  • An account type mismatch — the same account classified as a liability in QuickBooks and an asset in ServiceTitan.
  • An account made inactive in QuickBooks while ServiceTitan is still mapped to it.
  • Someone reorganised the chart of accounts — renamed an income account, or turned class tracking on or off — and ServiceTitan is still pointed at the old structure.

None of these announce themselves. Transactions still export, the sync still reports success, and the totals quietly stop agreeing. If your revenue in one system has never quite matched the other and everyone has learned to live with a "known difference," that difference has a specific cause and it's findable.

When it's worth a conversation

If you run one job at a time and read your own numbers, you probably don't need us. If you're running several jobs, billing in draws, carrying retainage across multiple clients, or you've had the closeout surprise more than once — that's a books problem, and it's fixable.

We'd rather find it in week three than at closeout.

Either way: how we do bookkeeping, or skip ahead and send us the numbers — a general contractor and an Enrolled Agent will both look at them.

constructionjob costingWIPretainagebookkeeping

Reviewed by

Haziq Inayat, EA

Enrolled Agent helping business owners and equity-comp employees across DFW, NYC, and nationwide.

Get started now

Fill out the form to see if we're a right fit!

Contact us