Retention is the single largest line on most subcontractor balance sheets that nobody can produce a clean report on. The dollars are owed, the GCs know they're owed, and yet at closeout the numbers don't match and the negotiation almost always favors the side with better records. This is a working guide for sub accountants on how to roll retention forward cleanly — what to track, where it gets lost today, the state-by-state release triggers most subs miss, and how AOS handles the whole thing on one record.
If you're a sub accountant, you already know the shape of this problem. Every pay app withholds a percentage. The withheld amount sits in the GC's books as a payable to you, in your books as an AR, and (somewhere) in a spreadsheet that someone in your office maintains because neither system tracks it cleanly enough by project, by GC, by phase. At closeout, you compare numbers with the GC. They don't match. The dispute begins.
This post walks through how to set up retention tracking that survives that closeout conversation, including the parts of the workflow most subs don't realize are state-statute-governed.
What retention actually is, in two sentences
Retention (also called retainage) is a percentage of each progress payment that the GC withholds from the sub until specified milestones — typically substantial completion or a statutory reduction trigger. The purpose is to give the GC (and the owner up the chain) financial leverage to ensure the sub completes punch-list work, delivers closeout documents, and resolves warranty issues.
The standard rate is 10% in most commercial contracts, though it varies. Some contracts step down to 5% at 50% project completion. Some states cap retention at lower rates by statute. Some contracts release all retention at substantial completion; others hold a portion through warranty.
The three places retention gets lost
From conversations with sub accountants and from controllers reviewing closeout disputes, retention drift consistently traces back to three specific failure modes.
1. Retention is tracked at the project level, not the SOV-line level. Most sub-side accounting systems track retention as a single number per project — cumulative dollars withheld. That works fine during the project. It breaks at closeout when the GC starts releasing retention piecemeal — some lines released at 50% completion of those specific scopes, some held through punch, some held longer for warranty-bonded scopes. Without line-item tracking, the sub can't tell which releases the GC has made against which scopes, and the spreadsheet drift starts.
2. State statutory triggers aren't applied. A surprising number of subs don't know that many states have laws governing retention release. California, Texas, Florida, Pennsylvania, Illinois, New York, Washington, Oregon, and at least 20 other states have statutes that either limit retention rates, mandate reduction at milestones, or require release within specific timeframes after substantial completion. If the contract is silent (it often is), the statute applies. Subs who don't track statutory triggers leave retention on the table that they were legally owed.
3. The handoff between pay-app cycles loses retention math. Every pay app cycle, retention should roll forward: prior retention balance + this period's withholding - any releases = new retention balance. Most subs do this in Excel. The spreadsheet drifts from the accounting system; the accounting system drifts from the GC's records; nobody trusts the numbers by month 18 of a long project.
What a clean retention rollforward report needs
If you want to be able to produce a defensible retention statement at any point during a project — not just at closeout — the rollforward report needs to track at minimum:
- By project — the standard view, but the least useful for dispute resolution
- By GC client — aggregated across all your active projects with that GC, because GCs sometimes have firm-level release policies that override project-level math
- By SOV line item — so you can identify which specific scopes have been released and which are still being withheld
- By release trigger — substantial completion, 50% completion, punch closure, warranty period end, statutory deadline, etc.
- By state statutory rule — the trigger date and conditions that the statute imposes on each project, regardless of contract silence
For each retention dollar, the report should show:
- The pay-app cycle in which the dollar was withheld
- The contractual rate applied (10%, 5%, etc.)
- The release trigger condition (e.g., "released at substantial completion of phase 2")
- The current status: held, released by GC, released-pending-payment, paid, or in dispute
- The statutory deadline by which the GC must release under the controlling state law
- The supporting documentation (pay-app number, lien waiver if applicable)
That's what a defensible retention statement looks like. Most subs cannot produce it cleanly today, because the data lives in too many places.
State retention-release rules every sub should know
The state-by-state landscape is more varied than most subs realize. Below are the highlights for several major commercial-construction states. This is general information, not legal advice — consult your construction attorney on specific contracts and jurisdictions.
California. Retention is capped at 5% on most public works projects under Public Contract Code Section 7201. Private projects can have higher contractual retention, but California Civil Code Section 8800 imposes payment timing requirements. Retention must be released within 60 days of completion of the entire project (not just the sub's portion). Disputed retention can be withheld but only the disputed amount, not the entire retention balance.
Texas. Texas Property Code Chapter 53 governs retention. Subs have prompt-pay protections requiring GC payment within 7 days of GC receiving payment from the owner. Retention release follows similar timing tied to substantial completion.
Florida. Florida Statute Section 715.12 caps retainage at 5% after 50% completion for public construction projects valued at $200,000 or more. The reduction is automatic at the 50% trigger, not contingent on contract language — subs are owed the reduced retention even if the contract is silent.
New York. New York General Business Law Article 35-E governs commercial construction prompt-pay and retention. Retention must be released within 30 days of the sub completing their work, subject to GC and owner approval. New York's lien laws also affect retention — subs have specific rights to file mechanic's liens against retained funds.
Pennsylvania. Pennsylvania's Contractor and Subcontractor Payment Act (CASPA) governs prompt-pay including retention. Retention must be released within 30 days of substantial completion, with interest accruing on late releases.
Illinois. Illinois Contractor Prompt Payment Act provides for retention release within specified timeframes after substantial completion. Public works retention is capped statutorily.
Washington. Washington's prompt-pay statutes (RCW 39.04.250 and related) cap retention on public projects and require release within specific windows after substantial completion.
Most other states have analogous statutes with varying caps, triggers, and timelines. The single most important takeaway: if your contract is silent on a retention issue, the state statute applies, and you should know what it says. The default of "we'll wait until the GC releases it" leaves money on the table in nearly every jurisdiction with an active prompt-pay statute.
The handoff with lien waivers
Retention release usually triggers a final unconditional lien waiver from the sub. The math has to be exact: the lien waiver covers the specific dollar amount being released, not a round number, not the project total. Submitting a waiver for the wrong amount blocks payment until corrected, which is itself a common source of retention delay.
The waiver also has to be on the correct state's statutory form. Many states have prescribed lien-waiver forms that must be used — California, Texas, Florida, and others. Using the wrong state's form, or a custom form when the statute requires the prescribed one, can void the waiver.
For more on the lien-waiver side of the cycle specifically, see our state-by-state lien waiver guide.
How most subs handle retention today, and why it breaks
The typical mid-market sub handles retention with some combination of:
- Their accounting system tracks a single retention number per project — the cumulative amount withheld across all pay apps
- A spreadsheet (maintained by an AR clerk) tracks more granular detail, but is often out of date by a cycle or two
- The GC's portal shows what the GC says retention is — which may or may not match the sub's records
- State statutory triggers are not tracked at all; the sub waits for the GC to release
- At closeout, somebody manually reconciles all three views and the dispute begins
The reason this breaks is not that the people involved are careless. It's that the data lives in three places, no single system tracks all the dimensions that matter (project, GC, SOV line, release trigger, state statute), and the rollforward math has to be redone every cycle by hand.
How AOS handles retention rollforward
In AOS, retention is a first-class object, not a derived calculation. Specifically:
- Retention is tracked at the SOV-line level, not the project level. Every pay-app cycle, the platform applies the contract's retention rate to each line and records the dollars withheld, the cycle, the contract reference, and the release trigger conditions.
- The rollforward report can be produced at any moment: by project, by GC, by trade, by release-trigger status. The numbers reconcile to your AR, your pay-app history, and (when the GC is also on AOS) the GC's payable.
- State statutory triggers are tracked automatically. AOS knows the controlling state for each project and applies the relevant statute — 50% completion reductions in Florida, prompt-pay deadlines in California, CASPA timelines in Pennsylvania, and so on. When a statutory release deadline approaches without GC action, AOS flags it.
- Substantial completion triggers retention release workflow automatically. When the GC certifies substantial completion in AOS, the eligible retention release is queued for the next pay-app cycle with the correct lien waiver attached and the dollar amount precise to the cent.
- If the GC is on AOS, retention is the same database row on both sides. Your AR retention balance and the GC's retention liability are two views of the same number. Closeout reconciliation becomes confirmation, not negotiation.
- If the GC is off-platform, AOS still tracks the full rollforward and produces the dispute-defensible report. When you do reconcile with the GC at closeout, you bring records that are line-level granular, statutorily-aware, and timestamped — which is usually enough to resolve the conversation quickly.
The sub accounting role page walks through the full AR / retention / pay-app / lien-waiver workflow. The G702/G703 working guide covers the pay-app side specifically. The both-sides-on-one-record post walks through what changes when the GC is also on the platform.
The retention readiness checklist
If you want to run your current retention process through a quick health check, the questions to ask are:
- Can your accounting system produce a retention rollforward report by GC client, aggregated across all active projects with that GC?
- Can it produce the same report by SOV line within a project?
- Does your retention tracking know the controlling state statute for each project?
- Can you identify the statutory release deadline for any specific retention dollar?
- When the GC releases retention, does your system automatically queue the corresponding lien waiver on the correct state's form?
- At closeout, can you produce a defensible retention statement that ties to your AR, your pay-app history, and (ideally) the GC's payable?
If the answer to most of these is "yes, in Excel" — that's the gap AOS closes.
If you want to see it on your own data
We're in private-beta design-partner mode for commercial subs and GCs. If you'd like to walk through how AOS handles retention rollforward on a real project of yours — particularly one that's gone through (or is heading toward) a contentious closeout — apply to the beta. We'll show you the report you can't produce today.