Work snippet 20 / 34Management reporting

Looker Studio branch KPI dashboard from Xero and the job system

How I'd approach a live branch dashboard for a six-branch service group, with written KPI definitions, nightly loads from Xero and the job system, each manager seeing only their own branch, and every figure traced to its source.

Work snippet with example figures.

Area
Management reporting
Tools
Looker Studio · Xero · ServiceM8 or Jobber
Typical scope
US$2,500–4,500
Timeline
About 6 weeks · 4 fixed milestones

01Context

A multi-branch service group with six branches, a finance lead and a general manager for each branch. Jobs are run in ServiceM8 or Jobber and the books are in Xero. Each month the management pack is rebuilt by hand from exports.

The systems in play

In the example the group wants one live dashboard in Looker Studio that shows revenue, margin, jobs, quotes and cash by branch, with each branch manager seeing only their own branch and every figure traceable to its source.

Table 1Who uses what
SystemWhat it does for the business
ServiceM8 or JobberJobs, quotes, completion dates and branches. Read only.
XeroInvoices, bills, credit notes, tracking categories and the ageing of customer balances. Read only.
Scheduled loadsCopy the data each night into a reporting store. Make in the example.
Reporting storeA BigQuery dataset in the example. A Google Sheet is used for a smaller group.
Looker StudioThe dashboard that managers open. No data is typed in.
General managers and finance leadRead the dashboard and agree what each figure means.

02Problem

What the owner sees

  1. A monthly pack that is late and different every time
  2. Branch margins that the finance lead and the managers argue about
  3. Completed jobs that were never invoiced, found weeks later
  4. No way to give each manager only their own numbers

A dashboard that nobody trusts is worse than a spreadsheet. The work is mostly agreeing what each number means, joining the job system to the ledger properly and proving that the totals tie.

Table 2Where the drift starts
Everyday situationWhat goes wrong
Two definitions of revenueJobs completed and invoices issued give different totals, and both are called revenue
Missing trackingInvoices with no Branch land in no branch and disappear from the branch view
Credit notesRevenue is overstated because credits are left out
Late supplier billsMargin looks better than it is until the bill arrives
Data limitsA spreadsheet source slows down or fails as the history grows
Shared accessOne report with filters that a manager can remove

03Approach

Four steps, in this order. Each one ends with a result that is checked.

  1. LookA read-only review of the monthly pack, the job system exports and the Xero reports. The numbers managers use today are listed with how each is made.
  2. Agree the definitionsEvery figure gets a written definition, a source, an owner and a refresh time.
  3. Build and connectThe loads, the reporting store, the model and the dashboard are built together, one page at a time.
  4. CheckDashboard totals are compared with Xero and the job system for three closed months, and with each manager’s own view.
Table 3KPI definitions agreed in writing (example settings)
KPIDefinitionSource
RevenueAuthorized invoice lines excluding sales tax, less credit notes, by invoice date and BranchXero
Direct costBill lines coded to cost of sales accounts, by Branch, by bill dateXero
Gross margin %(Revenue − direct cost) ÷ revenueXero
Jobs completedJobs with status Completed, by completion date and branchJob system
Average job valueRevenue from invoices linked to jobs ÷ number of those jobsJob system and Xero
Quote conversionQuotes accepted ÷ quotes sent, by the month sentJob system
Completed, not invoicedCompleted jobs with no Xero invoice after 3 days, at their quoted valueJob system and Xero
Debtor daysCustomer balance ÷ revenue over the last 90 days × 90Xero

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
Table 4The setup, layer by layer
LayerWhat is set up and why
Nightly loadsEach source is read with a modified-since filter, so a night’s load is small and stays within the API limits. A full refresh of the last 90 days runs weekly to catch edits and voids.
Reporting storeFact tables for invoice lines, bill lines, jobs and quotes, with dimension tables for branch, service line and date. Raw loads are kept untouched.
Join keysJob number on the invoice reference links Xero to the job system. Invoices with no job number are listed, not guessed.
Data quality pageMissing tracking, missing job numbers, completed jobs without invoices and failed loads, each with a count and a link to the records.
Dashboard pagesExecutive view, branch view, jobs and quotes, cash and debtors, and the data quality page. One filter bar and the same definitions on every page.
Access by branchViewers see the dashboard with their own credentials. A permissions table maps each email to its branch, and the data views filter by it.
Refresh logEvery load writes its time, row counts and status, which the dashboard shows.
Definitions pageThe written KPI definitions inside the dashboard, so the meaning is one click away.

How the data moves

  1. Nightly load from Xero
  2. Nightly load from the job system
  3. Reporting store
  4. Joined on job number
  5. Dashboard in Looker Studio
  6. Branch view by login
  7. Data quality page

05Edge cases

These are agreed with the finance lead and tested on three closed months.

Table 5Edge cases and how each is handled
SituationHow it is handled
Job completed in one month and invoiced in the nextBoth views are shown and labeled: completed and invoiced. Revenue is always by invoice date.
Invoice with no BranchShown as Unallocated in its own bar, with a link to the list
Credit noteReduces revenue in the month it is dated, with the same Branch as the invoice
Voided or deleted invoiceRemoved on the weekly refresh. The refresh log shows how many were removed.
Supplier bill dated after month-end for that monthAppears in the month it is dated. A late-cost note appears on the margin view for the prior month.
Job done by one branch for anotherRevenue stays with the invoice’s Branch. The helping branch’s cost stays with the bill’s Branch.
Branch renamed or mergedHandled in the branch dimension with valid-from dates, so history is not rewritten
API limit reachedThe load pauses, retries later and logs it. The dashboard shows the last good refresh time.
Manager changes branchOne row in the permissions table changes. Nothing else needs editing.
Data source larger than a spreadsheet allowsThe store is a BigQuery dataset, so history can grow without slowing the dashboard

06Worked example

The tables below use one month with example figures. They show the shape of the checks, not a client result.

Table 6Branch view for one month (example data, US$)
BranchRevenueDirect costGross margin %Jobs completedAverage job value
North148,200.0067,800.0054.3%412359.71
South131,500.0062,300.0052.6%371354.45
East96,400.0041,200.0057.3%288334.72
West88,700.0044,100.0050.3%254349.21
Central112,900.0050,200.0055.5%333339.04
Coast74,300.0036,500.0050.9%206360.68
Group652,000.00302,100.0053.7%1,864349.79
Table 7Quotes, and completed jobs not yet invoiced, for the same month (example data, US$)
BranchQuotes sentAcceptedConversionUnbilled jobsUnbilled value
North926166%34,120.00
South885461%22,860.00
East703854%11,340.00
West663350%46,210.00
Central794759%22,480.00
Coast582950%00.00
Group45326258%1217,010.00
Table 8Reconciliation: dashboard against the Xero profit and loss by Branch (example data, US$)
BranchDashboard revenueXero reportDifference
North148,200.00148,200.000.00
South131,500.00131,500.000.00
East96,400.0096,400.000.00
West88,700.0088,700.000.00
Central112,900.00112,900.000.00
Coast74,300.0074,300.000.00
Unallocated0.000.000.00
Total652,000.00652,000.000.00
Table 9Refresh log (example)
SourceMethodScheduleRows loaded last nightStatus
Xero invoices and credit notesModified since the last runNightly, 04:001,184Complete
Xero billsModified since the last runNightly, 04:10652Complete
Xero customer balancesFull snapshotNightly, 04:201,962Complete
Jobs and quotesModified since the last runNightly, 04:301,017Complete
Last 90 days full refreshReplaceWeekly, Sunday 02:0048,310Complete

07How the result is checked

Each figure on the dashboard is traced to a source before the dashboard is handed over, and the check is repeated every month by comparing the dashboard to a Xero report.

Table 10Checks and pass conditions
CheckHowPass condition
Revenue by branchDashboard compared to the Xero profit and loss by Branch for three closed monthsEqual to the cent, with Unallocated shown
Direct costSame comparison on cost of sales accountsEqual to the cent
Job countsDashboard compared to the job system report for the same monthsEqual
Quote conversionCounts of quotes sent and accepted compared to the job systemEqual
Customer balancesDebtor total compared to the Xero ageing reportEqual at month-end
AccessEach manager’s login tested, plus a login with no row in the permissions tableManagers see only their branch; an unknown login sees nothing
FreshnessRefresh log reviewed for a weekNo failed load, and the dashboard shows the last good time
DefinitionsEach figure read back to the finance lead against the written definitionSigned off

08Scope and milestones

A fixed scope agreed in writing before anything starts. Each milestone is paid when you sign off its deliverable.

Table 11Scope: what a project like this covers
AreaIncluded
AuditRead-only review of the current pack, the job system exports and the Xero reports, a 45-minute call, written findings and a fixed quote
DefinitionsKPI definitions, sources and owners in writing, signed by the finance lead and the managers
Loads and storeNightly loads from Xero and the job system into a BigQuery dataset, with a refresh log and alerts
Data modelFact and dimension tables, join keys and a data quality page
DashboardFive pages in Looker Studio, a definitions page and one design for desktop and mobile
AccessA permissions table, branch views by login and a test for each role
ReconciliationThree closed months compared to Xero and the job system, with a tie-out tab
HandoverWritten SOPs, a recorded handover video and files you own, plus 14 days of fixes after go-live
Not includedTax filing and statutory returns.
Also outside the scopeForecasting and budgeting models. Changes to how jobs are recorded in the job system. Moving to a different dashboard tool. Software subscriptions and cloud usage (billed to you by the vendors).
Table 12Fixed milestones
MilestoneDeliverableTimingShare
M1 Audit and definitionsFindings, a fixed quote and the KPI definitions in writingWeek 120%
M2 Loads and storeNightly loads running with a refresh logWeeks 2 to 330%
M3 Dashboard and accessPages live, branch views by login testedWeek 430%
M4 Reconciliation and handoverThree months tie out, SOPs, handover video, 14 days of fixesWeeks 5 to 620%

Typical scope for this kind of project: US$2,500–4,500

About 6 weeks across 4 fixed milestones. The Systems Audit (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 Audit is the right first step.

Hire me on Upwork (opens in a new tab)Hire me on Freelancer (opens in a new tab)