Why Xero doesn't have a retention field
It's not an oversight — it's a backlog decision. Construction retention (a percentage of each invoice withheld by the client until practical completion, and again until the end of the defects liability period) is a request Xero's own community has been raising for years. Xero has acknowledged the interest but hasn't committed it to development, so the accepted answer is a manual workaround using existing accounts and reports.
There's no retention tracking built into Xero. You build it yourself with a dedicated ledger account, a negative line item on every invoice, and a report you filter by hand — or a tool that does this for you.
The workaround, step by step
Create a new account in your chart of accounts — something like Retentions Held — as a current asset (for retention your customer owes you) on the Balance Sheet.
On every invoice for a contract with retention, add a separate line item for the retained amount as a negative value, coded to the Retentions Held account instead of your normal income account.
Use the invoice's description field to log the cumulative retention held to date on that contract. This is the part most people skip, and it's the part that makes the report usable later.
Run the Account Transactions report filtered to Retentions Held whenever you need to see what's outstanding, and reconcile it against the description notes you've been leaving.
Some accountants use a Prepayments-style structure or a dedicated credit note per contract instead — the mechanics differ, but the constraint is the same: Xero doesn't know what "retention" means, so you're repurposing general-ledger tools to track something contract-specific.
The negative line item method has a known problem: it doesn't get CIS deducted correctly, because Xero calculates CIS on the invoice's net line items and a negative retention line distorts that calculation. If your contracts fall under the Construction Industry Scheme, check with your accountant before using this method as-is — some firms instead calculate CIS on the gross value before retention and record the retention separately, outside the CIS-bearing invoice lines.
Where this breaks down
The workaround holds up for one contract and a good memory. It stops holding up here:
Want the spreadsheet version of this, already built?
Free template: contract ledger, aging buckets, and both release dates calculated automatically.
Working out your actual release dates
Before you even get to tracking, most subbies don't have the two release dates written down anywhere precise — just a rough sense of "sometime next year." If you want the exact dates for a single contract right now, the calculator does the maths for you: first moiety at practical completion, final release at the end of the defects liability period.
Retention Release Date Calculator
Enter your contract value, retention %, and completion date — get both release dates instantly, free.
The version that runs itself
A spreadsheet and a disciplined habit will get a one-contract subbie most of the way there. Past that, RetainFlow connects directly to your Xero org, builds the same ledger and aging view automatically from your invoices, and emails you before each release date is due — no more re-reading description fields to figure out what's owed.