Simpro knows what a job was quoted at, what labour was booked to it and which purchase orders were raised against it. Xero knows what the customer was actually charged after credits, and what suppliers actually billed. A job profitability report that reads only one of those systems shows a margin that never happened. This page sets out how to pull job revenue and cost out of Simpro, join it to Xero record by record, and report the margin each job really made.
Why the Simpro margin and the accounts disagree
The two figures start from the same job but drift apart for ordinary reasons, none of which is anyone's mistake:
- Credit notes raised in finance. A customer disputes a return visit, finance issues a credit in Xero, and the job in Simpro still shows the full invoiced value.
- Bills that differ from the order. Simpro costs materials at the purchase order value. The supplier's bill arrives a fortnight later at a different price, and only Xero sees the difference.
- Costs that never touched Simpro. Plant hire, skip hire or a last-minute subcontractor gets entered straight into Xero as a bill. If someone tags it to the job, the accounts know; Simpro does not.
- Orders not yet billed. At month end some purchase orders have no bill. The cost is real, it is just not in the ledger yet.
None of these show up in a single-system report. A job that looks like 28% in Simpro can be under 20% once the ledger has had its say, and the MD only finds out when the management accounts and the job list do not add up.
What each system contributes
Simpro's listing on the Xero App Store describes what its accounting link moves: customer invoices, supplier invoices, credits, payments and contacts sync both ways; timesheets and manual journals go from Simpro to Xero; accounts and tracking categories come from Xero into Simpro. That tells you which records exist on both sides. It does not tell you how they are keyed, which is the part a margin report depends on.
| System | Record | Used for |
|---|---|---|
| Simpro | Job | Job number, customer, site, type, completion date |
| Simpro | Customer invoice | Invoice number, job, net value raised from the job |
| Simpro | Labour booked to the job | Hours × cost rate, from timesheets |
| Simpro | Purchase orders on the job | PO number, supplier, ordered value |
| Xero | Sales invoice (ACCREC) |
InvoiceNumber, Reference, Contact, SubTotal |
| Xero | Credit note | Amount and the invoice it is allocated to |
| Xero | Bill (ACCPAY) |
Supplier, line Description, line Tracking, net amount |
Xero field names above are from Xero's published Accounting API specification. Simpro also documents an API on its developer site; field names there vary by build and version, so confirm the job, invoice and purchase order resources on your own account rather than copying a list from a blog.
The joins, and why invoice numbers are not the key
The easy assumption is that invoice 51247 in Simpro is invoice 51247 in Xero. Do not make it. Xero's specification describes InvoiceNumber on a sales invoice as a unique code that Xero auto-generates from the organisation's invoice settings when none is supplied, so the two sequences can run independently. Xero also has a separate Reference field, which the same specification marks as for sales invoices only.
What your link actually writes into each field depends on how the integration was set up. Before building anything, take twenty invoices raised last month, find each one in both systems, and write down which Xero field holds the Simpro number. That five-minute check decides the join.
| From | To | Key in this example | Watch for |
|---|---|---|---|
| Simpro invoice | Xero sales invoice | Simpro invoice number held in Xero Reference |
Blank references on invoices keyed by hand in Xero |
| Xero sales invoice | Xero credit note | Credit allocated to the invoice | Unallocated credits sit on the customer, not the job |
| Simpro purchase order | Xero bill | PO number in the bill line Description |
Reference is not available on bills, so the PO must travel in line text or tracking |
| Simpro job | Xero bill with no PO | Tracking option named for the job, or job number in line text | Xero allows at most two tracking categories per line |
Where a sales invoice has no usable reference, fall back to customer, date and amount, and treat the result as a probable match for someone in finance to confirm. Never let a fuzzy match feed the margin silently.
The formulas
| Measure | Formula |
|---|---|
| Simpro margin | Simpro invoiced − (labour + PO values + subcontract POs) |
| Reconciled revenue | Invoiced value matched in Xero (unmatched invoices held at Simpro value and flagged) − Xero credit notes allocated to the job's invoices |
| Reconciled cost | Labour + Σ(billed value where a bill matches the PO, else PO value accrued) + Xero bills tagged to the job with no PO |
| Reconciled margin % | (reconciled revenue − reconciled cost) ÷ reconciled revenue |
| Margin gap | Simpro margin − reconciled margin, split by cause |
Labour stays at the cost rate Simpro holds. If those rates are stale, every job is wrong by the same proportion, so review them against payroll once a quarter rather than trying to allocate payroll per job.
Jobs completed in October 2026
Job margin, Simpro vs reconciled · Tarnby Electrical & Mechanical (fictional)
Simpro shows 35.8% margin.
Reconciled with Xero, it is 33.2%.
11 completed jobs. Revenue net of Xero credit notes; cost at billed value, with Xero-only bills added and unbilled purchase orders accrued.
- Margin in Simpro
- £39,455
- 35.8% of £110,120
- Margin reconciled
- £36,060
- 33.2% of £108,735
- Gap
- £3,395
- 2.6 points across 11 jobs
- Jobs down over 2 points
- 5
- Reconciled vs Simpro
How each job is joined across the two systems
Keys in this example. Check which field your own accounting link writes before relying on any of them.
- SimproJob → invoiceinvoice no. → ReferenceXeroSales invoice (ACCREC)Xero numbers its own invoices; the Simpro number sits in Reference here
- SimproInvoiceallocationXeroCredit noteCredits raised in Xero reduce job revenue
- SimproPurchase orderPO no. → bill line textXeroBill (ACCPAY)Billed value replaces PO value; unbilled POs are accrued
- SimproJobjob no. → tracking or line textXeroBill entered in Xero onlyCost Simpro never saw, added to the job
Job 30440 · Quenby Mews Dental
Refit: lighting and ventilation
| Simpro margin | £4,130 | 27.9% |
|---|---|---|
| Credit note in Xero | −£650 | |
| Bill above PO value | −£165 | |
| Bill tagged to job in Xero only | −£540 | |
| Reconciled margin | £2,775 | 19.6% |
PO not yet billed, £800 accrued at PO value.
Where the £3,395 went, all jobs
- Bill tagged to job in Xero only−£1,680
- Credit note in Xero−£1,385
- Bill above PO value−£475
- Bill below PO value+£145
Margin per job, before and after
| Job | Simpro | Reconciled | 0–50% | Status |
|---|---|---|---|---|
| 30422Orbell & Finch Offices | 36% | 12.9% | Reconciled | |
| 30439Brackenrigg Garden Centre | 48.1% | 35.8% | Reconciled | |
| 30440Quenby Mews Dental | 27.9% | 19.6% | Accrued | |
| 30413Wyedale Cold Storage | 34.5% | 30.2% | Reconciled | |
| 30417Saltmarsh Leisure Club | 39% | 36.7% | Reconciled | |
| 30401Harrowgate Lane Lettings | 39.9% | 39.9% | Reconciled | |
| 30406Pellow Street Bakery | 30.1% | 30.1% | Reconciled | |
| 30409Corran Park Primary | 33.7% | 33.7% | Reconciled | |
| 30427Ketterby Care Home | 44.4% | 44.4% | Accrued | |
| 30429Fallowfield Print Works | 32.1% | 32.1% | For review | |
| 30435Linnet House Apartments | 39.2% | 40.4% | Reconciled |
Thin mark: Simpro margin. Thick mark: reconciled margin. Gold where the job lost more than 2 points.
Worked example (illustrative, fictional)
Tarnby Electrical & Mechanical is an invented contractor. Job 30440 is a lighting and ventilation refit for Quenby Mews Dental, also invented, completed in October 2026.
What Simpro shows. Two invoices: 51247 for £8,000 and 51248 for £6,800, so £14,800 invoiced. Labour booked is £4,120. Three material POs total £5,350 (£2,900 + £1,650 + £800) and one subcontract PO is £1,200. Cost is £4,120 + £5,350 + £1,200 = £10,670. Margin is £14,800 − £10,670 = £4,130, which is 27.9%.
What the join finds in Xero.
- Both invoices are there as INV-04427 and INV-04428, each carrying the Simpro number in
Reference. The numbers differ; the reference is what links them. - Credit note CN-215 for £650 is allocated to INV-04428 for a disputed return visit. Revenue becomes £14,800 − £650 = £14,150.
- PO-8801 was billed at £2,900, as ordered. PO-8802 was ordered at £1,650 and billed at £1,815, so cost rises by £165. PO-8803 for £800 has no bill yet and is accrued at its order value. The subcontract PO was billed at £1,200.
- A £540 scaffold tower hire bill was entered in Xero with a tracking option for job 30440. Simpro never saw it.
Reconciled. Cost is £4,120 + £2,900 + £1,815 + £800 + £1,200 + £540 = £11,375. Margin is £14,150 − £11,375 = £2,775, which is 19.6%.
The bridge from one figure to the other is three lines: £4,130 − £650 − £165 − £540 = £2,775. The job lost 8.3 points of margin, and every pound of that has a named cause and a record behind it. The £800 accrual is flagged, not hidden, so it can be swapped for the real bill when it lands.
Across the month. The same logic applied to all eleven October jobs gives £39,455 of margin in Simpro (35.8% of £110,120) and £36,060 reconciled (33.2% of £108,735). The £3,395 gap breaks down as £1,680 of bills tagged to jobs in Xero only, £1,385 of credit notes, £475 of bills above PO value, offset by £145 where a bill came in under the order. Five jobs fell by more than two points. One job has a Xero invoice with a blank reference, so it is held for review rather than counted as reconciled.
Checks before anyone acts on the report
- Unallocated credits. A credit note left on the customer account rather than allocated to an invoice cannot be pinned to a job. List them separately so they do not vanish.
- Bills with no link at all. Any bill with neither a PO number nor a job tag should appear on an exceptions list, not be spread across jobs by guesswork.
- Timing. The integration moves records on its own schedule. State on the report the time each source was last read.
- Retentions and stage payments. On longer jobs, a margin taken before the final invoice will look worse than it is. Report those jobs as in progress, not complete.
- Contract work. Visits under a maintenance contract are usually billed by schedule, not per job, so per-job revenue is misleading. Contract-level margin is covered in maintenance contract profitability.
Where this fits in the wider pack
Reconciled job margin is one line in a weekly pack, next to first-time fix, utilisation and unbilled work; field service KPIs sets out the rest. If you run a different job system, the same pattern applies with different keys: see Uptick and ServiceMax. More on field service reporting.
Automating the reconciliation with IVP.ai
Doing this by hand means two exports, a lookup on references, another on PO numbers, and a list of bills to chase, every month. The IVP.ai Data Layer reads Simpro and Xero into one governed warehouse, keeps the joins and formulas above as tested definitions, and refreshes the report on whatever cadence you set. When a link breaks, such as a run of invoices with blank references, the report says so rather than quietly dropping those jobs.
Deskless by IVP.ai can work the exceptions. By default it flags, drafts and waits for a person: it lists bills with no job link, asks the right buyer which job a hire charge belongs to, and holds probable invoice matches for finance to confirm. It only changes records if you configure it to.
A national fire safety and security company used the same approach to unify HubSpot, Uptick and finance spreadsheets into one governed view, and saves 10+ hours a week on reporting (case study). The platform page covers how sources are connected and governed.
To see your own jobs reconciled, start a free 48-hour build. We connect up to three sources, clean the data and set one report or agent running on your real data within 48 hours of read-only access. You then have 14 days of access to decide: choose a plan or walk away.