Retainage Accounting in QuickBooks Online for Subcontractors
On a $400,000 contract with 10% retainage, $40,000 of money you've already earned is being held until closeout, and on a sub running five or six contracts at once, the total held across jobs routinely reaches six figures.
We track retainage for subcontractors as part of running their books, and the pattern that prompted this post is simple: at most companies, that money lives in the owner's head or a spreadsheet nobody reconciles, and money that isn't tracked has a way of not getting collected, or getting collected months late, or getting shorted at final payment without anyone noticing.
This post covers how to account for retainage properly in QuickBooks Online: the account setup, the invoicing mechanics that keep held amounts out of your regular AR aging, billing retainage at closeout, and what the balance sheet should show you at a glance.
What retainage is and why the books mishandle it
Retainage is the percentage, commonly 5 to 10 percent, that the GC or owner withholds from each progress payment until the project reaches completion or another contractual release point. You bill $100,000 on a pay app at 10% retainage, you receive $90,000, and the $10,000 joins the held balance that pays out at closeout, sometimes months or a year after the work was done.
The default bookkeeping treatment gets this wrong in one of two ways. Some companies invoice the full $100,000 and let the unpaid $10,000 sit in regular accounts receivable, where it ages past 90 days, wrecks the AR aging report, triggers pointless collection calls on money that isn't due yet, and blends with genuinely late payments until nobody can tell which is which.
Other companies invoice only the $90,000 they expect to receive, which keeps AR clean but makes the retainage vanish from the books entirely: revenue is understated, and the $10,000 you're owed exists nowhere except memory.
The correct treatment is a third path: bill the full earned amount, and move the retained portion to its own asset account, retainage receivable, separate from regular AR. Your income statement shows what you earned, your AR aging shows only what's actually due, and your balance sheet shows exactly what's being held across all jobs.
The QuickBooks Online setup
The setup takes about fifteen minutes once.
First, create the account: Chart of Accounts → New → account type Accounts Receivable or Other Current Asset, named "Retainage Receivable." Other Current Asset is the cleaner choice in QBO because a second AR-type account complicates some reports and workflows; Other Current Asset keeps retainage visible on the balance sheet without tangling the AR machinery. If retainage on some contracts won't release for more than a year, your CPA may split long-term amounts at year end, but one account is fine for operating purposes.
Second, create the retainage item: Products and Services → New → Service, named "Retainage Withheld," mapped to the Retainage Receivable account. This item is what moves held amounts off the invoice total and into the asset account.
Third, if you track jobs through Projects or sub-customers, you'll apply the item within each job so the retainage balance is traceable by contract, which is the whole point.
The invoicing mechanics
On each progress invoice, bill the full amount earned for the period, then add the Retainage Withheld item as a negative line for the held percentage. The $100,000 pay app shows $100,000 of billing and a retainage line of negative $10,000, for an invoice total of $90,000. Revenue records at the full $100,000 earned, the customer owes $90,000 now, and $10,000 lands in Retainage Receivable, tagged to the job.
This mirrors the pay app itself: AIA-style billing already shows work completed, retainage held, and amount due, so your invoice and your G702 tell the same story, which your GC's accounting department will appreciate and which keeps reconciliation trivial.
Each subsequent pay app works the same way, and the Retainage Receivable balance for the job grows with each billing. At any moment, the account balance by job answers the question most subs can't: how much of our money is being held, and where.
Billing retainage at closeout
When the contract hits its release point, the held money gets billed for payment. Create the final retainage invoice using the Retainage Withheld item as a positive line for the accumulated amount: the invoice shows $40,000 due, the entry drains Retainage Receivable back to zero for that job, and the amount moves into regular AR where normal collection applies. No revenue is recorded at this step, because the revenue was already recorded when the work was billed; this invoice just converts held money to collectible money.
Two practical notes from doing this on live contracts.
First, partial releases happen: many contracts drop retainage to a lower percentage at substantial completion or release it in stages, and the same mechanics handle it, billing whatever portion releases.
Second, closeout retainage is where shortfalls surface: backcharges, disputed amounts, and "we show a different number" conversations. If your books carry the exact held balance per job, built pay app by pay app, you walk into that conversation with a reconciled number instead of a guess, and the difference in outcomes is real money.
What good looks like on the reports
Run the balance sheet and Retainage Receivable shows total held across all jobs, and the account's detail by customer or project shows the per-job balances. A sub with $130,000 held across five jobs should be able to see that figure in ten seconds, watch it move monthly, and flag any job whose retainage should have released but hasn't. Meanwhile the AR aging contains only genuinely due amounts, so past-due actually means past-due and collections effort points at real problems.
That visibility changes behavior. Retainage release becomes something you invoice promptly at completion instead of remembering eventually. Cash flow forecasting gets a real input, because upcoming releases are visible and datable. And the balance sheet a bonding agent or lender sees presents held contract funds properly instead of burying them in aged AR, which reads as collection problems, or omitting them, which understates your assets.
Retainage tracking is one piece of the larger structure contract work requires: job costing so margins are visible while jobs run, covered in How to Track Job Costs in QuickBooks Online, and the compliance layer on public work, covered in Certified Payroll for Subcontractors: The Complete Guide.
The books that do all three are the books that let a sub run contract work on numbers instead of memory.
At Prophet Accounting, we run the full back office for construction subcontractors: retainage tracked by contract, progress billing support, job costing, certified payroll, and a monthly close that shows margin by job.
If you can't say within ten seconds how much retainage you're owed and on which jobs, schedule a consultation at prophetaccounting.com/construction or give us a call at (772) 380-2871.