A controller at a mid-size electrical subcontractor is closing the books for the month. They pull the AR aging report before the Friday finance meeting and stop on one line: a general contractor showing $38,400 past due, sitting in the 90-plus column.
That GC pays on time. They know this. So they open the invoice detail and find the answer: it is not past due. It is retainage, the 10 percent held back on three separate pay applications going back to spring, and QuickBooks has no way to tell the aging report the difference. It just counts the days.
This is the single most common reason electrical contractors move off QuickBooks and onto Sage Intacct: QuickBooks was never built to record a holdback that construction contracts require and general businesses don't have.
Same Invoice, Two Different Ledger Entries
Here is what happens on a standard $100,000 pay application with a 10 percent retainage clause.
In QuickBooks, the full $100,000 posts to accounts receivable. There is no field on the invoice that tells the system $10,000 of that balance is contractually withheld and $90,000 is a normal receivable. Both amounts sit in the same bucket and age the same way.
Sage Intacct posts retainage to a dedicated Retainage Receivable account the moment the invoice is created, separate from standard AR. Ninety thousand dollars posts as a normal receivable. Ten thousand posts as retainage receivable. Two accounts, two behaviors, and an aging report that finally matches reality.
What Shows Up on the Aging Report
Run the aging report in each system and the difference is immediate.
- QuickBooks: the full $100,000 ages against the invoice date. At 90 days, all of it looks past due, including the part that was never supposed to be collected yet.
- Sage Intacct: the $90,000 ages normally in the 30/60/90 buckets. The $10,000 sits in its own retainage column, outside the past-due calculation, because it is not past due. It is held under contract.
That distinction is not cosmetic. A collections team working from a QuickBooks aging report will chase a customer for money that isn't actually owed yet, waste time, and damage a relationship over a misread number.
Comparing the Two Systems Directly
Retainage isolated from standard AR
- QuickBooks: No, lumped into the AR balance
- Sage Intacct: Yes, posts to a dedicated GL account
Aging report accuracy
- QuickBooks: Retainage shows as overdue AR
- Sage Intacct: Retainage excluded from the past-due buckets
AP retainage tracking
- QuickBooks: Manual workaround required
- Sage Intacct: Posts to its own payable account, same as AR
Retainage release workflow
- QuickBooks: No native workflow
- Sage Intacct: One-step release once the GC authorizes it
WIP integration
- QuickBooks: None
- Sage Intacct: AIA billing feeds directly into WIP
Audit-ready retainage reporting
- QuickBooks: Manual export required
- Sage Intacct: Native report, drillable by contract and pay app
Every row above shows up somewhere else in a contractor's billing cycle, not just on the aging report. AP retainage, the money an electrical sub withholds from its own subcontractors, is just as invisible in QuickBooks as AR retainage. Most shops track it in a side spreadsheet, which means two reconciliation problems instead of one. Sage Intacct handles the payable side the same way it handles the receivable side: retainage withheld from a subcontractor posts to its own payable account instead of sitting inside the regular AP balance, so the contractor can see what it owes now versus what it's holding until the sub's work is accepted.
The release workflow matters just as much as the tracking. Once a general contractor authorizes release, Sage Intacct's retainage tool moves the held amount from retainage receivable into a billable invoice in a single step. QuickBooks has no equivalent function, so the release becomes a manual journal entry someone has to remember to make correctly.
WIP integration is where the two systems diverge the most. A schedule of values built once in Sage Intacct feeds every pay application and rolls straight into WIP calculations. In QuickBooks, that same schedule usually lives in a separate spreadsheet, disconnected from both the invoice and the WIP schedule it's supposed to inform.
Because retainage sits in its own account instead of a manual export, a contractor can run a native retainage report and drill into exactly which contracts and pay applications make up that balance, the kind of detail an auditor or surety asks for at renewal time.
Who Actually Needs to Make This Change
This is not strictly a small-company problem. Plenty of electrical subs running seven and eight figures in annual revenue are still on QuickBooks, and some of them should have moved off it years ago. The pattern that matters is not size, it's whether the system was built for construction billing in the first place. Anything without retainage tracking, whether that's QuickBooks or a generic accounting platform, creates the same aging distortion regardless of how big the company gets.
What This Actually Fixes (and What It Doesn't)
Switching systems does not make retainage collectible sooner. It is contractually withheld until the job meets whatever conditions the contract specifies, and no accounting platform changes that timeline. What changes is whether a controller can look at an aging report and immediately tell the difference between money that's overdue and money that's simply not due yet.
Frequently Asked Questions
Can Sage Intacct release retainage automatically once contract conditions are met?
No. Someone still has to confirm the conditions in the contract have been satisfied. Once that happens, Intacct's retainage tool moves the held amount into a billable invoice in one step instead of a manual reclassification entry.
Does QuickBooks track AP retainage, the amount withheld from subcontractors?
Not natively. Most QuickBooks shops track subcontractor retainage in a separate spreadsheet, which creates its own reconciliation gap alongside the AR side.
Will switching to Sage Intacct fix a WIP schedule that's already inaccurate?
Not automatically, but it removes one common cause of drift. Because the schedule of values behind a Sage Intacct pay application is the same data used to calculate percent complete, there are fewer places for the invoice and the WIP schedule to disagree.
See Your True Aging Report
The controller in this scenario had a visibility problem, not a collections problem, and it cost her an afternoon of digging through invoice detail to prove a number wasn't what it looked like. Sage Intacct removes that step by separating retainage at the point of posting, so the next aging report she runs already tells the truth.









