Hold, track, and release retainage without leaving the invoice
Withhold a percentage or fixed amount from every progress invoice, isolate it in a dedicated retention account, and release it manually, by date, by milestone, or in bulk — with a full aging dashboard and contractor-to-subcontractor coordination.
The problem
Construction and long-duration projects withhold retainage — commonly 10% — on every progress invoice until completion. That money is earned but not yet payable, and native Odoo has no way to separate it: teams resort to manual invoice splits, negative lines, and spreadsheets to track what is held, for how long, and when it becomes due, which distorts receivables aging and makes subcontractor payment error-prone.
The solution
This module holds a percentage or fixed amount at posting time, reclassifies it into a dedicated reconcilable retention account, and releases it back into a fresh receivable or payable automatically — by date, by project milestone, in bulk with an approval gate, or manually. Held, released, and payable-now amounts are visible directly on the invoice, with an aging dashboard and contractor-to-subcontractor linkage across the whole retainage lifecycle.
Everything retainage needs, built into invoicing
Every capability below is implemented in the module.
Percentage or fixed retainage on every invoice
Set a retention percentage or fixed amount right on customer invoices and vendor bills; the held, payable-now, and released amounts recalculate live from the invoice total.
Dedicated, reconciled retention accounting
Posting an invoice with retainage creates a reclass entry that moves the withheld amount into a separate reconcilable retention account, partially settling the invoice's own receivable or payable line.
Manual, scheduled, and milestone-based release
Release a tranche by hand, let a daily automated check release it once its scheduled date arrives, or link it to a project milestone so it releases the moment the milestone is marked reached.
Multiple release tranches per invoice
Split retainage on a single invoice into several tranches, each with its own amount, trigger, and release date, so partial-completion schedules such as 50% at substantial completion and 50% at final acceptance are modeled directly.
Bulk release with an approval gate
Review every eligible tranche in one screen at period-end and release them together only after an explicit approval checkbox is confirmed — no more releasing retainage invoice by invoice.
Customer and supplier retainage, linked
Track retainage held from customers and retainage your company holds from subcontractors side by side, and link a customer tranche to a supplier tranche so releasing one can automatically release the other.
In-invoice retained/released breakdown
A dedicated Retainage tab on every invoice shows the retention type, account, journal, project, and a live breakdown of amount held, amount released, amount payable now, and the current retainage status.
Retainage aging & release dashboard
A read-only aging report groups held and released amounts into aging buckets by partner, project, and direction (customer vs. supplier), so accounting can see exposure and upcoming releases at a glance.
Configurable company defaults
Set the default retention percentage, hold period, retention accounts, retention journal, and multi-tier auto-release behavior once in Accounting Settings; every new invoice inherits them.
How it works
Configure retainage
Set the retention receivable/payable accounts, retention journal, default percentage, and hold period once in Accounting Settings.
Withhold on the invoice
Choose a percentage or fixed amount on a customer invoice or vendor bill; posting it reclassifies the retained amount into the retention account automatically.
Track held and released amounts
Monitor open tranches on the invoice's Retainage tab and across every project and partner on the aging dashboard.
Release on trigger
Release manually, on a scheduled date, on a reached project milestone, or in a reviewed bulk batch — each release posts a fresh receivable or payable and updates the tranche.
Frequently asked
No sales fog. If your question isn't here, email us and we'll answer it the same way.
Yes. Retainage can be set on customer invoices and vendor bills independently, using mirrored accounting so held amounts always reconcile against the correct trade receivable or payable.
Buy it on the Odoo App Store
Purchase, download and install directly from the official Odoo Apps Store — you'll always get the latest supported build.
Project Invoice Withholding / Retainage Management
Percentage or fixed retainage on every progress invoice, booked to a dedicated reconciled account, released manually, on schedule or at a milestone in multiple tranches, with an aging dashboard.
Buy on Odoo App Store