Your AR report says $240,000. About $22,000 of that isn't collectible yet.
That gap is retainage — the slice of every progress payment the GC or owner holds back until the job is accepted and closed out. Treat it like a normal receivable and your books mislead you twice: your cash forecast is too rosy, and your collections list is full of invoices nobody is late on. Retainage accounting for contractors comes down to one habit — park earned-but-unbillable money in its own account, on both sides of the ledger, and never let it age in with your 30-day invoices.
Here's how to run it from bid through closeout.
Set up retainage accounting for contractors with two accounts, not one
Most trade contractors sit on both sides of the hold. A GC withholds from you. You withhold from your subs. Your chart of accounts needs to show both:
Retainage Receivable — an asset account, separate from Accounts Receivable. This is money you've earned and billed, but that isn't due until the job is accepted.
Retainage Payable — a liability account, separate from Accounts Payable. This is money you've withheld from subs and still owe them.
If both amounts sit inside plain AR and AP, your working capital looks like it's covering your current bills when part of it is locked in a job that finished in March. Splitting them takes about twenty minutes in the bookkeeping setup for contractors and saves the guessing every month after.
Before the job: read the retainage clause before you price the work
Three things in that clause change your number. What percentage is held. Whether it's held on labor and materials or labor only. And what triggers release — substantial completion, final acceptance, or the owner paying the GC (pay-when-paid).
The last one is the killer. If your retainage releases only when the owner releases the GC's retainage, you are financing somebody else's punch list. On public work, some states cap the percentage or require the hold to drop partway through. Ask at bid time, not at closeout.
My position: if the clause is pay-when-paid and the job is longer than a few months, price the carry into your bid. You're a lender in that deal whether you charge for it or not.
During the job: bill it, code it, and hold your subs the same way
Every progress invoice should show the full earned amount, the retainage withheld as a separate line, and the net due. Not a reduced invoice — the gross, then the deduction. Your bookkeeper posts the gross to revenue, the held portion to Retainage Receivable, and the net to AR.
Do the mirror image on subs. If your contract lets you hold from them, hold at the same rate the GC holds from you, or you're funding the difference out of your own account.
Cost codes matter here too — a cost code is just the bucket a dollar lands in on a job, like "labor," "material," or "sub." Retainage is not a cost code. It's a payment term. It never touches job cost, and it never changes what the job earned.
A $180,000 job, from first draw to final check
Say you're a mechanical contractor on a $180,000 contract, the GC holds 10%, and your total job cost lands at $148,000.
Month three you bill $60,000 of completed work. Retainage withheld is 10% of $60,000, or $6,000. Net check: $54,000. Revenue on the books is the full $60,000 — $54,000 to AR, $6,000 to Retainage Receivable.
Run that across the whole contract and you've billed $180,000 and had $18,000 held. Your gross profit is $180,000 − $148,000 = $32,000. So more than half your profit on this job is sitting in retainage until the GC signs off.
Now the closeout. You bill the $18,000 retainage. The GC hits you with a $1,200 backcharge — a deduction for something they had to fix or supply on your behalf. You collect $16,800.
You also held 10% from a $40,000 insulation sub, so you owe them $4,000. Cash actually landing in your account at closeout: $16,800 − $4,000 = $12,800. That's the number to write down. Not $18,000.
Cash basis or accrual: which to run when retainage is big
Cash basis records revenue when the check clears. Simple, and retainage never shows up as income before you touch it. The problem: your P&L swings wildly, and a job that finished in November looks like a November loss and a March windfall.
Accrual with a separate retainage account records revenue when you earn it and parks the held portion as an asset. Your job profit is right in the month you did the work, and you can see, in one number, everything you've earned and haven't been paid.
Verdict: if retainage is a routine part of your contracts, run accrual internally. You cannot manage a hold you can't see. Whether your tax return follows the same method is a separate question for whoever prepares it — there are rules around when accrual-basis retainage is picked up as income, and they turn on your contract terms.
Two places retainage quietly costs you
Aging. Retainage sitting in AR shows up as 90-plus days past due and stops meaning anything. Pull it out, then age Retainage Receivable by job with the release trigger noted. Retainage older than the last punch item is not slow — it's forgotten. Also know your state's lien and bond claim deadlines, because they can run from your last day on site, not from when the retainage was due.
1099s. You report what you actually paid a sub during the year, so retainage you're holding doesn't appear until you release it. Release $4,000 in insulation retainage in a year when you gave that sub no other work, and that release alone clears the Form 1099-NEC nonemployee compensation reporting threshold, which is $2,000 for tax year 2026. Form 1099-NEC is furnished to the payee and filed with the IRS by January 31. Contractors miss this constantly, because the work was two years ago.
Get retainage tracked where you can actually see it
If your retainage is buried in AR and your job profit only shows up after the final check clears, that's a fixable bookkeeping problem, not a personality flaw. Get pricing for monthly contractor bookkeeping and we'll tell you what it costs to have your books tell the truth every month.