Odoo 19 for Construction

Odoo for Construction Companies: Job Costing, Subcontractors and Progress Billing

Star Bit Solutions11 min read

Odoo for construction works when every job has its own analytic account, budget and billing rules before the first purchase order goes out. Here is how to set up job costing, subcontractor bills and progress claims in Odoo 19 Enterprise, and where retention needs extra work.

A job costing dashboard with budget, committed and achieved bars, milestone markers, and icons for subcontracts, timesheets, invoicing and retention
Scroll

Key takeaways

  • Give every job its own project and analytic account first, so purchases, timesheets and bills land on the right job automatically.
  • Analytic budgets in Odoo 19 show committed cost from confirmed purchase orders, so an overrun appears before the supplier's bill arrives.
  • Milestones and manually updated delivered quantities cover stage payments and measured progress claims without custom code.
  • Retention has no dedicated feature: use payment terms or a retention line, and plan a custom module if it must be calculated and released automatically.

A contract's margin is rarely lost in the estimate. It slips away in the months after award, when material orders, subcontractor claims and overtime arrive faster than anyone can post them against the right job. By the time the final account is agreed, the margin has quietly gone.

Odoo for construction works when the structure is in place before the first purchase order goes out: one project per job, an analytic account that every cost carries, a budget that counts what is already committed, and billing rules that match the contract. This guide walks through that setup in Odoo 19 Enterprise, released in September 2025, and flags the parts, such as retention, that need custom work.

Odoo for Construction Starts with the Project and Its Analytic Account

In Odoo, each job runs as a billable project, and its analytic account ties everything together. The profitability panel on the project dashboard only shows records linked to both the project and its analytic account. Get that link right and costs find their job without retyping.

Analytic accounting tracks costs and revenue by something other than the ledger account, such as a job, a site or a division. Enable it in the Analytics section of the Accounting settings, then design your analytic plans. A sensible pattern is one plan for jobs and a second for cost type: materials, labor, subcontract and plant hire.

Two settings save correction work later:

  • Mandatory applicability. Make the jobs plan mandatory on vendor bills, so a bill cannot be confirmed until someone chooses a job.
  • Analytic distribution models. Apply a distribution automatically by partner, product, product category or account prefix, so recurring costs such as a site office rental always land on the right job.

Odoo 19 also improved project templates. To reuse a well-run job, duplicate it and convert the copy into a template, because converting a project archives it. Then add project roles and planned dates, so each new job starts with the same stages, tasks and schedule.

Budgets and Committed Cost: Seeing an Overrun before the Bill Arrives

Comparing posted bills with a budget tells you too late, and the profitability panel only counts a purchase order once its bill is posted. What matters on site is committed cost: what you have agreed to pay, billed or not.

Turn on Budget Management in the Analytics section of the Accounting settings, then create an analytic budget under Accounting > Accounting > Analytic Budgets. Each budget line can take an analytic account from each plan, so one line can combine a job with the subcontract cost type and carry its own budgeted amount. Once the budget is open, Odoo adds two columns:

  • Achieved, calculated from posted journal items that carry the analytic account.
  • Committed, which is the achieved amount plus confirmed purchase orders that have not been billed yet.

The budget also pushes back at the point of purchase. When a request for quotation or purchase order line carries an analytic distribution, a Budget smart button links to the budget report, and a line that would exceed an open budget is highlighted in red. When scope changes, use Revise, so the original budget stays on record beside the revision. Odoo's budget documentation covers periodic budgets and reporting.

Purchasing against a Job and Controlling Subcontractor Bills

Every purchase order for a job should name the job. In Odoo 19, a purchase order has a Project field, and its lines take their analytic distribution from that project, which keeps committed cost and job profitability trustworthy.

Tendering Subcontract Packages

With Purchase Agreements enabled in the Purchase settings, you can send alternative requests for quotation to several subcontractors for the same package, compare them line by line, choose the winning lines and cancel the rest. In Odoo 19, alternatives copy the analytic distribution from the original request, so the comparison stays tied to the job. For suppliers you buy from all year, such as ready-mix concrete or reinforcement steel, a blanket order fixes agreed prices for repeat orders.

Paying for Certified Work, Not Claimed Work

Subcontract work is usually bought as a service product, and for services the received quantity on the purchase order line is entered by hand. That suits construction: when your quantity surveyor certifies the month's work, enter the certified figure.

Services default to the On ordered quantities control policy, so switch subcontract products to On received quantities and turn on 3-way matching in the Purchase settings. A draft bill created from the order then covers only what has been certified. If anyone edits the bill above that, its Should Be Paid status changes to Exception, so finance sees the difference before paying. For large orders, the Purchase Order Approval setting adds a second approval step above an amount you choose.

Have a question about this guide? Ask the engineers who wrote it.

Timesheets and Labor Cost on Site

Only employees can log time, and timesheets are switched on in each project's settings. Each timesheet line is costed from the employee's hourly cost in their HR settings, and that cost appears under Costs in the project's profitability panel. Supervisors with the User: all timesheets access level can review, correct and validate their crew's entries, while staff can start a timer from the task they are working on.

Milestone Billing, Progress Claims and Retention

Odoo 19 handles the two common billing methods with standard configuration, and many jobs use both.

Stage Payments with Milestones

Create a service product with the Based on Milestones invoicing policy, which appears once milestones are enabled on at least one project, and set Create on Order to Project, or Project and Task. When the sales order is confirmed, the project is created with milestones enabled, and each milestone carries a Quantity (%) of the order line. Marking a milestone as reached updates the delivered quantity on the sales order. It does not create an invoice: someone still clicks Create Invoice, which gives finance a review step.

Measured Progress Claims

For contracts valued by measured work, sell the bill of quantities as service products with the Based on Delivered Quantity (Manual) invoicing policy. Each month, enter the cumulative certified quantity on each line, and Create Invoice bills only the difference since the last claim. Advance payments fit too: the Create Invoice wizard raises a down payment as a percentage or a fixed amount, and deducts it from a later regular invoice when Deduct down payments is ticked.

Retention: What to Configure and What to Build

Standard Odoo has no dedicated retention feature, so choose between these options early:

  • Payment terms with an installment plan. A term such as 95% due in 30 days and 5% due after 365 days splits the receivable into two journal items with their own due dates, so the aged receivable report shows retention as not yet due. The retained amount stays on the normal receivable account.
  • A retention line. A negative line using a retention product that posts to its own balance-sheet account keeps retention receivable visible as a separate balance. Releasing it later needs its own invoice and a clear routine.
  • A custom module. Automatic calculation, caps, release in stages at completion and at the end of the defects liability period, and a printed payment application are customization work.

The same choices apply to retention you hold back from subcontractors. Whichever route you take, agree the VAT treatment of progress invoices and retention with your tax adviser and check the latest guidance from the Federal Tax Authority. This article is not tax advice.

Documents, Photos and Approvals from Site

Drawings, permits, delivery notes and site photos belong with the job, not in someone's phone gallery. With the Documents app, each project has its own folder, counted on the project dashboard. A folder email alias files incoming documents automatically, and a document request asks a named person for a missing file, such as a signed delivery note, with a due date and reminders.

Sign handles subcontract agreements and variation approvals electronically, filing the signed copy and its certificate of completion on the record the request came from. Studio approval rules can require named approvers before a button such as Confirm works. Treat each variation as its own quotation with the Project field set to the job, using a variation product that creates nothing on order: its lines take the job's analytic distribution, no second project is opened, and the original contract value stays visible beside the variations.

A Worked Example: One Month on a Fit-out Job

Here is a month on a hypothetical fit-out contract worth AED 1,000,000, valued by measured work, with 5% retention. Figures are in AED, before VAT.

  1. Set up. The sales order is confirmed, its service lines create the project, and the job's analytic budget is opened with lines for materials, labor, subcontract and plant hire.
  2. Buy. Purchase orders carry the Project field. The partitions package is awarded from three alternative quotations, and Committed moves as soon as the order is confirmed.
  3. Record labor. Crews log time against the job's tasks, and supervisors review and validate it every Friday.
  4. Certify. At month end the quantity surveyor certifies work worth 200,000 to date, and the delivered quantities on the sales order lines are updated to match.
  5. Claim. Create Invoice produces a progress invoice for 200,000. With the retention line approach, a negative line of 10,000 brings the amount due to 190,000 and moves the retention to its own account.
  6. Pay subcontractors. The partitions subcontractor's certified quantity is entered as the received quantity, the bill is drafted from the order, and 3-way matching flags anything billed above it.
  7. Review. The project manager compares Expected, To invoice and Invoiced amounts in the profitability panel, checks committed cost against budget, and posts a project update: On Track, At Risk or Off Track.

Next month the certified total rises to 450,000, so the second claim bills 250,000 with 12,500 retention.

What Is Standard, What Is Configuration and What Needs Custom Work

RequirementOdoo 19 EnterpriseWhat it takes
Job cost and revenue in one viewProject profitability panelConfiguration: analytic plans and billable projects
Budget against committed costAnalytic budgets with Committed and Achieved columnsConfiguration, with the Purchase app
Subcontractor bills against certified workManual received quantity and 3-way matchingConfiguration and a monthly routine
Stage paymentsBased on MilestonesConfiguration
Measured progress claimsBased on Delivered Quantity (Manual)Configuration and a monthly routine
Retention receivable and payableNo dedicated featurePayment terms or a retention line; a custom module for automatic calculation and release
Payment application in your own formatStandard invoice layoutStudio report changes or a custom report
Advance recovered in proportion to each claimDown payments are deducted in fullCustom module

If you are weighing Studio against code for the custom pieces, our guide to when to configure, customize or write code sets out how we decide.

A Rollout Checklist for Contractors

  • Agree analytic plans for jobs and cost types, and make the jobs plan mandatory on vendor bills.
  • Build one project template per contract type, with stages, tasks and roles.
  • Create service products for stage payments, measured work, variations and retention.
  • Decide the retention approach and test it with your auditor before go-live.
  • Switch on Purchase Agreements, 3-way matching and purchase order approval.
  • Open a budget for every job and review committed cost in each site meeting.

Tip: Run one live job in Odoo for a full billing cycle before moving the rest. The first progress claim and subcontractor certificate will show which analytic rules, products and approval steps need adjusting.

How Star Bit Solutions Can Help

Through OdooStar, our Odoo practice in Ajman, we implement Odoo Enterprise for contractors across the UAE. We design the analytic plans and budgets with your finance team, configure purchasing and billing around your contract types, and build the custom pieces, such as retention or your payment application layout, as proper modules, which keeps the next upgrade predictable.

Our Construction and Real Estate page shows how our wider products fit contractors too. To talk through your jobs, contact us, call +971 55 973 4524 or email [email protected].

Star Bit Solutions logo
Written by the Star Bit Solutions team

Star Bit Solutions is a software company in Ajman, UAE, founded in 2014. We implement and customize Odoo Enterprise and Odoo Community, and build StarBiz (AI-driven ERP), StarHub (life super app), StarBot (conversational AI), StarLearn (adaptive learning) and StarSense (AI and IoT platform). About us

OdooStar by Star Bit Solutions

Know the Margin on Every Job, Not Just at Handover.

Tell us how you estimate, buy and bill today. Our Odoo engineers will map it to projects, budgets and progress claims in Odoo 19 Enterprise.

Not Sure Which Solution Fits?

Tell us about your business and we will recommend the right starting point, free of charge.