Construction ERP case study

Odoo Construction ERP Case Study: From Estimate to Job Cost

A multi-company general contractor connected estimating, project delivery, purchasing, field time, job costing, billing and finance in one Odoo Enterprise system, with each legal entity's books kept separate.

Construction, wholesale and cabinetryOdoo Enterprise 17 to 1914 legal entities, one databaseField timesheet integration
~20 yrs

in operation (approximate)

130-170

employees across the group (approximate range, 2026)

14

legal entities in one Odoo database (current)

~4,000+

projects run through the platform to date (approximate)

Direct summary

Case study summary

This case study shows how a multi-company contractor group used Odoo Enterprise to connect estimating, project delivery, purchasing, inventory, field time, payroll inputs, job costing, billing and finance. The implementation replaced disconnected handoffs with one governed operational flow while preserving legal-entity boundaries.

The case is most relevant to general contractors, restoration companies and field-service groups that need project costs to remain visible while work is still underway, not only after the project closes.

About the evidence. The client is anonymized. Operational figures are shown only where approved and are labelled as current, historical, rounded or approximate. Results reflect this organization's process and do not guarantee the same outcome for another company.

This was not an out-of-the-box Odoo installation. It combined standard Odoo functions, configuration, customization built mostly with Odoo Studio on Odoo Online, and an external integration for field time. The section on standard Odoo, configuration, integrations and customization separates the layers.

At a glance

Business
A group of 14 legal entities (current) in three lines of business: general contracting and construction, building-material wholesale and cabinetry
Platform
Odoo Enterprise on Odoo Online, migrated from Odoo 17 to Odoo 19. All entities share one database
Connected workflows
Estimating, projects, purchasing, inventory, field time, payroll inputs, job costing, billing and finance
Operating model
Shared employees, vendors and materials, with separate books for each legal entity
Layers
Standard Odoo, configuration, mostly Odoo Studio for customization, and an external integration for field time
Evidence
Client anonymized. Figures are rounded or approximate and labelled where they appear
The client

The contractor and operating environment

The client is a group of related businesses in three lines: general contracting and construction, covering residential, commercial and restoration work, building-material wholesale, and cabinetry. Today the group runs 14 legal entities, each a company with its own books, bank accounts, vendors and crews. They share back-office staff and management, and often work on the same job sites.

As the group grew across several business lines, spreadsheets, disconnected tools and manual sign-offs began to slow it down. Estimating lived in one place and purchasing in another, and a project's real cost was not visible until weeks after the work was done.

The group chose Odoo Enterprise as one operating system for every entity, all in one database, and treated the rollout as an operations redesign, not a software install. For a buyer's view of the same decision, see Odoo for construction companies.

Line of businessGeneral contracting and construction
Line of businessBuilding materials
Line of businessCabinetry
One Odoo database 14 legal entities, separate ledgers
The starting problem

Why the previous systems stopped scaling

Each entity ran its own version of the process, and nothing carried a job from the sale to the ledger. The group had tried Monday.com for project management, but it fragmented the data further and could not handle the complex job costing and the high level of customization the business needed.

  1. Estimating and sales data did not connect to job costing or accounting.
  2. Purchase requests were approved by email or verbally, with no audit trail.
  3. Inventory and material use were tracked on paper or in separate spreadsheets for each site.
  4. Field labour hours were captured outside the ERP, then re-keyed into payroll by hand.
  5. Management reporting across entities was assembled manually to see the whole group.
End-to-end workflow

The target construction workflow

The workflow follows one operating thread from an accepted estimate to a customer invoice. At each stage one record is authoritative, and the next record is created from it instead of being typed again. Where information crosses a system boundary, as with field hours, this page names the integration and states whether it is event-triggered or scheduled, and does not call it real time.

  1. 01
    Estimate
  2. 02
    Budget and codes
  3. 03
    Purchase request
  4. 04
    PO and bill
  5. 05
    Field hours
  6. 06
    Job costing
  7. 07
    Billing
  1. 01

    Estimate and project setup

    An estimate is the priced scope for a job, covering labour, materials, subcontractors and equipment. Opportunities and site assessments feed structured estimates in Odoo CRM and Sales. When an estimate is accepted, it creates or informs the project in Odoo Project and the initial budget. The estimate stays the authoritative record of what was sold. The project becomes the authoritative record of what will be delivered.

  2. 02

    Project budget and cost codes

    A project budget is the approved planned cost for a job, and a cost code is the category that attributes each cost to a type of work. Each project keeps its company, customer, budget and cost-code context, so every later purchase, expense and labour entry can be attributed to the right job and legal entity. In this implementation, cost codes are built on analytic accounts used together with the project.

  3. 03

    Purchase requests and approvals

    A purchase request is an internal need for material or a subcontractor, reviewed before it becomes a purchase order. Requests route through approval limits set by amount and role, so a small material request and a large subcontract follow different paths. Verbal and email approvals were replaced by this recorded route. In this implementation, standard Odoo approvals did not satisfy the required vendor-bill controls, so NGYN built the approval rules with Odoo Studio. Purchases or bills outside expected quantity or price ranges are flagged for review before they become disputes.

  4. 04

    Purchase orders, receipts and vendor bills

    A purchase order is the committed order to a vendor or subcontractor. A receipt records what was delivered, and a vendor bill is the vendor's invoice. Each keeps the project and company attribution of the order. Vendor bills are matched against the purchase order and the received quantities before payment is released. The order is authoritative for what was ordered, the receipt for what arrived and the bill for what is owed.

  5. 05

    Field hours and payroll inputs

    A field hour is time worked by a crew member on a job, and a payroll input is the approved hour total passed into the payroll process. Field staff clock in through Connecteam, the group's workforce app, using mobile clocks and kiosk check-ins, not inside Odoo. An integration built on n8n carries employee records, project changes, form submissions and timesheets between Connecteam and Odoo, so hours post against the right project and cost code without re-keying. Approved hours feed payroll inputs, and payroll itself is processed in Wagepoint, outside Odoo. Connecteam is authoritative for clock events, and Odoo is authoritative for the project cost of those hours. The integration mixes two timings. Project and employee profile changes are event-triggered and passed on as they are made. Form submissions are scheduled about every 30 minutes, and timesheets are scheduled once a week. It is not real-time posting of hours. See the Odoo and n8n integration guide for the controls behind an integration like this.

  6. 06

    Job costing and budget visibility

    Job costing compares committed cost, meaning purchase orders, and actual cost, meaning bills, expenses and labour, with the approved budget. Because each cost carries its project and cost code, project managers can review cost against budget while work is underway and not only after the project closes. Purchase and expense costs appear as they are approved, and labour cost updates as timesheets arrive, which is weekly. Expense approvals are tied to project budgets, so spend on a job is visible to the project manager as it is approved.

  7. 07

    Customer billing and financial reporting

    A customer invoice is the bill to the customer for work done or milestones reached. Finance receives governed records for billing, accounting and reporting, and each of the 14 legal entities keeps its own ledger. Leadership can review revenue, cost and margin across the group and drill into a single company or division.

How the records connect

RecordWhat it isAuthoritative source
EstimateThe priced scope for a job: labour, materials, subcontractors and equipmentOdoo CRM and Sales
ProjectThe job being delivered, with its customer, company and scheduleOdoo Project
Project budgetThe approved planned cost for the jobOdoo, on the project
Cost codeThe category that attributes each cost to a type of work on a projectOdoo analytic accounts, used with the project
Purchase requestAn internal need for material or a subcontractor, before it is approvedOdoo, with an approval rule built in Odoo Studio
Purchase orderThe committed order to a vendor or subcontractorOdoo Purchase
ReceiptThe record of what was actually deliveredOdoo Inventory
Vendor billThe vendor's invoice, matched to the order and receipt before paymentOdoo Accounting
Field hourTime worked by a crew member on a jobConnecteam for clock events. Odoo for the project cost of those hours
Payroll inputThe approved hours passed into the payroll processThe approved workforce process. Payroll is processed in Wagepoint
Customer invoiceThe bill to the customer for work done or milestones reachedOdoo Accounting
Legal entityA company with its own books, bank accounts and tax obligationsOdoo company, with its own ledger

Where a record crosses a system boundary, this page names the integration and its timing: event-triggered or scheduled.

Modules

Odoo modules used in the implementation

These are the Odoo areas that carried the workflow above. Each links to the official Odoo 19 documentation for that area.

Odoo areaRole in this implementationOfficial Odoo 19 documentation
CRM and SalesOpportunities, site assessments, structured estimates, quotations and customer ordersCRM and Sales
ProjectProjects created from accepted estimates, with budgets and cost codes attachedProject
PurchasePurchase requests, approvals and purchase orders to vendors and subcontractorsPurchase
InventoryStock movements, requisitions, receipts and deliveries to sitesInventory
TimesheetsField hours from Connecteam posted against the right project and cost code, through the integration, weeklyTimesheets
ExpensesExpense entries routed through approval and tied to project budgetsExpenses
AccountingVendor bills and matching, a separate ledger for each legal entity, inter-company entries and group reportingAccounting and analytic accounting
EmployeesEmployee records shared across companies and kept in step with Connecteam. Used lightlyEmployees
Documents and ApprovalsBoth are used lightly. Approval of purchases and vendor bills runs on rules NGYN built with Odoo Studio, because standard Odoo approvals did not satisfy the required vendor-bill controls in this implementationStudio

This table lists the areas used in this implementation. A similar project may use others.

What was standard and what was not

Standard Odoo, configuration, integrations and customization

The result is one connected system, but it was built in layers. Separating them matters, because each layer has a different cost, a different owner and a different effect on future Odoo upgrades.

LayerWhat it covered hereHow it is described
Standard Odoo functionMulti-company, CRM and estimates, projects, purchase orders, receipts, vendor bills and matching, expenses, accounting and reportingStandard capabilities of Odoo Enterprise
Odoo configurationAccess rules by entity and project, the analytic-account cost-code and budget structure, and shared master data across 14 legal entitiesConfigured in Odoo
Odoo Studio or low-code adjustmentMost of the customization: approval rules for purchases and bills, and automated actions and business rules that route documents, notify approvers, flag exceptions and update statuses. NGYN's records put these in the hundreds, an approximate figureBuilt with Odoo Studio. Standard Odoo approvals did not satisfy the required vendor-bill controls here
Custom Odoo developmentLimited. The database runs on Odoo Online, which hosts databases without custom modules, so changes are made with Studio. Custom reports and other changes were carried from Odoo 17 to Odoo 19 and reviewed one by oneMostly Studio for now
External integrationAn integration built on n8n between Connecteam and Odoo, covering employees, projects, form submissions and timesheets. Payroll runs separately in WagepointEvent-triggered for project and employee changes. Scheduled for form submissions (about every 30 minutes) and timesheets (weekly)
Operational process changeVerbal and email approvals replaced by recorded routes. Estimates handed to projects without re-keying. Cost codes and approval limits defined before configurationDecided with the client before configuration

Stable through a two-version migration. Customizations, automations and security rules were carried from Odoo 17 to Odoo 19 Enterprise, and every custom report, automated action and access rule was reviewed so the system stayed reliable.

A true multi-company foundation

How multi-company controls were handled

Odoo runs as one multi-company database for all 14 legal entities, not as separate instances. Each legal entity keeps its own books, chart of accounts and approval chains, while vendors, employees, catalogues and reporting roll up at group level. Odoo's own multi-company documentation describes the underlying behaviour.

01

Shared master data, separate ledgers

Multi-company

Vendors, employees and materials are maintained once and used across companies, while financial transactions stay segregated by entity.

02

Inter-company transactions

Accounting

When one division's crew or equipment supports another division's project, cost allocation and internal billing happen in the system instead of through manual journal entries.

03

Role-based access and approvals

Security

People see and approve only what is relevant to their entity, division or project. Approval limits differ by amount and role.

04

Group reporting

Reporting

Leadership can review revenue, cost and margin across the group and drill into any single company or division. Before, this was a month-end exercise across exports and spreadsheets.

Method

Implementation phases

This is NGYN's method for an implementation of this kind, in eleven phases grouped into six stages. The duration and fees for this client are not published. Standard Odoo is run first, and customization is decided after the pilot.

Phases 1 and 2

Discovery and gap analysis

Purpose. Understand how work really flows and where standard Odoo fits, then design the processes and controls. Deliverable. A fit-gap register, a target process design and an approval matrix. Client responsibility. Name a process owner for each area and make decision-makers available.

Phases 3 and 4

Master-data cleanup and migration

Purpose. Load clean customers, vendors, items, employees, cost codes and opening balances. Deliverable. A data map, cleaned source files and reconciled test loads. Client responsibility. Own the data, remove duplicates and confirm what history to keep.

Phases 5 and 6

Configuration and integration

Purpose. Configure standard Odoo for each entity and connect the systems being kept, here the Connecteam workforce app. Deliverable. A configured foundation and a working integration with defined error handling. Client responsibility. Review each configuration against real jobs and supply access to the connected systems.

Phase 8

Pilot and user acceptance testing

Purpose. Run real scenarios end to end, from estimate to job cost, and let the business confirm which gaps are real once standard Odoo is in use. Deliverable. Test results, corrected issues and an updated gap register. Client responsibility. Provide testers from each role and sign off critical accounting, payroll and project-cost workflows.

Phase 7, decided after the pilot

Small, justified customizations

Purpose. Close the gaps that remain after the pilot and cannot be handled by configuration or a process change. Deliverable. Approved customizations, each with acceptance criteria and a named owner. Client responsibility. Approve scope and accept long-term ownership of each change.

Phases 9 to 11

Training, cutover and go-live support

Purpose. Prepare people, move to production and stabilize. Deliverable. Role-based training, a cutover plan with a rollback decision point and post-go-live support. Client responsibility. Release staff for training, freeze the old process on schedule and report issues through the agreed channel. Support then continues as improvement work, priced on the fee table.

The result

Results and evidence

Finance, project management, purchasing, inventory and field operations for the whole group now run on one connected system instead of spreadsheets and side tools. Project managers can see cost against budget while a job is underway, and approvals follow a recorded process instead of an email chain.

Every figure on this page

FigureValueStatus
Years in operation (the group)About 20Approximate, current
Employees across the group130 to 170Approximate range, current (2026)
Legal entities in one Odoo database14Current
Projects run through the platformAbout 4,000 or moreApproximate, cumulative to date
Sales quotations and orders per weekAbout 150 to 190Current (2026), rounded within about 10 percent
Purchase orders and RFQs per weekAbout 170 to 200Current (2026), rounded within about 10 percent
Expense entries per weekAbout 60 to 90Current (2026), rounded within about 10 percent
Projects, service calls and sites active at onceAbout 110 to 135Current (2026), rounded within about 10 percent
Field labour hours logged per monthAbout 9,000 to 11,000Peak season, rounded within about 10 percent
Field hours after the integration went liveRoughly 20 to 30 times the first months, within about a year and a halfHistorical, approximate
Purchase orders per month after adoptionFrom well under 50 to several hundredHistorical, approximate

Source: NGYN's records of the live platform, approved for publication and shown rounded and varied by about 10 percent to protect exact business detail. The client is anonymized.

Before and after, with the limits stated

MetricBefore Odoo (estimate, about 2023)After Odoo (2026, current)
Employees, group-wideAbout 40About 130 to 170
Sales quotations and orders per weekAbout 15 to 25About 150 to 190
Purchase orders and RFQs per weekAbout 10 to 20About 170 to 200
Expense entries per weekAbout 10 to 15About 60 to 90
Projects active at onceAbout 25 to 35About 110 to 135

The "before" column is a directional estimate. The "after" column comes from live platform activity, rounded. Much of the increase is the business itself growing. These figures show how much activity now runs on the platform. They do not show that Odoo caused the growth, and they make no claim about staffing.

Takeaways

What other contractors can learn from this implementation

Define the controls before configuring. Cost codes, approval limits and the boundary between legal entities were decided with the client first. The software then implemented decisions instead of replacing them.

Connect the field, do not move it. Crews kept Connecteam. The integration carried hours to the project instead of asking field staff to learn the ERP.

Run standard Odoo first. Customization was limited to gaps that remained after real use and built mostly with Studio on Odoo Online, which keeps the system easier to test, support and upgrade. The migration from Odoo 17 to Odoo 19 depended on that discipline.

Choose a tool that can hold complex cost. The group tried Monday.com first and found it fragmented the data and could not handle complex costing or high customization needs. A project board is not a cost system.

Budget for data and process work, not only software. See Odoo implementation cost for general contractors and Odoo ERP pricing and implementation cost in Canada and the US for how those lines are built.

Decide what to automate deliberately. The Odoo automation and practical AI hub explains how to choose between a rule, an integration and AI. If you are weighing whether to do this alone, read when you need an Odoo consultant.

Fit

When Odoo fits a construction company and when it may not

Odoo may fit when you need

  • Connected project, purchasing and financial records
  • Multi-company controls
  • Project and cost-code attribution
  • Inventory or material visibility
  • Field-time integration
  • Flexible approval workflows
  • A phased implementation approach

Odoo may not fit when

  • Specialized construction functionality is required that cannot be justified through configuration or maintainable extensions
  • The organization will not assign process owners or data-cleanup resources
  • Leadership expects software to resolve undefined operational policies
  • Required third-party systems lack a viable integration path
  • The company is unwilling to test critical accounting, payroll or project-cost workflows before cutover
Questions

Frequently asked questions

Is this standard Odoo?

Partly. It uses standard Odoo Enterprise functions and configuration, customization built mostly with Odoo Studio on Odoo Online, and an external integration for field time. The layers are separated in the section on standard Odoo, configuration, integrations and customization.

Can Odoo keep separate legal entities and still report for the group?

Yes, in a multi-company database. Here, 14 legal entities share one database. Each company keeps its own ledger and approvals while shared records and group reporting sit above them. Your own accounting rules should be tested before cutover.

How do purchase orders and bills reach the right project?

Each purchase carries its project, cost code and company from the request onward. Receipts and vendor bills keep that attribution, and bills are matched to the order and received quantities before payment is released.

How do field hours get into Odoo?

Crews clock in through Connecteam. An integration built on n8n carries employees, projects, forms and timesheets into Odoo, where hours post to the right project and cost code. Timing depends on the data: project and employee profile changes are event-triggered, form submissions are scheduled about every 30 minutes and timesheets are scheduled once a week. Payroll is processed in Wagepoint, outside Odoo.

Why not use a project management tool such as Monday.com?

The group tried Monday.com first. It fragmented the data and could not handle the complex job costing and the high level of customization the business needed, which is why costs now live in Odoo against projects and analytic accounts.

Do you need custom code for approvals?

No custom modules were needed. In this implementation, standard Odoo approvals did not satisfy the required vendor-bill controls, so NGYN built the approval rules with Odoo Studio. The database runs on Odoo Online.

Does this replace estimating software?

In this implementation, estimates are built in Odoo from opportunities and site assessments and become the starting point for the project and its budget. Whether that is enough for your estimating depth is a fit question to answer in discovery.

How long does an implementation like this take, and what does it cost?

NGYN does not publish the duration or fees for this client. For how the cost lines are built, see the general contractor cost guide and the Odoo pricing guide. Support rates are on the fee table.

Will we get the same results?

Not necessarily. Results reflect this organization's process, data and decisions. They do not guarantee the same outcome for another company.

Before the call

Discuss your construction ERP requirements

A useful first conversation starts from your situation. If you can, bring:

  1. Number of legal entities
  2. Divisions and operating companies
  3. Typical project types
  4. Current estimating system
  5. Project and cost-code structure
  6. Purchasing approval process
  7. Inventory or material requirements
  8. Field-time or workforce system
  9. Payroll process
  10. Accounting system
  11. Required integrations
  12. Data sources and historical-data requirements
  13. Reporting requirements
  14. Desired rollout sequence
Sources

Sources and evidence notes

Estimate to job cost

Discuss your estimate-to-job-cost workflow with an Odoo solution architect.

Book a free ERP fit call Case study prepared as a reference for Odoo implementation engagements.