Bill the full value of each pay app, record the portion the GC holds back as retainage receivable tagged to the job, and clear that balance when the GC releases it. Your revenue then reflects the work you did, and your books show exactly how much each GC is still holding. If you hold retainage from your own subs, the same idea runs in reverse as retainage payable.
What retainage is, in bookkeeping terms
Retainage, sometimes called retention, is the part of each payment a GC holds back until your work, or the whole project, is finished and accepted. You've done the work and billed it. You just can't collect that piece yet.
The amount and the release terms come from your subcontract. Retainage is usually figured as a percentage of each pay app, some contracts reduce it partway through the job, and some states limit how much can be held, especially on public work. The rate varies by contract and by state, so check your contract and your state's rules for the terms that apply to you.
For the books, that makes retainage a receivable, not a discount and not a loss. It belongs in its own account, usually called Retainage Receivable, kept apart from regular accounts receivable so you can tell money due now from money due at closeout.
Why retainage disappears from the books
Most retainage problems start the same way. The GC pays a pay app short the retainage, someone deposits the check, and the books record the deposit as income. Nobody records the pay app itself, so the held-back amount never shows up anywhere.
When the books only record cash received, every job looks smaller than it was, and there's no balance to chase. By closeout, which can be many months later, nobody knows how much each GC is holding. Some of it never gets billed for release, simply because no one remembered it was owed.
The fix is to record each pay app at full value when you bill it, not just the cash when it arrives.
How to record retainage, step by step
- Set up the accounts. Add a Retainage Receivable account (an other current asset). If you hold retainage from your own subs, add a Retainage Payable account (an other current liability) too.
- Set up each job under its GC. In QuickBooks Online, make each job a project or sub-customer under the GC. Every pay app, payment and retainage balance then rolls up by job and by GC.
- Invoice the full pay app. Bill the full value of work completed this period, matching your schedule of values. Then add a retainage line for the held-back amount, entered as a negative and mapped to Retainage Receivable. Revenue shows the full amount, and the invoice total is the cash due now.
- Match the payment to its pay app. When the GC pays, apply the payment to that invoice. If the check is short by more than the retainage, find out why (a back-charge, a disputed line, a change order not yet approved) and record the difference on its own.
- Bill the release. At closeout, invoice the retainage with a positive retainage line mapped to the same account. That moves the balance out of Retainage Receivable and into regular receivables, and the GC's payment clears it.
The exact setup in QuickBooks Online can vary. What matters is the result: full revenue on the job, and a retainage balance you can see and chase.
A worked example
Say you sign a $200,000 subcontract to hang and finish a medical office building, and the contract holds 10 percent retainage on every pay app. You bill three pay apps over three months, then wait for release at closeout.
| Step | Work billed | Retainage | Cash due | Retainage balance |
|---|---|---|---|---|
| Pay app 1 | $50,000 | $5,000 held | $45,000 | $5,000 |
| Pay app 2 | $70,000 | $7,000 held | $63,000 | $12,000 |
| Pay app 3 | $80,000 | $8,000 held | $72,000 | $20,000 |
| Closeout | $0 | $20,000 released | $20,000 | $0 |
| Total | $200,000 | All released | $200,000 | $0 |
After the third pay app, the job shows $200,000 of revenue, $180,000 collected and $20,000 in Retainage Receivable. When the GC releases retainage, the $20,000 payment clears that balance, and billed and collected match.
Now picture the same job in books that only record deposits. They show $180,000 of income and nothing about the other $20,000. If release lands in the next year, that income lands there too, and the job's margin looks wrong in both years. That's why retainage matters for job costing for contractors: a job report built on cash alone understates what every open job earned.
Tracking retainage by job and by GC
Once retainage lives in its own account, you can pull a list of what each GC is holding on each job. That list should tie to the Retainage Receivable balance on your balance sheet every month. If it doesn't, a payment was probably deposited without being matched to its pay app.
- By job: total billed, retainage held, and whether your scope is complete.
- By GC: retainage held across all your jobs with them, so you know who's holding the most of your money.
- Release terms: whether retainage is released when your scope is accepted or only when the whole project closes out. A mid-project trade like drywall can wait a long time if release is tied to the full project.
- Change orders and back-charges: whether retainage applies to change order work, and any back-charges deducted, recorded separately so the retainage balance stays accurate.
This retainage list is one of the core reports in our bookkeeping for drywall contractors, next to aged receivables by GC.
Retainage you hold from your own subs
If you sub out part of your scope, say a taping crew or a framing sub, your subcontract with them may let you hold retainage too. Record their bill at full value so the job carries its full cost. Then add a negative line mapped to Retainage Payable for the amount you're holding, so the bill total is what you pay now.
When it's time to release it, enter a bill for the retainage mapped to the same account and pay it. Keep a list of retainage payable by sub and by job, just like the receivable side. That way release is a decision you make on purpose, not a payment that slips out early or gets forgotten.
Lien waivers vs. payments
Many GCs want a conditional lien waiver with each pay app and an unconditional one once the payment clears. The waiver amount should match what was actually paid, and that's where the books come in. A waiver log matched to payments shows what you've waived, what you've been paid and where the two don't line up.
Note in the log whether each waiver covers retainage or leaves it out, and be careful with any waiver that covers retainage you haven't received yet. Waiver forms and rules vary by state, and some states require specific forms, so questions about what a waiver means go to your attorney.
Cash or accrual: who decides
Recording pay apps at full value is an accrual view: revenue when you bill, not when you're paid. For management reports, it's the view that tells you what each job earned. Our guide to cash vs. accrual accounting walks through the difference.
How retainage is treated on your tax return is a separate question. Your CPA decides your tax method, and contractors can report one way for taxes and another for management reports. Whatever your CPA picks, the retainage detail by job is what they'll need to apply it.
What to have each month
- Every pay app recorded at full value, with retainage split out
- A retainage receivable list by job and GC that ties to the balance sheet
- A retainage payable list by sub, if you hold retainage
- Aged receivables, with retainage shown apart from invoices due now
- A lien waiver log matched to payments
- Short pays and back-charges recorded against the job, with a reason
That's also the package to hand your CPA at year end, along with your contracts if they ask how retainage is released.
How we handle retainage
Our drywall contractor bookkeeping follows the GC's process: schedule of values, monthly pay apps, retainage, waivers and closeout. We record each pay app in QuickBooks Online with retainage split out, match every GC payment as it lands and keep retainage on its own list until each GC releases it.
Electrical, plumbing and painting subs who work for GCs run into the same retainage problem, and the same setup works for them. You can see how it fits with the rest of a contractor's books on our contractors and trades bookkeeping page.
Common questions
Is retainage income when I bill it or when I get paid?
For management reports, we record it when you bill the pay app, because that's when the work was done. How it's treated for taxes depends on your accounting method, and that's your CPA's call. We keep retainage tracked by job either way, so your CPA has the detail to apply whichever method they choose.
How much retainage can a GC hold?
Your subcontract sets the amount and the release terms. Rates vary by contract and by state, and some states limit retainage, especially on public projects. Check your contract and your state's rules, and ask your attorney if the terms aren't clear. We track whatever your contract says.
What if the GC pays less than the pay app minus retainage?
Then something else came out of the check, usually a back-charge, a disputed line item or a change order that hasn't been approved. We match the payment to its pay app, record the difference on its own and flag it for you. That keeps short pays from blending into retainage and getting forgotten.
Do I need to track retainage I hold from my own subs?
Yes. If you hold back part of a sub's bill, record the full bill against the job and put the held portion in a Retainage Payable account. A list by sub and by job shows exactly what you owe each one, so nothing is paid early or forgotten after the job closes.
Know What Every GC Is Holding
Book a free books review and we'll show you where your pay apps, retainage and job costs stand today.
Book a Free Books Review →