Skip to main content

INSIGHTS / CASE STUDY

Reconciling BAS to Xero: code calculates, AI explains

Every quarter, a small Australian practice checked each client's lodged BAS and IAS figures against Xero by hand. We built the tool that now does the checking. The AI in it is the smallest part, and it isn't allowed to do maths.

Ossama Mughal - Founder & Principal
PUBLISHED OCT 2026 · UPDATED 15 OCT · 14 MIN READ

THE SHORT VERSION

  • One Atosa export per client replaces a download per lodgement. Three Xero reports go in beside it. Nothing is re-keyed.
  • Code compares G1, 1A, 1B, W1 and W2 in integer cents, for the period and the year to date, and gives each label one of three statuses: Matched, Explained or Needs review.
  • New: when a GST label doesn't match, "Investigate in Xero" reads the quarter's transactions, read-only, and finds what changed after the BAS was lodged. It explains a difference only when the transactions add back up to Xero's own figure. Otherwise it says the evidence is incomplete.
  • A model running on the accountant's laptop drafts a short note for every label that isn't Matched. A note that quotes a number not in its facts is rejected.
  • The accountant accepts, edits or rejects each note and signs off. An Excel workpaper comes out. Nothing is lodged.
  • The first real client-quarter ran end to end on 11 October 2026. The Xero investigator is built and tested on invented data; live checks come next.
THE WORKFLOW IN TWO MINUTES · NO SOUND · DEMO FIGURES

The practice and the problem

TheLodge is a small Australian accounting practice, and the pilot covers its five Xero clients. GST is lodged quarterly on the BAS; PAYG withholding monthly on the IAS, with the quarter's BAS carrying the third month's W1 and W2.

Before each sign-off, the practice reconciles what was lodged against what Xero now says. For every client and period that meant opening each lodged statement in the ATO portal, copying the labels into an Excel workpaper, exporting the GST Reconciliation, Profit and Loss and payroll reports from Xero, comparing them with formulas, chasing every difference and writing the conclusion. The Excel file, the notes and a few screenshots were the review record.

None of that is difficult. It is repetitive, and it competes for the same hours as the client work the practice is actually paid for.

What the audit found

We start every engagement the same way: with the real workpaper and the way the work is actually done, before we recommend anything. Four findings shaped the build.

  • The bottleneck wasn't the note. Writing "the difference is GST entered after lodgement" takes a minute. Getting to the point where you know that takes the rest: collecting, comparing and narrowing.
  • Investigation is report-first. The accountant reasons from report-level facts, such as GST Unfiled, Adjustments and the year-to-date position, before opening any transactions. When those facts don't account for a difference, the next question is always the same: what changed in Xero after the BAS was lodged?
  • The lodged figures already sit in one place. Atosa holds the practice's lodged activity statements, and one Excel export per client covers every period. The per-lodgement portal downloads could go.
  • The inputs are consistent. The same four reports and the same five labels, every period. That makes this a rules problem, not a model problem.

Our verdicts

Every idea gets a written verdict. Here are the six that mattered, including the ones we said no to, and the one we have since changed.

VerdictIdeaWhy
GOReconcile the five labels with deterministic rulesExact, repeatable and explainable to the cent. A model would add risk and nothing else.
GODraft a review note for each exceptionWriting is what language models do well, when they only see verified facts and are checked afterwards.
GO
was NOT YET
Trace a GST difference to the Xero transactions behind itWe first said not yet to AI doing this, and we still would. The accountant did want the answer, so we built it as read-only code that only explains a difference when the transactions add up to Xero's own figure. Changed 15 Oct 2026.
NOT YETTake the report figures from Xero's APIThe API doesn't return these reports the way the accountant exports and trusts them, so each would need rebuilding and proving. The exports stay the figures; the read-only connection is used only as evidence.
NO-GOAI doing sums or setting a statusEvery figure and every status comes from code, including the Xero investigation.
NO-GOLodging, amending, paying or writing to XeroThe tool holds no ATO or Atosa credentials and has no write access to Xero. The accountant lodges.

One more decision belongs to the practice, not to us: client facts don't go to a cloud model. Inference runs on the accountant's own laptop.

How it works

Five steps, and one decision-maker.

Before: five manual steps repeated for every client and period, from opening each lodged statement in the ATO portal to digging through Xero for each difference. After: drop one Atosa export and three Xero exports, code reconciles five labels, a GST difference is investigated in Xero read-only, a local AI drafts a note for each exception, and the accountant decides and signs off.
BEFORE AND AFTER, FOR ONE CLIENT AND PERIOD. SELECT TO ENLARGE.

1. Drop the exports

The accountant downloads four kinds of file and drops them on one screen, all at once.

FileSourceHow often
Activity Statement workbook, all periodsAtosaEach upload
GST Reconciliation, financial year to date, cash basisXeroEach quarter
Profit and Loss, cash basis, the quarterXeroEach quarter
Payroll Employee Summary, the monthXeroEach month

The app works out what each file is, which organisation and which period it covers, and matches it to a client. It asks only about genuine ambiguity: a Profit and Loss that doesn't state its basis, an organisation it hasn't seen, or a workbook with two statements for the same period, which usually means an amendment. Xero's GST Reconciliation only exports to Excel as an older .xls file, so the app reads that format as well as .xlsx, without running any formulas or macros.

Uploads are versioned. An amended statement replaces the original for new runs, the accountant can see that it did, and earlier runs stay exactly as they were.

The upload screen: a drop zone for .xlsx and .xls files, and cards asking the accountant to confirm a client's reporting cadence and to choose which client a new payroll file belongs to.
THE UPLOAD SCREEN ASKS ONLY WHEN IT ISN'T SURE · DEMO WORKSPACE, INVENTED FIGURES

2. Code reconciles

Five rules, one per label. All amounts are integer cents, and the difference is always lodged minus Xero.

LabelLodgedCompared with, in Xero
G1 Total salesBAS G1Cash Profit and Loss total income, plus GST Collected when the BAS says G1 includes GST
1A GST on salesBAS 1AGST Reconciliation: GST Collected, that quarter's row
1B GST on purchasesBAS 1BGST Reconciliation: GST Paid plus GST on imports, that quarter's row
W1 Salary and wagesIAS or BAS W1, the monthPayroll Employee Summary earnings, less the declared salary sacrifice
W2 Amount withheldIAS or BAS W2, the monthPayroll Employee Summary tax

Two details matter to anyone who has done this by hand. GST labels are compared only when the lodged BAS states the cash method; anything else, or a method that can't be read, is Needs review. And W1 isn't computed until the accountant has declared that month's salary sacrifice, either "none" or an amount. The declaration appears in the workpaper as the accountant's own assertion.

Each label in each period then gets its difference, its year-to-date difference and one status:

  • Matched. Within $1. No action needed.
  • Explained. Over $1, but report-level facts account for all of it: GST Unfiled for that quarter equals the difference, because something changed in Xero after lodgement; GST Adjustments equal the difference; for G1, 1A or 1B, Xero transactions changed after lodgement account for it, proven complete (step 3); or a later period reverses it and brings the year to date back within $1. That last one is a timing offset, linked to the later period, and the earlier record is never rewritten. The accountant confirms each Explained label with one click.
  • Needs review. Everything else, with a plain reason: a missing, duplicate or amended statement, a missing export, a non-cash GST method or an undeclared salary sacrifice.

Unknown is a valid outcome. We would rather show Needs review with a reason than a confident guess.

The G1 formula, GST on imports in 1B and the $1 tolerance are pilot rules. The accountant still has to confirm each one.

Flowchart: for one label and one period, if inputs are incomplete the status is Needs review. If the difference is within $1 it is Matched. If report facts or proven Xero changes cover all of it, it is Explained and the accountant confirms; otherwise Needs review. An AI note is drafted for Explained and Needs review labels.
HOW EVERY LABEL GETS ITS STATUS. SELECT TO ENLARGE.

3. Investigate in Xero, when a GST figure has moved

Report-level facts say that Xero changed after lodgement, not what changed. For a G1, 1A or 1B difference they don't cover, the accountant can press "Investigate in Xero". It's new, built after the first version of this case study, and it is code, not AI.

  • The accountant enters the lodgement date. Atosa doesn't record it, so the app pre-fills the BAS due date and asks. Changes in Xero from that day on count as after lodgement.
  • The app reads the quarter from Xero, read-only. Invoices, bills, credit notes, payments, bank transactions, manual journals and their change history. Each client has its own optional connection, checked against the client's ABN. It has no write access.
  • It proves the pull is complete. It rebuilds the label from the transactions on a cash basis and checks the result against Xero's own report figure. If the two differ by more than $1, the evidence is incomplete and explains nothing. The label stays Needs review, with the reason.
  • It counts only changes it can be sure of. A transaction added, voided or deleted, a payment moved into or out of the quarter, a GST journal entered after lodgement. Edits whose effect it can't determine, and possible tax-code problems, are listed for the accountant but never counted.
  • It says how sure it is. "Exact" only when a Xero snapshot from within seven days of lodgement exists to compare against; otherwise "flags only", with the reason. The workpaper's Xero evidence sheet records which.

If the counted changes account for the whole difference, within $1, the label becomes "Explained by transactions", and the accountant still confirms it. The Xero report export stays the authoritative figure; the transactions are only evidence for it.

Bar chart of changes to Xero's 1A figure after lodgement, invented figures: invoice added plus $100, invoice voided minus $200, payment moved minus $40, GST journal plus $120. The net change of minus $20 accounts for the whole $20 gap between the lodged BAS and Xero.
A $20 GAP, FOUR CHANGES BEHIND IT · DEMO WORKSPACE, INVENTED FIGURES

A $20 difference is easy to wave through. In this demo, $460 of changes sit behind it. That is what the accountant is signing over. It's built and has passed independent reviews against invented Xero data. The checks against Xero's demo company and a real client file come next.

Flowchart: enter the lodgement date, read the quarter from Xero read-only, then check whether the rebuilt figure equals Xero's report figure within $1. If not, the evidence is incomplete and the label stays Needs review. If so, count only changes after lodgement, labelled exact or flags only, and the label is Explained by transactions if they cover the whole difference; the accountant confirms. No AI in this step.
HOW INVESTIGATE IN XERO EXPLAINS A GST DIFFERENCE. SELECT TO ENLARGE.

4. The AI drafts a note, and gets checked

For every label that isn't Matched, a language model drafts a short review note. This is the only place AI appears, and it is fenced in on every side.

  • Local. The model runs through Ollama on the accountant's own laptop. No client fact leaves the machine.
  • De-identified. It reads a fact packet built field by field: a client alias such as "Client A", the label and its rule, the lodged and Xero figures and their components, the differences, statuses and reasons. For an investigated GST label it adds counts and totals from the Xero evidence. Organisation names, ABNs, file names, employee data and transaction contacts, references or descriptions never enter it.
  • Constrained. Its reply must fit a fixed schema: a summary, a likely root cause and a recommended action, each a sentence or two.
  • Number-checked. Every number in the note must appear in the packet, compared in cents. Percentages and number words fail. A failing note gets one retry; after that, the label simply has no note.
  • Bounded. The model never calculates and never sets a status. The accountant accepts, edits or rejects every note, and both versions are kept.
Everything runs on the accountant's laptop: upload, the reconciliation engine, transaction evidence, a de-identified fact packet, the local model, a number check, the review screen, the encrypted store, the accountant's decision and the Excel workpaper. Coming in: the exports the accountant downloads and, optionally, a read-only Xero connection. Never in the loop: ATO or Atosa logins, lodging, a cloud model and writing to Xero.
WHAT STAYS ON THE ACCOUNTANT'S LAPTOP. SELECT TO ENLARGE.
An Explained 1A label: lodged $3,300.00, Xero $3,550.00, with GST Unfiled accounting for the difference, and a simulated AI note with a summary, likely root cause, recommended action and Accept, Edit and Reject buttons.
A DRAFTED NOTE AWAITING THE ACCOUNTANT · DEMO WORKSPACE, INVENTED FIGURES

Which model? That's decided on the accountant's own laptop, an ordinary office machine without a dedicated graphics card, by scoring a shortlist of small open models against 50 invented fact packets. Each is measured on whether its replies fit the schema, pass the number check and arrive in reasonable time, and on whether the accountant finds the notes useful.

5. The accountant decides

A practice dashboard shows every client for the period, with status counts and a review queue. Each client-period opens to its labels, the AI note, the accountant's own note and a sign-off. Any figure can be traced to the report, row and cell it came from.

The practice dashboard for a quarter: two invented clients, a list of items that need attention, and a status grid for G1, 1A, 1B, W1 and W2 per client.
THE PRACTICE DASHBOARD · DEMO WORKSPACE, INVENTED CLIENTS AND FIGURES
A sources panel for G1 showing the Atosa statement column and cells, and the Xero Profit and Loss and GST Reconciliation rows the figures came from.
EVERY FIGURE TRACES TO ITS ROW AND CELL · DEMO WORKSPACE

Sign-off produces an Excel workpaper for the client-period, with Summary, Sources, Xero evidence, Review notes and Sign-off sheets, plus a period summary across all clients. Sign-off needs a note on every Needs-review label and a confirmation on every Explained one. Completed runs are immutable; a new upload or an amendment creates a new version.

Confidentiality, by design

  • The app runs only on the accountant's laptop and listens only to that machine.
  • Client data is encrypted at rest, with the key held in Windows Credential Manager.
  • Xero is read-only. The optional connection is per client, has no write access, and what it reads is encrypted on the laptop. There are no ATO or Atosa credentials anywhere in the tool.
  • No client data goes into web addresses, logs or browser storage.
  • Every test runs on invented clients and figures. Checks against real files print structure only: report types and labels, never amounts or names.

Where it stands

On 11 October 2026 the first real client-quarter ran end to end: one client's BAS and its three months of payroll. 1A, W2 and two of the three months' W1 matched. G1, 1B and one month's W1 came up as differences for the accountant to judge. That's the tool doing its job: surfacing the differences, not resolving them.

The next steps happen on the accountant's own laptop: the install, the model evaluation, confirming the G1 formula, GST on imports and the $1 tolerance, and a recorded go or no-go. Once those are done we'll publish the measured result, hours per quarter before and after, including if the number disappoints.

Investigate in Xero was built on 14 and 15 October 2026 and tested on invented Xero data. Before it reaches the practice it has to pass a check against Xero's demo company and a check on a real client's file. We expect some G1 evidence to come back incomplete at first: G1 is compared against Profit and Loss income, which the transactions don't map to one-for-one yet. It will say so rather than guess, and we'll report what the real files show.

What we'd do differently

We nearly made the mistake we warn clients about. Early on, we spent weeks hardening hand-built file readers against edge cases in Xero exports, before a single real file had run end to end. The reconciliation is generic and the inputs are consistent; a well-maintained spreadsheet library reads them fine. A structured scope review cut the build to five rules and four exports, and the first real quarter ran three days later.

If you're scoping something similar:

  • Run one real file end to end in the first week.
  • Prefer a maintained library to a clever parser.
  • Decide what the AI isn't allowed to do before deciding what it does.

The bottleneck wasn't writing the note. It was everything before it.

Five questions before you buy AI for reconciliation

  1. Which figures does the tool calculate, and can you trace each one to a cell in a source report?
  2. Where does client data go, and where does the model run?
  3. What happens when the tool doesn't know? A reason beats a confident guess. And when it explains a difference, can it prove the explanation is complete?
  4. Can the AI change a number or a status? It shouldn't be able to.
  5. Who signs off, and what's in the workpaper when they do?

NEXT STEP

Start with clear rules for the AI your team already uses

That's the AI Safe-Use Setup: an inventory of the AI tools your team uses, a one-page policy written to the TPB's AI guidance, and a 3-hour hands-on session for your team. When one workflow looks worth testing, Reality Check Lite gives every step a verdict.

  • From A$4,950 + GST, about 4–6 weeks
  • We look at the tools, never at client files
Book a 20-minute call See the AI Safe-Use Setup →

RELATED

When not to use AI: the checklist we score against

All insights →