Job costing across 30+ active projects was done manually in Excel. Invoicing lagged 2–3 weeks behind project completion.
Invoices generated same-day from delivery confirmations. Job costing is real-time. QuickBooks and four spreadsheets retired.
Apex Mechanical Ltd. is a Calgary-based mechanical contracting company with 45 employees running 30–40 active projects at any given time. When we first spoke with their operations manager, the business was running on QuickBooks Desktop for accounting and four separate Excel spreadsheets — one for job costing, one for materials tracking, one for purchase orders, and one that nobody could fully explain but everyone was afraid to delete.
The problem
The root issue was the same one we hear from every contracting business: QuickBooks tracks the money, but nothing tracks the work.
For Apex, that meant:
- Invoicing was 2–3 weeks late. Project managers had to manually compile hours, materials, and subcontractor costs from different places before an invoice could go out. In a cash-flow-sensitive business, that lag was directly costing them.
- Job profitability was a guess. The only time they knew whether a job made money was after it closed, when an accountant reconciled everything manually. Mid-project, nobody had a reliable number.
- Purchase orders existed in a spreadsheet. When materials were ordered, received, and billed, three separate people were updating three separate documents. Discrepancies showed up regularly.
They had looked at Sage 300 and had been quoted a six-figure implementation. They had also looked at a construction-specific software that handled projects but did not integrate with their accounting. Neither felt right.
The solution
We ran a two-week discovery engagement before recommending a configuration approach. The key decisions:
Modules selected: Accounting, Purchase, Inventory, Project, Timesheets, Invoicing.
What we built Odoo around:
- Each project becomes an Odoo project with a dedicated analytic account. All costs — labour via timesheets, materials via purchase orders, subcontractor bills — post to that account automatically.
- Purchase orders are created in Odoo and linked to the project. When goods are received, the receipt confirms in Odoo, and the vendor bill is generated from the PO with one click.
- When a project milestone is complete, the project manager clicks to generate the client invoice directly from the logged costs. No spreadsheet. No manual compilation.
What we did not build: a custom module. Every requirement survived the configuration-first challenge. The one workflow that looked like it might need custom code — a specific multi-tier markup calculation for subcontractor costs — was handled with Odoo's native pricelist feature.
The implementation
Week 1–2: Discovery and data audit. QuickBooks data was clean enough for a direct migration. The job costing spreadsheets were not — we scoped those as historical archive rather than migration targets.
Week 3–5: Configuration and build. The project team tested working software every week. Two workflow decisions were revisited mid-build (subcontractor billing flow, timesheet approval routing) — both caught early because of weekly demos rather than a big-reveal at the end.
Week 6–7: Data migration and training. The operations manager — the named SPoC for the project — ran parallel testing with real project data for two weeks. She trained the project managers herself, in her own language.
Week 8: Go-live. Month-end cutover. QuickBooks stayed live in read-only mode for 60 days.
The result
Eight weeks after kickoff, Apex went live on Odoo with Accounting, Purchase, Inventory, Project, Timesheets, and Invoicing.
The invoicing lag dropped from 2–3 weeks to same-day. When a project milestone is confirmed delivered, the invoice goes out that afternoon.
Job costing is now live. The operations manager can see — in real time — what percentage of a project's budget has been consumed and whether the job is on track. This changed how they have conversations with project managers about scope creep.
The four spreadsheets are retired. The one nobody could explain is gone. Nobody has asked for it back.
Interested in what this looks like for a contracting or project-based business? Book a free discovery call — we will tell you whether Odoo fits before any commitment.