Book a 30-minute call

A tax assistant that would rather say“ask the firm” than guess.

How we used OpenAI’s GPT and Anthropic’s Claude to build a UK accountancy practice a public AI tax assistant that answers from GOV.UK and HMRC pages, and a secure portal for its payroll clients. Including what went wrong on launch day.

An established UK accountancy practice offering accounts, tax and payroll to small businesses.

The problem

People ask accountants’ websites tax questions at all hours. A general chatbot will happily answer them, and it will sometimes invent a rate or a deadline. On an accountancy firm’s website, a confident wrong figure is worse than no answer at all.

Behind the scenes, payroll clients sent their instructions by email, phone and photo. Staff re-keyed the details and there was no single record of who had asked for what, or when it was done.

The practice wanted two things: a public assistant it could trust with its name on it, and one secure front door for payroll.

The tax assistant, Finn: built to refuse rather than guess

Finn answers general UK tax questions on the practice’s website. It is labelled Beta. When it answers from official guidance, it cites the GOV.UK pages it used, with the date each page was last updated.

Most of Finn is not AI at all. Plain code stops personal questions before any model sees them. A reviewed calculator handles simple tax estimates, and the firm’s own service list answers questions about what the firm does. Only then does a question reach the models.

First, a specialist routing model called Jev sorts the question into a fixed route: general guidance, the firm’s services, a clarifying question, a case for the firm or out of scope. Every choice comes with a confidence score. When Jev is less than 85% sure, OpenAI’s GPT-6 Luna checks the routing.

For guidance questions, the system searches a library of over a thousand GOV.UK pages. OpenAI’s model then picks whole sentences from those pages, and code checks each sentence word for word against the source. If that does not produce a good answer, the model writes a short summary instead, and code checks that every figure in it appears in the cited page. If neither works, the visitor gets the official links, or for a general “how does this work?” question, a short plain explanation with no figures, dates, rates or sources, labelled as general information and not advice. No system is perfect, but these rules are built so that a figure is not invented to fill a gap.

The portal: one front door for payroll

Clients send timesheets (typed or as a photo), payroll changes, new starters and payslip requests through one portal, and can see where each request has got to. Staff work from one queue that shows who is handling each item, and export finished work straight to the payroll software, with a check that stops the same period going in twice.

A request to change bank details is blocked until a member of staff records the call-back they made to confirm it. Pension declarations have their own worklist, a guided check and a daily reminder that contains counts, never personal details.

Six narrow AI helpers, using Anthropic’s Claude Haiku, are built in: they read a timesheet photo, help fill a form or summarise what is urgent. A person confirms every result, and employee names are never sent to the model.

Sign-in
Clients use a passkey (Face ID, fingerprint or Windows Hello) or a password plus an emailed code. Staff use an authenticator app, and confirm it again before sensitive actions.
Encryption
Sensitive fields such as National Insurance numbers, dates of birth and bank details are encrypted inside the database.
An audit log that cannot be edited
The database itself refuses any attempt to change or delete an audit record.
Data location
Data and files are held in Cloudflare’s EU region, with nightly backups. A data protection impact assessment was drafted before launch.

Claude as the engineering team

We build with AI coding agents, directed and checked by a person. On this project, Anthropic’s Claude, working through Claude Code, did most of the portal build and acts as the review and release gate. A second AI coding agent from OpenAI builds some features and checks Claude’s work, and Claude checks its work in return. Nothing reaches the live system without the founder’s approval.

Before launch, the portal went through two security review rounds and a code review. Every finding was fixed, each with its own test to make sure it stays fixed.

How a question moves through Finn
  1. ScreenedCode stops personal details and requests for personal advice, and points the visitor to the firm.
  2. Answered by code if it can beA reviewed calculator and the firm’s service list handle the simple cases with no AI.
  3. RoutedJev picks a fixed route with a confidence score. Below 85%, GPT-6 Luna checks it.
  4. SearchedOver a thousand official GOV.UK pages, with stale and withdrawn pages removed.
  5. Written from the sourceGPT-6 Luna picks or summarises sentences from those pages. Code checks every sentence and figure against the source.
  6. Cited, kept general or handed overAnswers from guidance show their sources. Otherwise the visitor gets official links, a short general explanation with no figures, or a referral to the firm.

Code does the gatekeeping and the checking. The models do the sorting and the reading.

Which model does what

Each job uses the smallest model that does it well, and code checks the output.

Tools and their separate responsibilities in this build
PartToolIts role
RoutingJev, a specialist routing modelSorts each question into a fixed route, with a confidence score.
Reading and writingOpenAI GPT-6 LunaChecks uncertain routing, turns questions into search terms and writes answers from official text.
BackupAn open model on CloudflareTakes over the answer step if the main provider is unavailable, under the same checks.
Portal helpersAnthropic Claude HaikuReads timesheet photos, helps with forms and summarises urgent items for a person to confirm.
EngineeringAnthropic Claude, through Claude CodeBuilds most of the code, reviews every change and runs the release checks, with a second agent from OpenAI cross-checking.

What went wrong, and what we changed

Three mistakes that mattered, and what each one changed.

A misleading answer on launch day
Finn told visitors that companies pay Corporation Tax in instalments. That is only true for large companies. It was live for about 17 hours, and our own test had flagged it about 15 hours before we fixed it. Since then, every incident goes into a written log with a rule to stop it happening again.
Launched below the bar
Finn’s first test round gave good answers to only 13 of 33 questions. We fixed it the same day, added a 150-question test set, and started keeping redacted logs for 90 days so we can see what visitors were actually told.
A release that went backwards
A later update made one kind of tax rate question return links instead of an answer. Our live test questions caught it, and we rolled back in five minutes.

What we cannot claim yet

  • The portal is ready, and the practice is bringing clients onto it. We will add usage figures once there are enough to be meaningful.
  • The 87% figure comes from a hand-graded test at launch and counts good answers and correct refusals together. Fixes were made afterwards and the full test has not been cleanly re-run.
  • Finn is still labelled Beta, and the practice reviews its wording.

The same approach suits any firm that wants AI to answer from its own sources, hand the hard cases to a person and keep a record of both.

Have a workflow like this?

Tell us where your team spends time and what needs to stay under human control.

Book a 30-minute call