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 StoreMore Odoo accounting apps
QR Code In Invoice
Configurable, branded QR codes on invoices, bills and POS receipts with scan analytics and bulk generation — one module instead of separate payment, POS and portal QR apps.
Rebate Agreements
Vendor and customer rebates accrued automatically against tiered thresholds, with a visual tier ladder and forecast — through incremental claims, one-click settlement and a partner portal.
Register Payments on Sale & Purchase Orders — Advance & Auto-Reconcile
Advance payments on sale and purchase orders, with automatic reconciliation against the final invoice or bill — built natively on Odoo.
Remittance Advice Report
Itemized remittance advices delivered by email, SMS and inbox with one-click batch send and delivery status tracking — breaking down exactly which invoices, discounts and advances each payment settles.
Revenue Leakage & Billing Assurance
Nine scanners that detect unbilled deliveries, unlinked timesheets, policy-breaking discounts and stuck drafts — on a money-ranked cockpit with one-click, reversible recovery.
Sale Invoice Company Currency
Show the company-currency total on foreign-currency invoices at a rate locked on posting, with visible rate provenance and fallback — plus reconciliation and batch refresh wizards.