Every project business eventually finds out what a job really made. The honest number arrives weeks after the work is done, stitched together from invoices, time sheets, and the owner's memory. By then the job has closed, the next one is priced from the same gut feel, and the margin that quietly leaked out is already gone.

Case Study, not Delivered Project.

How we'd approach this kind of problem. See delivered projects →

15–20% Of potential profit typically lost when construction and trades businesses don't track job costs accurately (industry benchmarks, Buildern).

You probably have this problem if…

  • You can quote a job confidently but cannot tell, mid-build, whether it is still on track for the margin you priced.
  • Supplier bills sit in Xero unallocated to a job, or get coded to a generic cost account because the job reference is unclear.
  • Site changes and customer upgrades are discussed in WhatsApp, photos, and notebooks, and some of them never reach the final invoice.
  • Labour hours are recorded somewhere, but nobody compares them to the hours in the quote until after handover.
  • Your month-end profit number depends on the owner spending a Sunday afternoon stitching it together.

Any two of those is a strong signal. All of them and you are pricing next year's work with last year's gut feel.


How the pattern works

Imagine a quiet bookkeeper who sits with every live job. They read each supplier bill as it lands, tie it to the right job, watch the hours booked against the quote, notice the site notes that look like an unbilled extra, and tap you on the shoulder when something is drifting. The number you usually see at month-end appears every morning instead. That is the system.

Four things have to work for it to be useful.

Xero Jobs tool Suppliers Sources One record per job Quoted vs actual Live view Drift alerts
Three sources feed one record per job, which is compared against the quote and surfaced live, with alerts when a job starts drifting.

1. It pulls costs, labour, and materials into one place

Three feeds, three different shapes. From Xero the system reads supplier bills, credit-card transactions, and subcontractor invoices through the official Accounting API, keyed by tracking category or project code where one exists. From the job-management platform (ServiceM8, Tradify, simPRO, Joblogic, Powered Now, or similar) it reads time entries, job references, and site notes. From any standalone purchasing or materials tool it reads delivered quantities and prices. Each feed is normalised to the same shape. Source, job reference, date, amount, who recorded it.

2. It assigns every line to a job, and flags the ones it cannot

Where the job reference is clear, the system attaches the cost to the job automatically. Where it is not, the line goes into a short review queue with the system's best guess attached. A language model reads the bill description, the supplier history, the dates, and the active jobs, then proposes a match with a confidence score. The office confirms or corrects in a click. Uncertain costs stay visible rather than getting silently absorbed into overhead. That is the difference between a margin number you can trust and one you cannot.

3. It compares actuals against the quote, by category

Labour Materials Subs Margin Quoted Unbilled extra Actual
Each live job rendered as quoted versus actual, by category. An unbilled extra sits on its own.

The quote already encodes a small commercial model. Quoted revenue, allowed labour hours, allowed materials, allowed subcontractor spend, contingency, target gross margin. Pulling that into the same database gives the system both halves of the picture. For each live job it produces a running view of quoted versus actual, broken out by category, with extras held in their own bucket so they do not pollute the comparison. When a job drifts, the drift has a shape. Labour is twelve hours over allowance. Materials are eight hundred pounds above the order. One approved extra is sitting unbilled.

4. It surfaces what needs attention, before the job closes

Nobody wants another accounting report sitting in their inbox. The point of the live view is to make the next decision obvious. Jobs with margin drift past a threshold. Jobs with unassigned costs older than fourteen days. Site notes that read like an extra was agreed but no variation was raised. Jobs ready for close-out with an unbilled extras queue still open. Each card opens into the full breakdown, and the owner's whole portfolio fits inside a five-minute review.


The default stack

Accounting source Xero Accounting API (bills, tracking categories, projects)
Job source ServiceM8, Tradify, simPRO, or Joblogic via their public APIs
Data integration Scheduled functions with webhook top-ups, or Airbyte for higher-volume teams
Warehouse Neon Postgres (one schema per source, one unified job table)
Cost matching Deterministic rules with Claude Sonnet for ambiguous lines
Extras detection LLM review of site notes and photos with human approval
Dashboard Embedded Metabase, or a custom React view backed by the same SQL

Two choices that matter most.

Custom ETL over a heavy data platform for typical SMB volumes. Fivetran and Airbyte both have Xero connectors. They are excellent if the rest of the data stack already uses them. For a single trades business, a small scheduled function that hits Xero and the jobs API every hour, with webhook top-ups for new invoices, costs roughly nothing to run and is faster to debug than a managed pipeline. Move to Airbyte when the number of connectors crosses about five.

Postgres and Metabase over a bespoke dashboard, at first. Putting the unified job table in Postgres and pointing Metabase at it gives the office a working view in days, not weeks. A custom React dashboard comes later, once the owner knows which views actually get used. Most do not need it. The ones that do, get a much better second iteration for the investment.


When this isn't the right fit

The pattern is powerful, but it is the wrong tool for some problems.

Job volume too low to justify the build. Below roughly twenty live jobs a month, a tidy Xero Projects setup with proper tracking categories will get you most of the way. The investment in a custom layer pays back when there are enough jobs that nobody can hold them all in their head.

Quotes that bear no resemblance to the work delivered. If half of every job is bespoke variations agreed verbally on site, the quote baseline is too noisy to be useful. Fix the variation workflow first. The margin layer assumes the quote means something.

No structured cost data at source. If supplier bills arrive as photos of receipts and labour is recorded on paper, the bottleneck is data capture, not analysis. A receipt-scanning workflow and a simple time-tracking habit come before margin dashboards.

Cash-accounting businesses with no quotes. Pure cash-in, cash-out trades who price on the day do not have a quoted baseline to compare against. The pattern relies on the gap between what was promised and what was spent.


What to expect

Implementation time 4–8 weeks for a typical first build, depending on how clean the job references are at source.
Deployment options Cloud-hosted by default on Neon or a similar managed Postgres. Single-tenant per business, no shared data.
Infrastructure cost Roughly £80–250 per month, covering database, scheduled jobs, LLM usage for matching, and Metabase hosting.
Refresh latency Hourly by default for Xero and the jobs system. Webhooks bring new bills and approved variations through in under a minute.
Margin recovered A well-deployed layer typically recovers a meaningful share of the 15–20% leakage industry studies attribute to inaccurate job costing. Recovery comes from repriced job types, renegotiated suppliers, and extras that actually get billed.
Secondary benefits Cleaner Xero coding over time, better quotes on the next round, and a finance review that takes minutes instead of a weekend.

If this pattern fits your team

A Pare Audit is the way to find out whether it does, and what a delivery would look like in your specific situation. We spend a focused few days with you, look at how jobs and costs actually flow through Xero and your job-management tool, and come back with a written recommendation, a scoped build, and a costed plan.