This type of invoicing by progress certifications is common in construction but, as you may know, it's not a standard flow in Odoo. That’s why we often rely on a series of workarounds to meet the business requirements. Here are some of the most useful ones:
Case 1: Quotation as base + manual invoice duplication
-
A Sales Order (SO) is created with all project lines.
-
For each certification, an invoice is created with all lines, adjusting the quantities to be invoiced.
-
For subsequent certifications, invoice #1 is duplicated to ensure all original lines appear again.
-
A final negative line is added to deduct the total already invoiced.
Limitation: These invoices are not linked to the SO, so Odoo always shows an outstanding amount to be invoiced.
Tip: Use custom tags to identify certification invoices and track their progress.
Case 2: Standard flow + informational lines
-
Use Odoo’s partial invoicing feature from the SO.
-
Add informational lines (or include a table in Terms and Conditions) summarizing previously certified amounts.
Advantage: Ensures accounting traceability and accurate SO updates.
Drawback: The invoice may be confusing for clients unless properly explained.
Case 3: Custom development (consolidated PDF)
-
Use the standard flow to invoice from the SO.
-
Customize the PDF invoice layout to include:
-
All lines from the original SO.
-
Columns showing what was already invoiced, what is being invoiced now, and what remains.
-
A final negative line showing the cumulative amount already billed.
Advantage: The client receives a clear, original-style invoice while keeping correct SO status and accounting in Odoo.
Case 4: Additional field with Studio
-
Add a custom “Certified Quantity” field to the SO using Odoo Studio.
-
Include this field in the PDF or use a quote calculator in Excel to generate the final document.
Limitation: In this case, the client typically sends the Excel sheet instead of using Odoo’s built-in quotations.
Bonus tip: It's common in this sector to apply a 5% retention on the total invoiced amount.
A practical workaround is to:
-
Add a predefined note about the retention in the Terms and Conditions.
-
Let the client manually calculate the net payable amount.
💬 I hope these ideas help anyone facing similar scenarios in construction projects with Odoo.
Have you tried other approaches to solve this? Feel free to share!