Odoo construction job costing in Australia means tying every dollar of labour, materials, plant and subcontractor cost to the specific job it belongs to — so a Perth builder, a WA civil contractor or a Brisbane fit-out outfit can see live margin per job, raise progress claims that match the contract, and meet ATO obligations like BAS, TPAR and STP Phase 2 from the same system. Odoo does this through projects, analytic accounts and purchase commitments, not a separate construction module. Configure those three primitives well and you’ve got industrial-grade job costing without paying SAP Business One money.

We’re a Perth-based Odoo implementation consultancy. We worked with a Western Sydney commercial fit-out company who’d been running A$14 million of revenue through Reckon plus a forest of spreadsheets — one workbook per job, manually reconciled to the GL on the fifth of each month. Margin on closed jobs was always a surprise, and never a happy one. Twelve weeks after go-live on Odoo, the directors could see committed cost on every active job before signing the next subcontractor PO. Two of their three loss-making jobs would’ve been caught early if the system had existed six months earlier. That’s the prize.

What job costing actually means in Odoo

Job costing is the discipline of tracking the true cost of work-in-progress against a contract value, in real time, before the final invoice. In Odoo, the job is a project, the cost categories are analytic accounts, and every cost-bearing document — purchase orders, vendor bills, employee timesheets, expense claims, manufacturing orders, stock moves — carries an analytic distribution that points back to the job. Revenue recognition, customer invoices and progress claims also post through analytics, so the same report shows revenue, cost and margin on one line.

The mental model that catches Reckon and JIM2 refugees out: in Odoo, the GL is for statutory accounting and analytics are for management reporting. You don’t need a separate job-costing ledger. You attach analytic tags to ordinary documents, and the cost rolls up to the job automatically. That sounds abstract until you’ve watched a project manager open a project, see A$182,000 of committed PO cost the procurement team raised that morning, and adjust the next claim accordingly.

Setting up jobs and projects in Odoo for construction work

The structure that’s worked for the Australian builders we’ve implemented for is three-layered: a client (the customer record), a contract (the sale order containing the schedule of values) and a project (the operational job). The sale order quantities map to milestones; the project tasks map to the work breakdown structure; and the analytic account on the project becomes the bucket every cost flows through.

Project structure that mirrors the WBS

Set up the project tasks to mirror the WBS the estimator priced. If your estimate was structured by trade — site prep, formwork, slab, walls, roof, services, finishes — your tasks should look the same. That makes back-costing the next estimate cheap, because the actuals are already grouped the way the next bid will be. Don’t over-engineer; ten to twenty tasks per job is plenty for a A$1–5 million build.

Analytic accounts for cost categories

Above the project, define a small set of analytic accounts for cost categories — labour, materials, subcontractors, plant, prelims, design — and use Odoo’s analytic distributions to split a single PO across categories where needed. Combined with the project tag, every transaction lands in a two-dimensional grid: job × category. That grid is the engine room of job costing.

Sub-jobs, stages and multi-site builds

For staged work or multi-site civil contracts, use parent and child projects. The parent rolls up cost and revenue; the children isolate stage-level margin. This is also how we handle joint ventures, where a project’s profit needs to flow proportionally to two ABNs.

Tracking labour, materials and subcontractor costs

Three cost streams dominate construction. Each lands in Odoo a different way.

Labour against modern awards

Labour cost goes through timesheets. Site staff submit hours against project tasks from the Odoo mobile app; the cost rate is read from the employee record (loaded with on-costs — superannuation, workers comp premium, leave loading, allowances under the Building and Construction General On-site Award MA000020). For mid-market builders running deep award interpretation we usually pair Odoo with Employment Hero or KeyPay for payroll itself, then journal the actual paid labour back into Odoo so the job sees the real cost, not an estimate.

Materials and PO commitments

Materials run through Purchase. The PO is raised against the project, the analytic distribution splits it across categories, and the value appears as committed cost the moment the supplier acknowledges. That is the single most valuable number in Australian construction job costing — committed cost — and it’s the number Reckon, MYOB and most spreadsheet stacks cannot show.

Subcontractor bills

Subcontractors are vendors. Their POs and bills carry the project analytic, and Odoo flags any vendor flagged as a TPAR-reportable contractor. We’ll come back to TPAR.

TPAR for construction subcontractors in Odoo

The Taxable Payments Annual Report is one of the most painful annual rituals in Australian construction. The ATO requires builders to report payments to subcontractors providing building and construction services — most of them, with limited exceptions — by 28 August each year. Get it wrong and you pay penalties or chase corrections from forty subcontractors after the fact.

Odoo’s Australian localisation includes a TPAR-flagged supplier setting and a TPAR report that lists every payment to flagged vendors for the financial year, broken down by ABN, address and total paid. We configure this on day one of the implementation, not at 24 August. The trick is supplier hygiene: every subcontractor record needs a verified ABN (Odoo’s ABR lookup helps), the correct GST status, and a flag indicating whether their work is TPAR-reportable. Done at onboarding, the report is a one-click export to the ATO file format. Done late, it’s a fortnight of cleaning data while the directors panic.

Retentions and security of payment in Odoo

Retentions are the second classic gap. Australian construction contracts typically hold back 5% of each progress claim until practical completion, then 2.5% through the defects liability period — usually twelve months under standard AS4000 terms. Treating retention as discount or a memo line is a mistake. Retention is earned revenue you cannot yet bank, and it must sit on the balance sheet as a receivable, not be missed at year-end.

We configure retention through a dedicated retention receivable account (separate from trade debtors), automated journal lines on every customer invoice that split the gross claim into the cash-due portion and the retained portion, and a reminder mechanism on the project that flags retention release dates. Same pattern in reverse for retention you withhold from your own subcontractors — that sits as a liability until release, protecting your cashflow under the WA Building and Construction Industry (Security of Payment) Act 2021 and equivalents in NSW, VIC and QLD.

Variations against the original contract

A job that finishes at 8% margin instead of the 14% you bid almost always lost the difference to variations that were done but never formally claimed. Odoo handles variations as change orders against the sale order: the original contract value stays intact (so back-costing remains honest), and each variation is its own line with its own approval workflow, its own invoice trigger, and its own contribution to the contract value reported on the job dashboard.

The discipline this enforces is operational, not technical. Site managers need to raise the variation in Odoo before instructing the work, the project manager approves it, and the customer gets a signed variation order with a price. We’ve seen builders recover an extra 3–4% margin per job within three months of go-live just from closing the loop on variations that used to live on text messages between the foreman and the PM.

Plant, fleet and prelims across multiple jobs

Hire plant, owned plant, site sheds, scaffolding, fuel and supervisor time are shared across jobs and break the simple PO-to-project model. The clean approach in Odoo is an internal cost recharge: log plant hours against a job from a daily docket (mobile-friendly), price them at an internal hourly rate that recovers depreciation plus running cost, and post a journal that debits the job and credits an internal recovery account.

Prelims — supervision, site offices, traffic management, insurance — work the same way. We configure a recovery rate per supervisor and per site asset, and a daily or weekly allocation routine spreads the cost. The result on the job dashboard is honest: the job carries its real share of the indirect cost, not just the direct PO line items. Mid-market builders running ten or more concurrent sites usually see total recovered overhead match plan within ±3% by month three.

Progress claims and invoicing

A progress claim is a customer invoice tied to a defined point in the contract. In Odoo, the schedule of values lives on the original sale order, each milestone is a line item with a percentage-complete or fixed-amount trigger, and the project manager opens a draft invoice from the project view at month-end. We pre-configure the claim format the head contractor or principal expects — typically AS4000 schedule layout with retention, GST and previous claims netted off — so the document the surveyor sees matches contract expectations.

Two Australian-specific touches: every invoice carries a Peppol-compliant XML so government clients and any business now subscribed to Peppol BIS Billing 3.0 can ingest it directly through the ATO-managed e-invoicing network, and every payment received reconciles against the project through the standard ABA bank import from ANZ, NAB, CBA or Westpac.

Budget vs actual, WIP and revenue recognition

The reason directors lie awake at three in the morning is rarely the cost — it’s not knowing the cost. Odoo’s analytic reports give a real-time job dashboard with budget, committed, actual and remaining for every category on every active job. Set the budget at handover from estimate to delivery; let actuals flow in automatically; review committed-versus-budget weekly with project managers.

For WIP and revenue recognition, the choice is percentage-of-completion (recognise revenue as cost is incurred against the budgeted total) or completed-contract (recognise on practical completion). Most Australian builders we work with use percentage-of-completion under AASB 15, and Odoo supports this through a month-end automation that calculates earned revenue, posts the WIP journal, and reverses any over- or under-claim against the customer. The output is a clean balance sheet that an auditor or banker can read in five minutes — which matters when you’re refinancing a development facility with NAB or CBA.

Australian compliance: GST, BAS, TPAR and STP

The four acronyms a construction CFO worries about all live in the same Odoo. GST is handled through Odoo’s Australian tax templates (10% sale, 10% capital acquisitions, GST-free items correctly coded). BAS prepares a quarterly G1, G2, G3, 1A, 1B output that maps to the ATO BAS form. TPAR runs from the supplier ledger as covered above. STP Phase 2 is normally handled by the payroll system — Employment Hero, KeyPay or Odoo Payroll’s Australian module — with the journal flowing back into Odoo against project analytics. One system of record, four reports, no spreadsheets between them.

If you’re considering Odoo for a construction business with five concurrent jobs or fifty, the design of those analytic accounts and project structures is the difference between a system that pays back in three months and one that frustrates everyone. We’d rather get them right than fix them in year two. To talk through how this fits your structure, start a conversation — or read our implementation method for how we sequence go-live around BAS quarters and EOFY, and our notes on implementation cost in Australia for what a project like this typically lands at.