Profitable overall, but where?
The annual accounts show the business made money. But ask which customers are profitable, or whether the fixed-price jobs make more than the hourly ones, and the room goes quiet. There is a hunch that one big customer is costly to serve, and a feeling that small jobs are a waste of time. Nobody can prove either.
Pricing decisions get made on those hunches. So do decisions about which work to chase.
Why margin by job is invisible
The information exists. It is just scattered and unlinked.
| Piece of the picture | Where it usually lives |
|---|---|
| Invoiced revenue | Xero, QuickBooks or Sage |
| Staff hours | Timesheets, a job management tool or a spreadsheet |
| Materials and subcontractors | Purchase invoices, often coded to a nominal not a job |
| Travel and expenses | Expense app or credit card statements |
| Overheads | The accounts, never allocated to anything |
The link that is missing is a job or customer reference recorded consistently in every system. Purchase invoices get coded to materials but not to the job that used them. Timesheets record hours against a client name that is spelled differently from the invoice.
What not knowing costs
Unprofitable work continues because it looks busy. Quotes for similar jobs are based on what was charged last time rather than what it cost. The customers that take the most effort get the same pricing as the ones that take the least. And when margins shrink, nobody can see where.
It also weakens you in negotiations. When a large customer asks for a discount, you cannot say with any confidence what their work actually costs you, so the discount gets agreed on feel.
Staff decisions suffer in the same way. Whether to hire another engineer, or turn down a category of small jobs, depends on knowing where the hours go and what they earn.
How we build profit-per-job reporting
- We map where each type of cost and revenue lives and whether it carries a job or customer reference today.
- We agree a single job and customer code with you, and add it where it is missing: a tracking category in Xero, a field in the job system, a required reference on purchase orders.
- We pull data from each system through its API into one database, and match historical records to jobs using the references that exist plus rules for the rest, with uncertain matches reviewed by a person.
- With your finance lead, we agree how overheads are allocated, such as by labour hours, and write the rule down. It is your decision; we make it consistent.
- We build the report: margin per job, per customer, per service line and per job type, with drill-down to the individual costs.
- Going forward, jobs that close without costs attached, or costs with no job, are flagged for someone to fix.
Historical data is rarely perfect. We show you how much of it could be matched with confidence, and the report says so, rather than presenting guesses as fact.
What you can see afterwards
Each finished job shows its revenue, its direct costs and its margin. Customer pages show profitability over time. Quoting uses the real cost of similar past jobs. Management conversations about which work to pursue use evidence rather than instinct.
Often the most useful result is a surprise or two in both directions. Some work that felt like a nuisance turns out to pay well, and some prestige work turns out not to.
Because the report updates as jobs close, it also works as an early warning. A job type whose margin starts slipping shows up while there is still time to change the price or the method, rather than at the year-end accounts.
Is this where you are?
- You know overall profit but not profit per job or customer
- Timesheets, purchases and invoices use different job or client names
- Quotes are based on past prices rather than past costs
- There is a hunch that some customers cost too much to serve