Odoo Construction Module (Part 1): Commercial & Financial Management
Managing a construction project is one of the most complex undertakings in any industry. Between tracking budgets, coordinating subcontractors, handling approvals, and monitoring on-site progress, the amount of moving parts can quickly become overwhelming. That's why we built our Construction Planning and Implementation Module for Odoo — a comprehensive solution designed specifically for contractors who need structure, transparency, and control over every phase of a project.
Module Overview

The module is organized around two major domains:
Commercial — covering everything related to contracts and financials
Project — covering day-to-day site operations, field logs, quality control, and project close-out.
*Note: In Part 1 of this series, we focus specifically on the Commercial side. Part 2 will cover site execution and field operations.
Here are the key commercial workflows we will cover in this post:
Contract Management — setting up multi-contract structures under a main project
Bill of Quantity (BoQ) — building two-level scope and budget breakdown
Cost Codes — structuring a hierarchical Work Breakdown Structure (WBS)
Procurement & RFQs — generating quotes and comparing purchase alternatives
Subcontracts & Claims — managing subcontractor agreements and progress claims
Progress Billing — invoicing clients accurately based on completed milestones
Variation Orders (VO) — handling scope changes with built-in version control and audit trails
Underpinning all of this is a Multi-Approval system that ensures every critical document goes through the right chain of command before it takes effect.
Step 1: Configure the Approval System
The module comes with a Multi-Approval engine where you can define Approval Types — one for each document type (Contract, BoQ, Variation Order, Subcontract, etc.) — and assign one or more Approvers to each.
This means that when someone submits a contract for approval, it automatically routes to the right people. You don't have to chase anyone down manually. Configure this once, and the system handles the routing for every document going forward.

Step 2: Create a Project

Every engagement starts with a Project. Think of this as the top-level container that holds all contracts, BoQs, subcontracts, and site activities related to a single construction job.
When creating a project, you'll need to provide:
Customer — the project owner or client
Planned Start & End Dates — the intended project timeline
Analytic Account — used to consolidate all financial transactions under a single reporting dimension for accurate cost analysis
Step 3: Define Your Cost Codes
Cost Codes are the backbone of your financial structure. They allow you to categorize every cost in the project — think of them like a work breakdown structure (WBS) or a chart of accounts tailored to construction.

The module supports a hierarchical, multi-level cost code structure. You decide how deep the hierarchy goes. To create a root-level cost code, simply leave the Parent Cost Code field blank. For child nodes, select the appropriate parent and it will appear automatically under the parent's Sub Cost Codes list.
For example:
01 - Civil Works 01.01 - Earthworks 01.02 - Foundation
02 - Structural Works
02.01 - Reinforced Concrete
02.02 - Steel Structure
Cost codes are then referenced in BoQ line items, giving you precise budget tracking by category.
Step 4: Create a Contract

A project can have one or more contracts.
When setting up a contract, you'll fill in:
Project — link to the parent project
Start Date & End Date — the contract period (which may differ from the project dates)
Contract Value — the agreed total amount
You'll also need to set:
Down Payment (DP) Product — a dedicated product used when issuing down payment invoices
Retention Product — a dedicated product used when issuing retention money invoices
Tip: It's a good practice to create dedicated products specifically for down payments and retention money. This keeps your financial reports clean and makes reconciliation much easier.
Once you save the contract, the system automatically creates a Bill of Quantity at Version 1 and links it to the contract. You can navigate directly to the BoQ by clicking the arrow (→) button next to the Actual Cost field.

Step 5: Build the Bill of Quantity
The Bill of Quantity (BoQ) is where you define the scope and budget of the contract in detail. The module uses a two-level structure:
Level 1: Sections — major work categories (e.g., Structural Works, Finishing Works)
Level 2: BoQ Items — individual line items within each section
Creating Sections
Click Add a Line on the BoQ form to add a new section. Fill in the Code and Description. The summary columns — Budget Total, Committed Cost, and Actual Cost — are read-only and calculated automatically.

Column | Description
|
Budget Total | Total planned value of all items in this section |
Committed PO Cost | Value of items converted to Purchase Orders |
Committed Subcontract Cost | Value of items converted to Subcontracts |
Committed Cost | Combined total of PO + Subcontract commitments |
Actual Cost | Total value of posted (confirmed) invoices linked to this BoQ |
These columns exist so you can monitor budget burn in real time — at a glance, you can tell whether you're within budget or heading toward a cost overrun.
Adding BoQ Line Items

Click the (→) button on a section to open its detail form, then click Add a Line to add individual items.
For each line item, fill in:
Item Code — a unique reference for this line
Cost Code — link to your cost code hierarchy
Product — the Odoo product representing this work or material
Description — a plain-language description of the scope
Unit — unit of measure (m², m³, pcs, etc.)
Planned Qty — the budgeted quantity
Unit Rate — the price per unit
Two additional read-only fields track procurement progress:
Committed Qty — how many units have been converted to a Purchase Order
Received Qty — how many units have actually been received on-site
Step 6: Submit for Approval
Once the BoQ is ready, click Request Approval. The request will be routed to the designated approvers you configured in Step 1.

The approver reviews the document and clicks Approve. Upon approval:
The contract status changes to Active
The BoQ becomes read-only — protecting the agreed scope from accidental edits
From this point on, any changes to the scope must go through a Variation Order (covered in Step 12). This is intentional — it creates a proper audit trail for every scope change.

Step 7: Enable Purchase Alternatives
Before creating RFQs, we recommend activating the Purchase Alternatives feature in Odoo's Purchase settings. This allows you to compare quotations from multiple vendors side by side and select the best offer before committing to a Purchase Order.

Step 8: Create Requests for Quotation (RFQ)
From the BoQ, you can generate RFQs directly for any line item. Click Create RFQ and a wizard will appear.


In the wizard:
Select vendors — you can add multiple vendors, and the system will create one RFQ per vendor automatically
Set the Order Date and Scheduled Delivery Date
Tick the items you want to include in this RFQ
Set the Qty to Order — cannot exceed the planned quantity minus already committed quantity
Adjust the Unit Rate if you expect a different price from this vendor
For Subcontracts: If the work will be performed by a subcontractor rather than purchased as materials, tick the Is Subcontract checkbox. When the RFQ is confirmed into a Purchase Order, a Subcontract record will be created automatically.
Click Create RFQs and the system generates all the RFQs in one go.
Step 9: Review RFQs, Purchase Orders, and Subcontracts

Back on the BoQ or Contract form, you'll find smart buttons showing the count of related RFQs, Purchase Orders, and Subcontracts. Click any of these to review, compare, and confirm.
Use the Purchase Alternatives feature here to compare vendor quotes and choose the most competitive offer before confirming the PO.
Step 10: Manage Subcontracts and Claims

Each Subcontract represents a formal agreement between your company and a subcontractor for a defined scope of work. After the subcontract is approved, you can begin processing Claims — which are how the subcontractor bills you for work completed.

There are three types of claims:
Claim Type | Purpose
|
Down Payment | An upfront advance payment to the subcontractor |
Progress | Periodic billing based on completed work (net of DP and retention) |
Retention | Release of withheld retention money upon completion |

For progress claims, fill in the Measurement Sheet — a breakdown of which BoQ items are being claimed and the quantity completed. You can use the Populate from Subcontract BoQ Items button to pre-fill all items automatically, then delete or adjust as needed.
Once the claim is submitted and approved, you can proceed to create the Vendor Bill directly from the claim.

Step 11: Progress Billing to the Client

Progress Billing works on the Contract level and is the mirror image of subcontract claims — except here, you are invoicing your client rather than paying a subcontractor.
The same three billing types apply: Down Payment, Progress, and Retention Release. Each billing goes through the same approval workflow before an invoice is generated.
This parallel structure — claims flowing up from subcontractors, billings flowing out to the client — gives you a clear view of your cash flow position on every contract at any point in time.
Step 12: Variation Orders

Construction projects rarely go exactly as planned. When the scope needs to change — whether it's an addition, a reduction, or a substitution — the correct channel is a Variation Order (VO).

There are three VO types:
Type | Description
|
Addition | New scope or quantity increase |
Omission | Removal of scope or quantity reduction |
Substitution | Replacing one item with another |
When creating a VO line:
To increase an existing item's quantity — set the Ref. BoQ Item and enter a positive quantity
To decrease an existing item's quantity — set the Ref. BoQ Item and enter a negative quantity
To add a brand new item — set the Target Section and leave Ref. BoQ Item blank
Submit the VO and request approval. Once approved, the system automatically:
Creates a new BoQ version (incremented from the latest version)
Sets the new version as the active BoQ for the contract
Marks the previous BoQ as Amended
All previous BoQ versions are preserved as an audit trail, so you always have a complete history of how the scope evolved.

Now that your commercial setup, BoQs, subcontracts, and variation orders are in order, how do site teams handle field operations?
👉 Read Part 2: On-Site Execution, Progress Tracking & Handover to see how Daily Reports, Material Requisitions, Snag Lists, and Defect Liability Periods work inside Odoo.




Comments