QuickBooks Online has no native retainage feature. None. You can’t toggle it on, there’s no module to install, and Intuit hasn’t shipped one despite years of contractors asking.
That’s a problem if you’re a contractor whose customers hold back 5–10% on every progress invoice. Without a workaround, your A/R aging report tells you you’ve already collected money you haven’t, your P&L overstates revenue, and your cash flow forecasts are useless.
I’m Erin Andrews, owner of Level Accounting & Advisory. We set up retainage in QuickBooks Online on every construction client we onboard. Same workaround, every time, because it’s the only one that holds up over the life of a job.
This guide walks through the 5-step setup for retainage receivable (what your customers hold back from you), then covers retainage payable (what you hold back from your subs), and shows you how to make A/R aging tell the truth.
What is retainage and why does QBO need a workaround?
Retainage (also called “retention”) is the percentage of each progress payment your customer holds back until the job is complete and accepted. Standard rates run 5–10% on private work and 5% on most public/commercial jobs. The customer keeps the holdback as protection — if punch list items don’t get done, the retainage covers it.
The accounting problem: if you bill $50,000 with 10% retainage, the customer pays you $45,000 today. The other $5,000 sits with them until completion — sometimes 6, 12, or 18 months later.
If you record the full $50,000 as a regular invoice in QBO, two things break:
- Your A/R aging shows $5,000 as “current” or “overdue” — when in reality it’s not collectible until completion
- Your revenue, A/R balance, and cash flow projections are all wrong
QBO doesn’t have a button for this. So we build the workaround.
The standard 5-step QBO retainage workaround
This is the setup we use on every client. It works on QBO Plus and Advanced. Skip any step and the workaround breaks.
Step 1 — Create a “Retainage Receivable” account on the balance sheet
In QBO, go to Accounting → Chart of Accounts → New.
- Account Type: Other Current Assets
- Detail Type: Other Current Assets
- Name: Retainage Receivable
- Description: Amounts withheld by customers pending job completion
This is where retainage will live until it’s released. It’s an asset (the customer owes it to you) but it’s separate from regular A/R, which is the whole point.
Step 2 — Build a negative-rate Product/Service called “Retainage Held”
Go to Sales → Products and Services → New → Service.
- Name: Retainage Held
- SKU: RET-HOLD
- Description: Retainage withheld per contract terms
- Sales price/rate: Leave blank — you’ll enter the negative amount on each invoice
- Income account: Retainage Receivable (the balance sheet account from Step 1)
This is the trick that makes everything work. By tying the Product to the Retainage Receivable balance sheet account (instead of a regular income account), every time you use this Product on an invoice, it moves money from regular A/R into Retainage Receivable.
Step 3 — Apply Retainage Held to every progress invoice
When you invoice a customer for a progress draw:
- Add the regular line items as you normally would (line item billing or a single project draw line — whatever your contract structure is)
- Add a final line: Product = “Retainage Held,” Quantity = 1, Rate = negative 10% of the invoice subtotal
- The invoice total is what the customer actually owes today
- The retainage amount has moved into your Retainage Receivable balance sheet account
Example: $50,000 progress billing with 10% retainage. Line 1: $50,000 progress draw. Line 2: -$5,000 Retainage Held. Invoice total: $45,000.
The customer pays $45,000. Your A/R aging shows $0 outstanding for that invoice. Retainage Receivable on the balance sheet shows $5,000.
Step 4 — Track release at job completion
When the job hits substantial completion and you’re entitled to bill the retainage:
- Create a final invoice for the retainage amount
- Use Product = “Retainage Held,” Quantity = 1, Rate = POSITIVE total retainage amount
- This pulls the balance OUT of Retainage Receivable and into regular A/R
- Customer pays, A/R clears, Retainage Receivable goes back to $0 for that job
The key word is “entitled.” Don’t bill retainage release until the contract terms say you can — usually after punch list signoff and any required lien waivers are in.
Step 5 — Reconcile monthly
Every month-end, run the Retainage Receivable account in QBO and tie it to your job-by-job retainage tracking (a spreadsheet, JobTread, or a custom report).
For every job in the column:
- Total billed to date
- Retainage rate
- Retainage held to date (should match QBO Retainage Receivable per job)
- Retainage released to date
- Retainage outstanding
If the spreadsheet and QBO don’t match, fix it that month. Don’t let mismatches compound.
Watch this walkthrough
This video walks through the same workaround visually. Different software demonstrator, same logic — useful if you want to see it in QBO before you build it:
Watch on YouTube: Tracking Retainage Separately in QuickBooks
Retainage Payable — when YOU hold back from your subs
If you’re a GC or a specialty contractor who hires subs, you should be holding retainage from THEIR invoices the same way your customers hold it from yours. Most contractors don’t, then they’re stuck paying out the full amount upfront and praying the sub finishes the punch list.
The mirror-image setup:
- Create a “Retainage Payable” account. Account type: Other Current Liabilities. This is what you owe your subs but haven’t paid yet.
- Build a “Retainage Held from Sub” Product/Service. Tied to the Retainage Payable balance sheet account (instead of a regular expense account).
- On every sub bill, add a negative line using “Retainage Held from Sub” at the negative retainage percentage.
- Pay the sub the net amount today. The retainage sits in Retainage Payable until you release it.
- Release at completion. Cut a check for the held amount, pulling it out of Retainage Payable.
One contractor we cleaned up had been paying subs in full for years. Three subs walked off jobs with punch list undone. He had no leverage to get them back. Retainage on subs would have given him $40K of holding power across those three jobs alone.
How to make A/R aging show retainage separately
Once retainage is sitting in its own balance sheet account, your standard A/R aging report shows only what’s actually outstanding and collectible. Retainage shows up separately on the balance sheet.
For monthly reporting, build (or have your accountant build) two custom reports:
- A/R Aging Summary — your normal report, now accurate because retainage isn’t muddying it
- Retainage Receivable by Customer — a custom report grouped by Customer that shows the Retainage Receivable balance per job
Bonding agents and bankers ask for both. Now you have both.
How retainage shows up on your WIP report
Retainage is a line item on a properly-built WIP schedule. The columns to include:
- Total billed to date (gross — including retainage)
- Retainage held to date
- Net billed (gross billed minus retainage held)
- Cash collected to date (should match net billed if customer is current)
- Retainage outstanding
If you don’t have a WIP schedule yet, read our WIP report construction guide. Retainage tracking and WIP go together — you can’t really do one without the other for a serious contractor.
Common retainage mistakes
The mistakes we see on cleanups:
- Not tracking it at all — billing the full amount, recording the customer’s holdback as “bad debt” or “discount” when it eventually gets released. Wrong answer.
- Tracking it inconsistently — sometimes invoiced gross with negative line, sometimes invoiced net. Now you can’t tell what’s outstanding.
- Forgetting to bill release at completion — we’ve found six-figure retainage balances on takeover that should have been collected 18 months earlier
- Not holding retainage from subs — leaves you with no leverage on punch list
- Mixing retainage and standard A/R in collections calls — calling a customer about $5K that’s not actually collectible yet damages the relationship
- Treating retainage as cash for tax purposes — depending on your accounting method, retainage you haven’t collected may not be income yet. Talk to your construction accountant before year-end.
If you have a JobTread + QBO sync running, also check our JobTread to QuickBooks sync errors guide — the default JobTread sync sometimes treats retainage as collected when it isn’t, and the fix is part of getting your books accurate.
When the workaround isn’t enough
The 5-step QBO workaround handles 95% of specialty trade contractors doing $1M–$15M. You’ve outgrown it when:
- You’re running 20+ active jobs with retainage at any given time
- You have multiple retainage rates (different customers, different rates) that get confusing fast
- You need automated lien waiver tracking tied to retainage release
- You’re regularly bonded and your bonding agent is asking for reporting QBO can’t easily produce
At that point, you’re typically a $10M+ contractor and the conversation shifts to whether you upgrade to Foundation Software, Sage 100 Contractor, or stay on QBO with custom reporting layered on. We help clients work through that decision based on their specific situation, not based on what software the vendor wants to sell.
Frequently asked questions
Does QuickBooks Online have a built-in retainage feature?
No. QuickBooks Online has no native retainage feature. The standard solution is a workaround using a Retainage Receivable balance sheet account paired with a negative-rate Product/Service. It works reliably once it’s set up correctly and reconciled monthly.
What’s the difference between retainage receivable and retainage payable?
Retainage receivable is what your customers hold back from your invoices — it’s an asset because they owe it to you. Retainage payable is what YOU hold back from your subcontractors’ invoices — it’s a liability because you owe it to them. Both should be tracked in QBO using the same workaround logic, just mirrored.
Should retainage be recognized as revenue when invoiced or when collected?
Under accrual accounting, retainage is typically recognized as revenue when it’s earned (when the work is done), not when it’s collected. Under cash basis, it’s revenue when the cash hits. Most $1M–$15M specialty trades report cash basis for taxes but use accrual for management reporting — meaning retainage shows up at different times depending on which report you’re looking at. Talk to your construction accountant about the right treatment for your specific situation.
How long does retainage typically take to release?
Standard release timelines run 30 days after substantial completion for residential work, 30–90 days for commercial work, and longer for public projects (some bonded jobs hold retainage 6–18 months). Read your contract — the release terms are spelled out and they’re not all the same.
Can I bill retainage release before the job is fully complete?
Only if your contract allows it. Some contracts allow partial retainage release at milestones (e.g., 50% release at substantial completion, 50% at final acceptance). Most don’t. Billing retainage early when the contract doesn’t allow it gets your invoice rejected and damages the customer relationship.
What happens if I forget to track retainage and it’s been months?
It’s fixable. We do this on every cleanup. The work involves identifying every job with retainage, building the Retainage Receivable account, and reclassifying historical entries via journal entries. Doable in a few days for a typical specialty trade file. The longer you wait, the more entries to reclassify — but it’s never too late.
The bottom line
QBO doesn’t have native retainage tracking. The 5-step workaround does. Build the Retainage Receivable account, build the negative-rate Product, apply it to every progress invoice, track release at completion, reconcile monthly. Mirror the whole thing for sub retainage payable.
Once it’s set up, your A/R aging stops lying to you, your collections calls don’t burn customer relationships, and your WIP schedule reflects reality. It takes about an hour to set up and 15 minutes a month to maintain.
If you want this built into your QBO file by someone who has done it 100+ times for construction clients — or if you have months of mistracked retainage to clean up — that’s what we do.
Ready to talk?
Or read the full job costing for contractors guide for the bigger picture.
Erin Andrews is the owner of Level Accounting & Advisory, a construction-only accounting firm based in Vero Beach, FL serving contractors nationwide. Level has 20 years of experience in construction accounting and serves specialty trades doing $1M–$15M in annual revenue.
Related Posts

Effective Job Costing for Concrete Contractors: QBO + JobTread Setup

Strong Job Costing for Electrical Contractors: QBO + JobTread Setup

Job Costing for Plumbing Contractors: QBO + JobTread Setup

Percentage of Completion vs. Completed Contract: Which One for Small Contractors?
5 Job Costing Mistakes That Quietly Kill Contractors Profit
