The finance manager at a 25-person UK management consultancy followed the same checklist every quarter: pull the VAT detail report from Xero, cross-check it against the sales ledger, apply the partial exemption calculation for their mixed-supply business, and enter nine figures into the HMRC portal by hand. Eight and a half hours. Every quarter. Four years. When HMRC launched the MTD for VAT API, none of that changed — because no one had connected the two systems. We built the integration. The next quarterly return took 22 minutes.
The HMRC MTD API exposes three endpoints. Xero surfaces its VAT data through a reports API. The difficulty is not the plumbing — it is knowing where the business rules sit that break naive automation: partial exemption, blocked input categories, multi-entity tracking, and the reconciliation checks that a human runs instinctively but need to be explicit in code.
What Making Tax Digital for VAT actually requires: HMRC submission format, deadlines, and software obligations
MTD for VAT has been mandatory for businesses with taxable turnover above £85,000 since April 2019, and for all VAT-registered businesses since April 2022. HMRC's MTD for VAT guidance requires digital record-keeping and submission via MTD-compatible software — the old portal is closed for manual entry.
The submission format is nine boxes: Box 1 (output tax), Box 2 (acquisition VAT for Northern Ireland businesses), Box 3 (Box 1 + Box 2), Box 4 (input tax to reclaim), Box 5 (net VAT payable), and Boxes 6–9 for the net values of sales, purchases, other supplies, and acquisitions.
The filing deadline is one calendar month and seven days after each VAT period end. HMRC's penalty points system — in place since 1 January 2023, replacing the default surcharge — accumulates four points into a £200 penalty plus £200 per subsequent late return, regardless of whether any tax is actually due. A zero-net-VAT quarter filed late still earns a point.
HMRC also requires an unbroken "digital link" throughout the record-keeping chain. Exporting to a spreadsheet, adjusting a cell, and re-importing breaks that chain — even if the final figures are correct. Any step where a human copies a number between systems counts as a break.
Connecting Xero to the HMRC MTD API: the authorisation flow and the three API calls needed to file a return
The HMRC MTD VAT API has three endpoints you need to file a return:
GET /organisations/vat/{vrn}/obligations— fetch open return periods and their period keysGET /organisations/vat/{vrn}/returns/{periodKey}— retrieve a previously submitted return for reconciliationPOST /organisations/vat/{vrn}/returns— submit the return
Authentication uses OAuth 2.0 with HMRC's identity platform. Register an application in the HMRC Developer Hub, request the write:vat scope, and complete the OAuth flow once with the business owner. After that, the workflow runs unattended on a refreshed token.
Xero's GET /Reports/VAT endpoint returns the nine MTD figures filtered by date range, mapping directly to the MTD box structure when Xero VAT settings are correctly configured. The submission payload:
{
"periodKey": "18A1",
"vatDueSales": 12543.21,
"vatDueAcquisitions": 0.00,
"totalVatDue": 12543.21,
"vatReclaimedCurrPeriod": 3871.44,
"netVatDue": 8671.77,
"totalValueSalesExVAT": 62716.05,
"totalValuePurchasesExVAT": 19357.20,
"totalValueGoodsSuppliedExVAT": 0.00,
"totalAcquisitionsExVAT": 0.00,
"finalised": true
}
One detail that catches integrators: periodKey is a four-character opaque code like 18A1, not a date string. Pull it from the obligations endpoint and pass it through unchanged.
Xero is itself an HMRC-recognised MTD software provider, which means it holds the software accreditation. Your registered application calls both Xero's API and HMRC's API separately. You are not replacing Xero — you are wiring its output to HMRC's input.
Transaction categorisation review: using an LLM to flag miscategorised VAT codes before the submission window
Before any submission runs, verify that the VAT codes in Xero reflect what was actually purchased. Staff miscategorise expenses consistently: fuel receipts coded at the full 20% instead of the 50% block rule for cars, client entertainment marked as reclaimable, overseas subscriptions coded as UK standard-rated supply.
We run a categorisation review over exported transactions before closing the period. The model checks description and supplier name against the assigned VAT code:
You are a UK VAT compliance reviewer. For each transaction below, check
whether the VAT treatment is consistent with the description and supplier.
Flag any where the code appears incorrect or where partial exemption may apply.
Return a JSON array: [{"transaction_id": "...", "flag_reason": "..."}]
Flagged transactions require finance sign-off before the workflow proceeds. The LLM is not the authority; HMRC is. But it catches the obvious mismatches that manual review misses after the third identical-looking row in a 200-line export. The pre-submission pass caught an average of three miscoded transactions per quarter for the management consultancy — worth £340 in overclaimed input tax, which across a year exceeded the cost of the build.
Input tax recovery rules: the partial exemption and blocked VAT categories that break naive automation
This is where most "automate the VAT return" projects fail. UK VAT has several categories of blocked or restricted input tax that a direct Xero export will not handle correctly without additional logic:
Blocked input tax: Motor cars (50% block on maintenance and lease unless exclusively business use or a commercial vehicle). Business entertainment — no input tax recoverable on entertaining anyone other than employees. Business gifts over £50 to the same recipient in a year.
Partial exemption: Businesses making both taxable and exempt supplies — financial services firms, mixed-use property developers, professional services firms advising on exempt activities — cannot reclaim all input tax. They apply the HMRC standard method or a special method agreed individually. The standard method apportions residual input tax by the ratio of taxable supplies to total supplies.
De minimis rules: If exempt input tax is below £625 per month on average and below 50% of total input tax, the business may treat all input tax as fully reclaimable. Many SMEs qualify but do not check.
For the management consultancy, partial exemption was the core complexity. They provided taxable consultancy and exempt research services. We encoded the standard method apportionment as a versioned Python function, with the agreed sector split as a parameter updated when HMRC agrees a new calculation. The annual adjustment runs in April each year with a mandatory human sign-off before the corrective submission.
Reconciliation before submission: matching VAT output to sales reports and catching the discrepancies a human misses
Submitting without reconciliation is how firms end up with HMRC compliance letters. Every automated run performs the following checks before the POST call is made:
| Check | Source A | Source B | Pass condition |
|---|---|---|---|
| Output VAT (Box 1) | Xero VAT report | Sales ledger VAT column total | Within £1 |
| Input VAT (Box 4) | Xero VAT report | Purchase ledger after blocked/partial adjustments | Within £1 |
| Net sales (Box 6) | Xero VAT report | Revenue account movements for period | Within £10 |
| Prior period carry-forward | Current Xero period | Prior submission via MTD GET endpoint | Zero unreconciled items |
| Partial exemption result | Formula output | Finance director sign-off record | Exact match |
The prior-period check is the one automated systems most commonly skip. On cash accounting, an invoice raised in Q1 but paid in Q2 appears in different periods in Xero and in the MTD submission history. We pull the previous submitted return via the GET /returns/{periodKey} endpoint and compare Box 5 against what the current period shows as carried forward. Any discrepancy above £1 pauses the workflow and sends an alert. The pass conditions all carry a number — "within £1" is deliberate because penny rounding differences are acceptable and £5 differences are not.
Error handling and late filing: what to do when the HMRC API returns a 422, and the penalty regime for late MTD submissions
The MTD API returns 422 Unprocessable Entity when the submission fails validation. The error response body names the reason. The three most common:
INVALID_PERIOD_KEY— the period is not open or the key is malformedDUPLICATE_SUBMISSION— that period was already successfully filedINVALID_REQUEST— almost always a numeric precision error
The numeric precision case deserves attention. HMRC validates Box 3 = Box 1 + Box 2 and Box 5 = Box 3 − Box 4 exactly to two decimal places. Floating-point arithmetic produces values like 8671.769999999999 that HMRC rejects. Round all nine values to Decimal with two places and re-validate box relationships before the API call.
from decimal import Decimal, ROUND_HALF_UP
def round_vat(value: float) -> Decimal:
return Decimal(str(value)).quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
box1 = round_vat(xero_output["vatDueSales"])
box2 = round_vat(xero_output["vatDueAcquisitions"])
box3 = round_vat(float(box1) + float(box2))
box4 = round_vat(xero_output["vatReclaimedCurrPeriod"])
box5 = round_vat(float(box3) - float(box4))
assert box3 == box1 + box2, "Box 3 mismatch"
assert box5 == box3 - box4, "Box 5 mismatch"
Build a Slack alert seven days before each obligation due date; escalate to the finance director if submission has not succeeded by T-24 hours. Under HMRC's penalty points regime, four late submissions in twelve months equals a £200 penalty plus £200 per subsequent late return, regardless of whether any tax is owed.
Multi-entity VAT groups: when a UK SME has two VAT numbers and one Xero organisation
Some SMEs have two entities — a holding company and a trading subsidiary — each with a separate VAT registration but managed in a single Xero organisation. Others have opted into VAT group registration, filing one return under a single group VRN. The automation handles these three scenarios differently:
Separate VAT numbers, separate Xero organisations: Run two independent workflows, each with its own VRN and Xero API credentials. Straightforward.
Separate VAT numbers, single Xero organisation: Xero's VAT report must be filtered by tracking category to separate entity-level VAT figures — which requires clean tracking-category discipline across the chart of accounts. Most single-Xero multi-entity setups lack this. Audit the tracking data before building the automation.
VAT group, single submission: One VRN, but intercompany supplies must be eliminated from the consolidated return before submission. We have seen this done incorrectly in four of the five VAT group SMEs we have audited. Keep the consolidation step as a human-in-the-loop review — our post on AI expense claim automation for UK SMEs covers the human-review-gate pattern.
What changed in 2025–2026: MTD for Income Tax Self Assessment rollout and Making Tax Digital phase 3 obligations
The biggest development for UK SMEs is the MTD for Income Tax Self Assessment (MTD ITSA) rollout. From April 2026, sole traders and landlords with income over £50,000 must file quarterly updates digitally, with a final end-of-year declaration replacing the Self Assessment return. HMRC's MTD ITSA guidance confirms this timeline after previous delays — for directors who are also self-employed or hold rental income, the quarterly compliance burden doubles.
On the API side, HMRC updated its fraud-prevention header specification in late 2024. As of Q1 2025, Gov-Client-User-IDs and Gov-Vendor-Version headers are strictly validated — missing headers return a 403 with no descriptive body. Any MTD integration built before early 2025 needs reviewing against the current fraud-prevention specification. MTD Phase 3, mandating digital links across the full bookkeeping chain, was confirmed for 2026 — review any workflow that touches a spreadsheet at an intermediate step.
Good / Bad / Ugly: three VAT automation approaches and their audit readiness when HMRC investigated
Three approaches we have seen in practice, and what happened when HMRC opened a compliance check on each client:
| Approach | Description | What HMRC found |
|---|---|---|
| Good | Full API integration: Xero → LLM categorisation review → reconciliation checks → partial exemption calculation → MTD API submission, all logged and versioned | Compliance check passed. Complete digital link chain documented. All nine box values traceable to source transactions with timestamps. |
| Bad | Spreadsheet bridging: Xero data exported to Excel, partial exemption applied manually, figures keyed into MTD bridging software | Submission accepted, but digital link audit failed. Two manual keying steps between Xero and HMRC broke the chain. HMRC required written evidence of compensating controls. |
| Ugly | Xero native MTD click-through: submit whatever Xero calculates, no review, no partial exemption adjustment, no reconciliation | Incorrect returns filed for three quarters. Input tax overclaimed by £2,800 in total. Triggered a VAT inspection, a voluntary disclosure, and a 15% penalty on the overclaimed amount. |
The "Bad" category deserves emphasis. Some professional body guidance argues that bridging software satisfies MTD. It satisfies the submission requirement. It does not create the unbroken digital link from source transaction to filed figure that HMRC's compliance framework actually requires. When HMRC investigates, the question is not whether the right numbers were filed — it is whether you can demonstrate how you arrived at them without a human copying values between systems.
The management consultancy's full API build took one afternoon. The finance manager now reviews a two-page reconciliation summary instead of spending eight and a half hours producing one. See how the same structured-data extraction pattern applies to our invoice OCR and automation case study, and the companion post on automated board pack reporting from Xero and HubSpot for connecting accounting data to downstream outputs.