Work sample 10 / 14Management reporting
Job profitability reporting, from the job system and Xero
How I'd approach job profitability for a multi-branch service group, so management sees margin by job, branch and service line, and every cost that belongs to no job is on a list with an owner.
Worked example on representative data.
- Area
- Management reporting
- Tools
- ServiceM8 or Jobber · Xero · Reporting workbook
- Typical scope
- US$2,500–4,000
- Timeline
- About 4 weeks · 4 fixed milestones
01Context
A multi-branch service group with an owner, branch managers and an operations director. Jobs are run in ServiceM8 or Jobber, and supplier bills are entered in Xero.
The systems in play
In the example the group has three branches and three service lines. Management wants to see margin for each job, branch and service line, and to see it before the quarter ends.
| System | What it does for the business |
|---|---|
| ServiceM8 or Jobber | Jobs, invoices, time on site and materials used. The source for revenue and labor. |
| Xero | Supplier bills for materials and subcontractors, with the branch as a tracking category. |
| Reporting workbook | A spreadsheet that joins the two on the job number. It is refreshed weekly from exports and reports. |
| Operations director | Reads the report each week and decides which jobs and service lines need attention. |
02Problem
What the owner sees
- A busy month that did not make money
- Branches that are compared on revenue, not margin
- Supplier costs that arrive after the job is invoiced
- No agreed definition of what a job cost
Revenue sits in the job system and costs sit in Xero. Without a shared job number, nobody can join them, so margin is found out after the fact.
| Everyday situation | What goes wrong |
|---|---|
| Bill without a job reference | The cost lands in the ledger but belongs to no job, so the job looks more profitable than it was |
| Bill split across jobs | One supplier bill covers several jobs and is charged to one |
| Supplier credit | A credit note reduces a cost, but not on the job it came from |
| Labor | Time is recorded on the job, but with no agreed cost rate it is left out of margin |
| Callbacks | Warranty work is charged to a new job and hides the cost of the original |
| Branch view | Branch is a tracking category on some bills and missing on others |
03Approach
Four steps, in this order. Each one ends with a result that is checked.
- LookA read-only review of how jobs are numbered, how bills are coded and what is currently reported. Nothing is changed.
- Agree the definitionsWhat counts as revenue, which costs belong to a job, and how labor is costed are written down.
- ConnectThe job number is carried on every bill, and a weekly report joins jobs to costs.
- CheckCosts in Xero are compared to costs assigned to jobs, and the gap is a list with owners.
| Item | Example setting |
|---|---|
| Revenue | Invoiced amount for the job before tax |
| Materials and subcontractors | Supplier bill lines that carry the job number, before tax |
| Labor | Time recorded on the job, costed at one agreed cost rate per hour. It is a management rate, not a pay figure. |
| Margin | Revenue less materials, subcontractors and labor |
| Branch and service line | Taken from the job, and from the tracking category on the bill for costs |
| Callbacks | Costed to the original job, and flagged |
| Cut-off | Costs recorded up to the report date; late bills are listed |
04What the setup includes
What the setup includes, and why each piece is there. The detail of how it is configured is agreed in the scoping call.
Show the setup, layer by layer
| Layer | What is set up and why |
|---|---|
| Job numbers on bills | The job number goes into the reference of every supplier bill line, so a cost can be joined to its job. |
| Tracking | Branch as a tracking category in Xero. Xero allows two active categories, so service line stays on the job. |
| Cost accounts | Materials and subcontractor accounts used consistently, so the report can find job costs. |
| Labor rate | One cost rate per role, agreed with management and kept in the workbook. |
| Weekly export | Jobs and time from the job system, and bills from Xero, saved in the same layout each week. |
| Management report | Margin by job, branch and service line, with the cost list behind each figure. |
| Exceptions list | Bills with no job, bills that need splitting, credits, and jobs with revenue but no costs yet. |
How the data moves
- Job invoiced
- Supplier bill coded with job number
- Time recorded on the job
- Weekly export
- Joined on job number
- Margin report
- Exceptions list
05Edge cases
These are agreed with the operations director and the bookkeeper and tested on a past quarter.
| Situation | How it is handled |
|---|---|
| Bill with no job number | Listed with its supplier and amount. It is assigned by the branch manager and the change is logged. |
| Bill split across jobs | Split in a written note with the amounts, and entered as separate lines with each job number |
| Supplier credit | Joined to the job it came from, using the same reference |
| Job invoiced in stages | Revenue is the sum of its invoices. The report shows invoiced to date and margin to date. |
| Job with revenue but no costs yet | Shown as incomplete, not as a good margin |
| Cost recorded after the job was invoiced | Added to the job in the next weekly report and flagged as a late cost |
| Callback | Costed to the original job and flagged, so the true cost of the job is visible |
| Change to the labor rate | Applies from an agreed date. Past reports keep the rate they used. |
| Company with its own Xero organization | Reported on its own, then combined in the workbook with a company column |
| Who changed what | Reassigning a cost needs a branch manager and is recorded with a user and a date |
06Worked example
The tables below use five jobs on representative data, at an example labor cost of US$45 an hour. They show the shape of the report, not a client result.
| Job | Branch | Service line | Invoiced | Materials | Subcontract | Labor | Margin | Margin % |
|---|---|---|---|---|---|---|---|---|
| J-4501 | North | Maintenance | 8,400 | 2,100 | 1,500 | 2,790 | 2,010 | 23.9% |
| J-4502 | South | Install | 14,200 | 5,300 | 3,000 | 3,600 | 2,300 | 16.2% |
| J-4503 | North | Install | 6,500 | 2,000 | 0 | 1,800 | 2,700 | 41.5% |
| J-4504 | East | Maintenance | 3,200 | 400 | 0 | 1,350 | 1,450 | 45.3% |
| J-4505 | South | Repair | 2,800 | 1,450 | 0 | 1,080 | 270 | 9.6% |
| Total | 35,100 | 11,250 | 4,500 | 10,620 | 8,730 | 24.9% |
| Branch | Invoiced | Cost | Margin | Margin % |
|---|---|---|---|---|
| North | 14,900 | 10,190 | 4,710 | 31.6% |
| South | 17,000 | 14,430 | 2,570 | 15.1% |
| East | 3,200 | 1,750 | 1,450 | 45.3% |
| Total | 35,100 | 26,370 | 8,730 | 24.9% |
| Check | Amount |
|---|---|
| Supplier bills in Xero, cost accounts, for the period | 16,390.00 |
| Assigned to jobs in the report | 15,750.00 |
| Bill SH-7712, no job number | 400.00 |
| Bill 0211, could belong to two jobs | 240.00 |
| Difference after the listed bills | 0.00 |
07How the result is checked
The report is only useful if the costs behind it are complete. The check compares the ledger to the job report every week.
| Check | How | Pass condition |
|---|---|---|
| Cost completeness | Supplier bills in Xero compared to costs assigned to jobs | Difference equals the exceptions list, line by line |
| Revenue | Job invoices compared to invoices in Xero for the period | Equal, or a named reason for each difference |
| Margin arithmetic | Branch and service line totals compared to the sum of the jobs | Equal |
| Labor | Hours in the report compared to hours in the job system | Equal |
| Exceptions list | Bills with no job, splits, credits and incomplete jobs | Each has an owner and is cleared before the quarter closes |
| Change log | Reassigned costs and rate changes | Each carries a user, a date and a reason |
08Scope and milestones
A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.
| Area | Included |
|---|---|
| Health Check | Review of job numbering, bill coding and current reports, a 45-minute call, written findings and a fixed quote |
| Definitions | Revenue, costs, labor and margin in writing, agreed with management |
| Xero set-up | Job number on supplier bills, branch tracking and consistent cost accounts |
| Reporting workbook | Margin by job, branch and service line, refreshed weekly from exports |
| Exceptions list | Unassigned bills, splits, credits and incomplete jobs, with owners |
| Past quarter | One past quarter run through the report and checked against Xero |
| Handover | Written SOPs, a recorded walkthrough and files you own, plus 14 days of fixes after go-live |
| Not included | Tax filing or payroll. |
| Also outside the scope | Live, automatic connections between the systems, which are quoted separately. Changes to how jobs are priced. Software subscriptions (billed to you by the vendors). |
| Milestone | Deliverable | Timing | Share |
|---|---|---|---|
| M1 Health Check and definitions | Findings, a fixed quote and the definitions in writing | Week 1 | 20% |
| M2 Xero and job numbers | Job numbers on bills, tracking and cost accounts in use | Week 2 | 25% |
| M3 Report on a past quarter | Margin by job and branch, checked against Xero | Week 3 | 40% |
| M4 Handover | Weekly routine, exceptions list, SOPs, walkthrough, 14 days of fixes | Week 4 | 15% |
Typical scope for this kind of project: US$2,500–4,000
About 4 weeks across 4 fixed milestones. The Systems Health Check (US$300, fixed) comes first and confirms the scope.
Describe what is going wrong between your job system and your books, and I'll say where I'd look first.
Send a short note through the form on the home page. I will reply with where I would start, and whether the US$300 Systems Health Check is the right first step.