
September 30, 2026 · Mitt Patel · 6 min read
You look at last month's numbers and the business made great money. This month, on paper, it barely broke even. Same crew, same pace, nothing changed on the ground — so what happened?
On jobs that run several months, this is normal, and it's almost never about the work itself. It's about billing getting ahead of or behind the actual progress. Here's how to see it clearly, job by job, before it turns into a cash problem.
Why the problem happens
Most contractors bill on a schedule that doesn't perfectly track the work. You might invoice 30% at the start of a job even though you've only spent 15% of the expected cost. Or the opposite happens: you're deep into material and labor costs on a job, but the next billing milestone isn't due for another three weeks.
Either way, the monthly profit and loss statement gets distorted. If you're billed ahead of your costs, the month looks better than it is — you're sitting on money you haven't earned yet by doing the work. If you're billed behind, the month looks worse than it is, even though the job is fine and the money is coming.
The real cost isn't the confusion itself. It's the decisions that follow it. Owners hire ahead of a good-looking month that isn't really good. Owners pass on a piece of equipment during a slow-looking month when the business is actually healthy. Bids get priced off a gut feeling about how the last job went, instead of what the job actually cost against what was billed. None of that shows up as a single bad decision. It shows up as a slow drift in how the business is priced and staffed.
Retainage adds a second layer to the same problem. On commercial jobs, it's common for a customer to hold back 5% or 10% of each invoice until the job is finished and signed off. That money is real and it's owed to you, but if it isn't tracked separately, it disappears into the regular accounts receivable pile. Months later, nobody's sure how much is out there or when it's supposed to come in.
A worked example
Say you're running a remodel with a contract price of $125,000 and an estimated total cost of $100,000, and you've billed the customer $50,000 so far.
At the end of the month, you check your actual job costs — labor, materials, subcontractors — and you've spent $30,000 against that $100,000 estimate. That means the job is about 30% complete by cost, but you've billed 40% of the contract price.
That gap is over-billing. Thirty percent of the $125,000 contract is $37,500 of work performed, and you've billed $50,000, so you're holding $12,500 more from the customer than the work justifies. That's not necessarily a problem — it can be normal and even healthy, since it means cash is ahead of cost — but you need to know it's there. If you didn't check, you might look at that $50,000 sitting in the bank and think the job is more profitable, or further along, than it actually is.
Now flip it. Say you've spent the same $30,000 but only billed $25,000. The work performed is worth $37,500, so you're under-billed by $12,500. The work is ahead of the paperwork. This is the situation that quietly drains cash, because you're floating the job costs out of pocket until the next invoice goes out. If you don't catch it early, you can end up short on payroll or materials on a completely healthy, profitable job — just because the billing hasn't caught up.
Retainage works alongside this. Say the $50,000 you billed had 10% retainage held back, so you were only paid $45,000, with $5,000 sitting with the customer until the job closes out. If that $5,000 isn't tracked on its own, it's easy to forget it's coming, or to forget it's not coming for another four months.
How to set it up
- Set up each job as a project in QuickBooks Online. Attach the signed estimate or contract amount to the project so the expected total cost and total contract price are both on record.
- Post all costs to the job as they happen. Labor, materials, subcontractor bills, and equipment costs all need to be coded to the right project, not lumped into a general expense account.
- Track billing against the same project. Every invoice for that job should be tied to the project record, so QuickBooks can show billed-to-date next to cost-to-date.
- Run a percent-complete comparison each month. Divide costs spent to date by total estimated cost to get percent complete. Divide billed to date by total contract price to get percent billed. Compare the two.
- Set up a separate retainage receivable account. Instead of letting held-back amounts sit inside regular accounts receivable, track them in their own account labeled by job, with a note on when release is expected.
- Review both numbers together once a month, ideally right before you look at overall profit and loss, so the two aren't read in isolation.
The mistakes that undo it
- Costs get coded to a general "job costs" bucket instead of the specific project. Once that happens, the percent-complete math is wrong for every job in the bucket, not just one.
- Change orders get done but not entered as billing or added to the estimate. This makes a job look over-billed or under-billed when it's really just incomplete paperwork.
- Retainage gets invoiced into the same receivable account as regular payments. Once it's mixed in, it's very easy to write off a retainage balance as "probably collected" when it isn't.
- The check only happens at year-end or when cash feels tight, instead of monthly. By the time the gap is noticed, it's already influenced a hiring or bidding decision.
- Estimates never get updated after a change order or scope change, so the percent-complete comparison is measured against a number that's no longer accurate.
Monthly checklist
- Pull the project list in QuickBooks Online and confirm every active job has an estimate attached.
- Confirm all costs for the month are coded to the correct job, not a general expense account.
- Calculate percent complete (costs to date divided by total estimated cost) for each job.
- Calculate percent billed (billed to date divided by total contract price) for each job.
- Flag any job where the gap between those two numbers is wide, and ask why.
- Review the retainage receivable account and confirm the balance matches what's actually being held on each job.
- Note expected release dates for retainage and flag any that are overdue.
Common questions
What counts as a wide enough gap to worry about?
There's no single number that applies to every business — it depends on your typical job size and how thin your margins run. The point of the monthly check isn't to hit a target gap, it's to notice when a gap shows up and ask why, before it turns into a cash surprise.
Do I need this for small jobs that finish in a few weeks?
Probably not. This kind of tracking earns its keep on jobs that run multiple months, where billing and cost naturally drift apart over time. Short jobs usually resolve themselves before the gap matters.
Is over-billing a bad thing?
Not by itself. Being billed ahead of cost means cash is in hand before the work is fully done, which can be a normal and comfortable position. The risk is not knowing it's there and mistaking it for pure profit when some of it still has to be earned by finishing the work.
Where does retainage show up if I don't track it separately?
It usually sits inside your regular accounts receivable, blended in with everything else a customer owes you. That makes it easy to lose track of both how much is being held back across all your jobs and when each piece is actually due to come in.
North Hudson Bookkeeping sets up project tracking and retainage accounts like this inside QuickBooks Online and keeps them current every month, so you can see where each job stands without digging for it. The first call is free.
