Retainage is the 5–15% of contract value withheld by an owner or GC until your roofing job is fully complete and accepted. It's money you've earned — but without a proper tracking system in QuickBooks, it disappears from your books the moment you invoice at 90% and never shows up again. Roofing contractors at $2M revenue commonly have $40,000–$120,000 sitting in uncollected retainage. Here's how to fix that.
What Is Retainage and Why Does It Go Uncollected?
Retainage is a contractual holdback — typically 5–10% on residential work and 10% on commercial — that the owner or GC withholds from every progress payment until the job reaches substantial or final completion. It's designed to protect the owner from incomplete work or defects.
It goes uncollected for one reason: it's invisible. When a roofing contractor invoices for $45,000 on a $50,000 job and the owner pays $45,000, the $5,000 retainage is often never entered into QuickBooks as a receivable. It's not in AR, not on the balance sheet, and not on anyone's follow-up list. When the job wraps up, everyone moves to the next one and the retainage invoice never gets sent.
Step 1: Set Up Retainage Receivable in QuickBooks
Retainage is not regular accounts receivable — it has a different collection timeline and is released separately. It needs its own account.
- Go to Chart of Accounts → New
- Account Type: Other Current Assets
- Detail Type: Other Current Assets
- Name: Retainage Receivable
- Save
Also create a Retainage Revenue income account if you want to track retainage collections separately from regular job revenue — useful for seeing how much retainage you're releasing each month.
Step 2: Invoice Correctly to Capture Retainage
The correct method uses a two-line invoice:
- Line 1: Full service description — amount = full contract price (e.g., $50,000)
- Line 2: "Retainage withheld (10%)" — amount = negative retainage (e.g., -$5,000)
- Invoice total = $45,000 (what the customer pays now)
- The $5,000 is posted to Retainage Receivable as a debit — it now exists as an asset on your balance sheet
| Invoice Line | Amount | Account |
|---|---|---|
| Roofing services — 44 Maple St | $50,000 | Roofing Revenue |
| Retainage withheld (10%) | -$5,000 | Retainage Receivable |
| Invoice total (due now) | $45,000 |
Now the $5,000 is visible on your balance sheet under Other Current Assets — not hidden in a drawer.
Step 3: Invoice for Retainage When the Job Completes
When the job reaches final completion, submit documentation to the owner (signed completion certificate, final photos, lien waiver) and immediately create a retainage release invoice:
- Create a new invoice for the same customer and Project
- Line item: "Retainage release — [job address]" — amount: $5,000
- Account: Retainage Receivable (this clears the asset balance) or Retainage Revenue
- Send the invoice and follow up in 14 days if unpaid
Step 4: Monthly Retainage Review
On the first of every month, run a Balance Sheet report in QuickBooks and look at the Retainage Receivable balance. Then run a custom report or export to see which jobs make up that balance and how old each is.
| Age of Retainage | Action |
|---|---|
| 0–30 days after completion | Invoice sent, awaiting payment — normal |
| 31–60 days after completion | Follow-up call or email — remind owner |
| 61–90 days after completion | Urgent follow-up — escalate to owner directly |
| 90+ days after completion | Formal demand letter — consider lien rights |
JobCostBooks includes this monthly retainage aging review as standard for all clients — flagging any balance over 60 days past job completion in the monthly report. See our roofing bookkeeping services for details.
How Much Retainage Should You Expect on a Roofing Job?
Retainage rates vary by contract type and customer. Knowing the typical range helps you catch contracts where the holdback is unusually high or where the release terms are unfavorable.
| Job Type | Typical Retainage Rate | Release Trigger |
|---|---|---|
| Residential insurance restoration | Depreciation holdback (varies) | Proof of completion + RCV release from insurer |
| Residential retail re-roof | 0–10% | Final walkthrough and sign-off |
| Commercial (GC-managed) | 10% | Substantial completion per AIA contract |
| Public/government work | 10% (some states: 5% after 50% complete) | Certificate of substantial completion |
| Insurance restoration (commercial) | 10% + depreciation holdback | Certificate of completion + carrier approval |
On a $3M roofing company doing 30% commercial work, that's roughly $900,000 in commercial revenue per year. At 10% retainage, you could have $90,000 in outstanding holdback at any given time — money fully earned but sitting in customers' accounts. Without a tracking system, a significant portion of this goes uncollected simply because no completion invoice was sent.
Insurance Restoration Retainage: ACV vs RCV Explained
Insurance restoration work has a different retainage structure than commercial contract work. Understanding it is essential for tracking correctly in QuickBooks.
ACV (Actual Cash Value) is what the insurer pays upfront — the replacement cost minus depreciation. For a $18,000 roof with $4,000 in depreciation, the ACV payment is $14,000. That arrives when the claim is approved.
RCV (Replacement Cost Value) is the full amount — $18,000. The remaining $4,000 (the depreciation holdback) is released by the insurer after you submit proof of completion: photos, invoice, and sometimes a signed certificate.
In QuickBooks, this should be recorded as:
- Invoice the full RCV ($18,000) to the job's Project
- Record the ACV payment ($14,000) as a partial payment
- The remaining $4,000 sits as an open receivable in the Depreciation Holdback Receivable account
- When the insurer releases the holdback, record the $4,000 payment and close the receivable
Many roofing contractors record only the ACV payment and never invoice for the depreciation holdback — effectively writing off thousands of dollars per job. On a contractor doing 60 insurance jobs per year at an average $3,500 depreciation holdback, that's $210,000 in uncollected revenue annually.
Prompt Payment Laws: Your Legal Right to Collect Retainage
Most US states have prompt payment laws that govern how quickly retainage must be released after substantial completion. These laws give roofing contractors legal recourse when owners or GCs delay releasing holdback beyond the contractual period.
| State | Retainage Release Requirement | Penalty for Late Payment |
|---|---|---|
| Texas | Within 30 days of substantial completion | Interest + attorney fees |
| Florida | Within 25 days of payment application | 2% per month interest |
| California | Within 60 days of completion | 2% per month + attorney fees |
| Colorado | Within 60 days of acceptance | Interest at legal rate |
| North Carolina | Within 60 days of completion | Interest at 1% per month |
| Illinois | Within 30 days of invoice | 2% per month interest |
| Georgia | Within 15 days (sub to GC) | 1.5% per month interest |
Knowing your state's prompt payment law matters for two reasons: it gives you a specific date to follow up on overdue retainage, and it gives you grounds to charge interest on delayed payments. Your attorney can advise on enforcing these rights — but you can only exercise them if you know what's outstanding, which requires proper retainage tracking in QuickBooks.
5 Retainage Mistakes Roofing Contractors Make in QuickBooks
1. No dedicated Retainage Receivable account. Without a separate account, retainage is buried inside regular Accounts Receivable. You can't see the total outstanding, can't age it, and can't report it separately to your CPA. Fix: create Other Current Asset → Retainage Receivable.
2. Recording retainage as income when billed, not when collected. On accrual-basis books, retainage income is recognized when earned (when the job is complete), not when collected. Recording it incorrectly overstates or understates monthly revenue depending on timing. Fix: use proper journal entries or QuickBooks retainage invoice workflows.
3. Closing jobs in QuickBooks before retainage is collected. Once you mark a Project as complete in QuickBooks, it's easy to stop looking at it. But if retainage is outstanding, the receivable should remain open. Fix: don't close Projects until all invoices — including the retainage invoice — are paid in full.
4. Not invoicing for retainage at job completion. Retainage doesn't collect itself. An invoice must be sent. Many contractors complete the physical job and move on without sending the retainage invoice, especially when crews are busy with the next job. Fix: create a standard checklist — retainage invoice is step 1 of job closeout, not an afterthought.
5. Using the same income account for retainage and regular revenue. Mixing retainage into your main Roofing Revenue account makes it impossible to see true earned revenue vs. holdback. Fix: use separate income accounts for Roofing Revenue and Retainage Revenue, or track through the balance sheet Retainage Receivable account until collected.