TaxChad Technical Architecture ยท Integrations
01 Integrations

Every wire out of the building.

A bookkeeping platform is defined as much by what it connects to as by what it computes. This page lists every external service production code actually calls, what it is for, and what happens when it fails.

Integrations01 / 06
02 HMRC

The hardest integration in UK accounting software.

Making Tax Digital is not a REST API with a token. It is a REST API with a token plus a set of fraud prevention headers that describe, truthfully, the network path between the taxpayer's browser and HMRC. Getting those headers right on modern serverless infrastructure is the part most vendors underestimate.

Wired today
VAT: obligations, view return, submit return, liabilities and payments. Income Tax Self Assessment: business details, period summaries and annual submissions.
Environment
Sandbox by default. Production requires a separate set of credentials and an explicit environment setting, and the code refuses to resolve to production if those credentials are absent.This is deliberate. A misconfiguration should file nothing, not file into the live system.
Authorisation
The taxpayer grants access through HMRC's own OAuth flow. The callback state is signed and verified in constant time with a fifteen-minute maximum age. Tokens are encrypted by the application with authenticated encryption before storage and refreshed shortly before expiry.
Retry policy
Rate limiting is retried up to three times, honouring the interval HMRC asks for, with exponential backoff and jitter otherwise. Server errors and timeouts are deliberately not retried, because a blind retry on a submission endpoint is how a return gets filed twice.
Evidence
Every call writes operation, path, headers with credentials masked, payloads, status, correlation id, attempt count and duration to an audit log.
HMRC02 / 06
03 The fraud header problem

A worked example of how this company solves things.

HMRC requires headers identifying the client's public address and port and the vendor's own public address. This is a genuinely awkward requirement for any application hosted on modern edge infrastructure, and it is worth showing the whole sequence, because it is a fair sample of how technical decisions get made here.

01

We measured instead of assuming

A diagnostic endpoint was deployed purely to print what the infrastructure actually sees. The assumed path, browser to database platform, was wrong. The real path has two intermediaries: a content delivery network and a cloud provider in front of the runtime.

02

The result was three findings, not one

The client address was obtainable. The client's source port was not, because what the platform exposes is the gateway's listening port, not the browser's ephemeral one. And the outbound address of the runtime changed on every invocation, so it could never be a fixed vendor value.

03

The conclusion was uncomfortable and we accepted it

On that stack, compliant headers were not achievable. Not difficult: not achievable. The diagnostic endpoint was then removed, because an unauthenticated endpoint making outbound calls is not something to leave lying around once it has done its job.

04

We asked the people who define the rules

Rather than guess at an interpretation, the two specific questions were put to HMRC's software developer support: what is accepted when the source port genuinely cannot be obtained, and what is the accepted pattern for a vendor address on dynamic serverless egress.

05

The fix is small and surgical

A single fixed-address relay sits in the path for HMRC API calls only. It gives a stable vendor address and one known hop, and it forwards the browser-collected client values faithfully. Everything else in the platform stays where it is.

06

The relay is treated as hostile by default

The client address and port it forwards are trusted only when a shared secret matches on a constant-time comparison, and they are format-validated before use. Values that fail are ignored rather than passed on. The OAuth token exchange deliberately does not go through the relay, because the client secret must never transit that box.

Why a small feature gets a whole section

It is a small feature. It is also a complete demonstration of the operating method: measure rather than assume, accept an unwelcome finding, ask the authority rather than invent an interpretation, fix narrowly, and treat your own infrastructure as untrusted. If you are deciding whether to trust a piece of software with your books, that method is most of what you actually want to know about the people who wrote it.

Fraud headers03 / 06
04 The rest of the perimeter

Everything production code calls, and why.

ServicePurposePosition
FinexerOpen banking account information, and payment initiation for Pay by BankTaxChad operates as an agent under Finexer's own regulatory permissions for account information. TaxChad holds no permissions of its own and never holds client money. Integration is built, feeds are moving to live customers, and a webhook monitor runs hourly.
Companies HouseCompany details, officers and filing deadlinesIndependent controller, not a subprocessor. Swept twice daily so deadlines stay current without manual entry.
StripeSubscription billingCard details never touch TaxChad infrastructure.
GoCardlessDirect debit collection of subscription feesMoney movement screens are reserved to the owner access tier rather than available to every operator.
AWS TextractDocument text extraction from statements and receiptsRegion pinned to London. Output always reviewed by a human before posting.
AI gatewayDocument extraction and speech to text for voice captureNamed in the privacy policy and the subprocessor register. Never used for an accounting judgement.
Amazon S3Off-site encrypted backupsA separate cloud account from the production platform, so a compromise of one is not a compromise of both.
Exchange rate sourcesDaily rates, with a secondary source as fallbackA freshness monitor raises an alert if rates go stale, and HMRC's own monthly rates are refreshed separately.
Postcode and mapping lookupsAddress completion and mileage distancesMapping is reached through a gateway rather than a direct account, and both are on the register.
Email deliveryTransactional and notification emailAllowlisted templates only, rate limited, with a send log and bounce handling.

Bank data can also arrive with no live connection at all: format-aware importers for Wise, Monzo, Lloyds, Mettle, Virgin Money and Capital on Tap, gateway exports from Stripe, PayPal and Shopify, plus generic CSV, OFX and PDF. That matters commercially, because it means a customer can be onboarded and made useful before any open banking consent exists.

Perimeter04 / 06
05 Scheduled work

Sixteen jobs, all in the database scheduler.

Scheduled work calls the application over HTTPS with a secret held in the database vault, and the target host is a vault value rather than a hardcoded string. Without the secret, the endpoint refuses.

JobScheduleWhat it does
Platform backup01:00 and 02:00Two London-time-guarded jobs so the encrypted off-site snapshot lands at 02:00 local all year
Ledger invariant sweep03:20 nightlyReplays the invariant suite across the live ledger
FX daily ingest17:00 dailyPulls the day's rates from the primary source
FX freshness monitor17:30 dailyRaises an alert if rates did not land
HMRC token expiry watch05:45 dailyFlags authorisations about to lapse before a filing deadline does
HMRC sandbox keepaliveWeeklyKeeps the test environment credentials alive between releases
Companies House sweep02:45 and 14:45Refreshes company details and statutory deadlines
Obligation reminders06:00 dailyTells clients and the practice what is due
Recurring invoices07:00 dailyGenerates invoices from schedules, atomically
Invoice reminders08:15 dailyChases unpaid sales invoices
Receipt matching04:10 dailyMatches uploaded receipts to bank lines
Fiscal year creation02:15 dailyOpens the next period before anyone needs it
Payroll billingMonthlyMeters and bills reviewed payroll runs
Finexer webhook monitorHourlyDetects a bank feed that has gone quiet, rather than waiting for a customer to notice
HMRC monthly rates1st of monthRefreshes the published rates some returns require
Schedules05 / 06
06 Failure

What happens when something on this page breaks.

Principle

Fail closed, then tell someone

An automated path that cannot prove it should run does not run. A missing secret, an unverified webhook or an absent credential produces a refusal, not a best-effort attempt.

Principle

Never retry a submission blindly

Rate limiting is retried politely. Server errors on filing endpoints are not, because filing the same return twice is worse than filing it late.

Principle

Detect the silence

The failure mode that hurts is not an error, it is a feed that quietly stops. Hence a webhook monitor, a rate freshness monitor, a token expiry watch and a nightly ledger sweep: four jobs whose only purpose is to notice nothing happening.

Principle

Degrade to manual

Every automated input has a manual equivalent. If a feed stops, a statement can be imported. If extraction fails, rows can be typed. Nothing in the filing path depends on a single integration being available.

Next

Build and run

Continuous integration gate by gate, backups and disaster recovery, monitoring and incident response.

Back

Security and tenancy

Isolation, audit trails and the open items list.

Failure06 / 06
TaxChad is built and operated by TaxChad Ltd, company number 17346680, registered in England and Wales. This page describes the platform as built on 19 September 2026. Counts of tables, migrations, tests and lines of code were read from the live database and the repository on that date and move as the product does. Anything described as in build or planned is a statement of intent rather than a commitment. Regulated accountancy services are provided by PowerStone Accountants Ltd, a separate company, under its own licence and insurance. Nothing here is tax, legal or investment advice.