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.
- ScreenedCode stops personal details and requests for personal advice, and points the visitor to the firm.
- Answered by code if it can beA reviewed calculator and the firm’s service list handle the simple cases with no AI.
- RoutedJev picks a fixed route with a confidence score. Below 85%, GPT-6 Luna checks it.
- SearchedOver a thousand official GOV.UK pages, with stale and withdrawn pages removed.
- Written from the sourceGPT-6 Luna picks or summarises sentences from those pages. Code checks every sentence and figure against the source.
- 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.
| Part | Tool | Its role |
|---|---|---|
| Routing | ToolJev, a specialist routing model | Its roleSorts each question into a fixed route, with a confidence score. |
| Reading and writing | ToolOpenAI GPT-6 Luna | Its roleChecks uncertain routing, turns questions into search terms and writes answers from official text. |
| Backup | ToolAn open model on Cloudflare | Its roleTakes over the answer step if the main provider is unavailable, under the same checks. |
| Portal helpers | ToolAnthropic Claude Haiku | Its roleReads timesheet photos, helps with forms and summarises urgent items for a person to confirm. |
| Engineering | ToolAnthropic Claude, through Claude Code | Its roleBuilds 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.