TaxChad Technical Architecture ยท Engine
01 The engine

Same books in, same books out.

The commercial claim is that TaxChad is deterministic: teach it a rule once and it applies that rule, visibly, forever. This page is that claim taken apart, because a claim about determinism is worth nothing unless you can see the mechanism.

Description string Ordered rule list First full match Nominal + VAT code
Engine01 / 07
02 Matching

Five match types. Conditions joined with AND. No scoring anywhere.

A rule matches on the transaction description, and optionally on the payment reference as well. There is no fuzzy matching, no similarity score, no confidence value and no model in this path. A rule either matches or it does not.

Match typeBehaviour
containsCase-insensitive substring. The default, and the one most rules use.
wordThe text as a whole word, on word boundaries.
all_wordsEvery word present, in any order.
starts_withThe description begins with the text.
regexA case-insensitive regular expression, for the cases the other four cannot express.

On top of the text match, a rule can narrow by amount range (compared on absolute size, so it works on money in and money out alike), bank account, date range, currency and direction. Every condition set on a rule must hold. A condition left blank never narrows anything. An invalid pattern, such as a malformed regular expression, marks the rule invalid so it can never fire rather than throwing at the worst possible moment.

Matching02 / 07
03 Ordering

A total order, right down to the tie-break.

Determinism is not achieved by having rules. It is achieved by having exactly one answer to "which rule wins", in every case, forever. The engine sorts the client's rules and takes the first one that matches in full.

01

Priority

An explicit number, defaulting to 100, lowest first. This is the knob a user turns when a specific rule must beat a general one.

02

Sort order

The user's own arrangement within a priority band.

03

Creation time

Oldest first, so an established rule is not displaced by a new one added carelessly.

04

The rule's own identifier

The final tie-break. It exists so that two rules which are identical in every other respect still have a defined winner. Ordering comes from this comparator, never from whatever order the database happened to return rows in.

Effective dating

A rule can carry a from date and a to date, tested against the transaction date rather than today. That is what lets a client change how something is coded from a given month without rewriting history, and it is why replaying a prior year gives the same answer it gave at the time.

Ordering03 / 07
04 The honest detail

What "auditable" means here, precisely.

What is true

  • The engine is a pure function with no model call, no scoring, no confidence value and no learning of any kind
  • The winning rule is reproducible: run the engine again over the same rules and the same transaction and you get the same rule, every time
  • A transaction that matches nothing stays uncoded and visible, rather than being assigned a plausible answer
  • Every change a user makes to a coded transaction is written to the activity log with a snapshot, the actor and a restore path
  • Bulk application deliberately skips split parents, VAT-locked rows and rows that are already coded

What is not true yet

  • The transaction row does not currently store which rule coded it. The result is stored; the rule reference is not
  • So the correct phrasing, and the one we use, is "reproducible by re-running the engine", not "each transaction records the rule that coded it"
  • Rules are edited in place. There is no rule version history table, so a rule changed today cannot be replayed as it stood last year
  • Both are on the roadmap, and both are exactly the kind of thing a diligence process should ask about, so we have written them down rather than waited to be asked
  • Rule preview across a client's history is capped at 20,000 rows and tells you when it truncated, rather than silently showing a partial answer
Candour04 / 07
05 Where models are allowed

Extraction, never judgement.

TaxChad uses machine learning in exactly one place: turning a picture of a document into text and rows. It is never used to decide how something is coded, and the boundary is architectural, not a policy someone remembers to follow.

Allowed

Reading a document

A PDF bank statement or a photographed receipt goes to document text extraction, which returns dates, descriptions and amounts. Speech to text turns a spoken invoice into a draft.

Always

A human sees it first

Extracted rows and drafts are presented for review. Nothing extracted posts to the ledger without a person confirming it.

Never

An accounting judgement

No model chooses a nominal code, a VAT treatment, a tax box or an add-back. Those come from the rules engine and the tax engines, which are ordinary, inspectable code.

Why we are careful how we say this

It would be easy to market TaxChad as "no AI" and easier still for that to be slightly untrue. The honest and defensible sentence is the one we use: the engine that decides is rules-based and deterministic; document text extraction is automated and always reviewed; no model makes an accounting judgement; a human reviews everything the machine produces. The extraction providers are named in the privacy policy and in the subprocessor register, because they process customer documents.

Models05 / 07
06 VAT

The place pennies go missing, closed off.

Splitting
VAT is rounded once and the net is derived as the remainder, so net plus VAT always equals gross exactly.A property test asserts this across thousands of random amounts and every VAT code, and the ledger suite replays every captured client's transactions through the same splitter. Independent rounding of both sides was a real bug that produced penny drift on the balance sheet.
Control accounts
Separate output, input and liability control accounts exist for every business, dormant until registration. The settlement journal credits the liability with the final net including adjustments.
Manual box adjustments
A manual adjustment to a return box contras to a VAT rounding differences nominal in the profit and loss, never to the liability control account.Posting it to the liability understated the amount owed to HMRC, because the settlement journal had already included the adjustment. That bug broke client balance sheets by pennies and took weeks to surface. The fix is locked by a test that reproduces the original bug, so it cannot be reverted unnoticed.
Schemes
Standard, flat rate and cash accounting are supported, with the construction industry domestic reverse charge handled at the transaction level.
Filing
Nine-box returns are prepared from the ledger, shown for approval, and submitted through the Making Tax Digital API with the required fraud prevention headers. Every call is logged.
VAT06 / 07
07 The tax engines

What the platform computes today.

This is the part a general-purpose bookkeeping tool does not have and a practice cannot buy off the shelf. It is also the part that took fifteen years of domain experience to specify correctly, and the reason the founder being an accountant matters more than the founder being an engineer.

Companies

Corporation Tax

Computation from the ledger with disallowable add-backs handled as engine rules rather than notes: entertaining, depreciation, and the rest. Accounts and the return are prepared and filed by the regulated accountant, with direct integration to the accounts production tool on the roadmap.

Sole traders

Self-employment

Full trade box mapping on every income and expense code, cash basis by default with accruals opt-in, so a quarterly update is a grouping of the ledger rather than a separate return.

Landlords

Property

A separate tax source with its own box set. Residential rent is exempt so property codes post gross, and mortgage finance costs are treated as a basic-rate reducer rather than a deduction. A buy to let payment splits three ways: interest, capital and overpayment, with an annual true-up against the lender's certificate.

Construction

CIS

Deductions handled as a layer on the trade source rather than a separate source, with both sides carried: suffered as an asset, payable as a liability, and the domestic reverse charge for VAT handled separately.

Disposals

Capital gains

A disposal event model rather than a ledger nominal, consuming transactions flagged as capital. Pooling, the thirty-day matching rule, the annual exempt amount and private residence relief are all engine rules.

Everything else

The rest of the return

Dividends, employment figures, foreign income with currency conversion, fixed assets and depreciation schedules, and payroll billing. Partnership is deliberately not built.

Sourcing

The box mappings were built against published professional guidance and verified by the founder in his capacity as a named reviewer of the underlying tax material, with any area lacking a verified source flagged in the specification as needing verification rather than shipped quietly. Where a rule was found to be wrong, such as an early draft putting property finance costs in the wrong box, the correction is recorded in the specification alongside the original error.

Next

Integrations

HMRC, fraud prevention headers, open banking, payments and every scheduled job.

Back

Ledger and data model

The guards, the promotion policy and the chart of accounts.

Tax07 / 07
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.