Go Develop All articles
Product Engineering

The Rate Will Move: Designing UK Billing Software for Tax Change

Go Develop
The Rate Will Move: Designing UK Billing Software for Tax Change

Photo: Foreign and Commonwealth Office, OGL v1.0, via Wikimedia Commons

Billing software has a habit of making policy look permanent. A VAT rate is entered as a number, a conditional is wrapped around a customer type, and an invoice template is adjusted by hand. The system works until the rule changes. Then the cost is not merely the new rate; it is the hunt for every place the old rule was assumed.

For UK SMEs, the practical question is not whether tax rules will change. They will. The question is whether the billing system treats a tax change as a controlled configuration release or as a forensic exercise across code, reports and spreadsheets.

The number is the smallest part

Standard rate VAT at 20 per cent is easy to store. The difficulty lies in the conditions attached to it. Which products qualify for a reduced rate? When does the tax point occur? Is rounding applied per line or per invoice? What wording must appear on the invoice? How should a credit note reference the original treatment?

When these decisions are scattered through application code, a rate change becomes a regression risk. Developers search for hardcoded values, finance teams reconcile reports, and customer service teams answer questions about historical invoices. The visible change is one number. The hidden change is the set of assumptions built around it.

A cautionary example from hospitality

Between 2020 and 2022, hospitality, holiday accommodation and attractions moved through a temporary reduced rate of 5 per cent, then 12.5 per cent, before returning to 20 per cent. For organisations with configurable systems, this was largely an administrative task. For others, it exposed point-of-sale terminals, invoice templates and reporting queries that had been designed around a single rate.

The lesson is not that hospitality is uniquely complex. It is that tax policy can change at short notice and with narrow boundaries. A system that cannot express those boundaries will require development work each time policy moves. A system that can express them turns the same event into a configuration and testing exercise.

The VAT registration threshold also moved in April 2024, from £85,000 to £90,000. That change affected who needed to register rather than the rate itself, but it reinforces the same design point: tax logic is full of dates, thresholds and exceptions. Software should represent them explicitly.

Model the rule, not just the rate

A more durable approach is to treat tax as a versioned rule set. Each rule should carry, at minimum, a tax code, a jurisdiction, a rate, an effective start date, an optional effective end date, a treatment category, a rounding method, invoice wording and a reporting classification.

Rules should be immutable once used. A change creates a new version rather than editing history. When a transaction is processed, the system selects the rule that applies to the tax point, not simply the current date. The invoice then stores a snapshot of the rule that was applied, including the rate and the wording shown to the customer.

This matters for more than audit. It allows the business to answer a simple question without opening a support ticket: why was this invoice treated this way? That question may come from a customer, an accountant, an auditor or a new finance team member. The answer should be available in the system, not reconstructed from memory.

Boundaries are where systems fail

Most billing defects do not occur in the middle of a tax period. They occur at the edges. A rule that starts on 1 April must apply to transactions on or after that date, but the tax point may not match the invoice date. A credit note may relate to an earlier supply. A backdated invoice may need the rule that applied at the time of supply, not the rule in force when the invoice is raised.

Rounding deserves particular attention. Rounding per line and rounding per invoice can produce different totals. Discounts, multi-line baskets and mixed-rate invoices compound the problem. The system should make the rounding policy explicit and testable rather than leaving it to whichever database or reporting tool happens to calculate the figure.

These are not abstract concerns. They are the cases that finance teams discover during reconciliation and that support teams inherit after go-live. A small set of boundary tests, written as executable specifications, will usually reveal more risk than a broad manual review.

Audit trails are a business requirement

An effective-dated configuration model is only useful if it is governed. Changes should pass through an approval workflow with a named owner, a reason and a timestamp. Direct database edits should be prohibited. Historical versions should be read-only. Access should be limited to those who understand the operational consequences.

For many SMEs, the right answer is not to build a tax engine from scratch. Specialist tax calculation services and established accounting platforms already handle much of this complexity. But even when those services are used, the billing application still needs clear boundaries: what is calculated locally, what is retrieved from a provider, what is stored on the invoice and how exceptions are reviewed.

A pragmatic sequence

A sensible starting point is an inventory of where tax logic currently lives. That includes application code, invoice templates, spreadsheets, reporting queries and manual processes. The next step is to extract calculation into a single, testable boundary. Effective dating and rule snapshots can follow. Boundary tests should be written alongside the model, not after it.

Finally, the business needs a named owner for tax configuration and a routine for reviewing changes. That routine does not need to be elaborate. It needs to be reliable.

Tax policy is a moving part. Billing software should be designed with that movement in mind. The VAT line is a policy decision, and the system should treat it as one: versioned, dated, auditable and tested.

All Articles

Related Articles

Small Team, Small Footprint: Deciding Whether Go Deserves a Place in Your UK Stack

Small Team, Small Footprint: Deciding Whether Go Deserves a Place in Your UK Stack

The Hour That Happens Twice: Building UK Software That Survives the Clocks Change

The Hour That Happens Twice: Building UK Software That Survives the Clocks Change

A Kit, Not a Catalogue: Building a Minimum Viable Design System for a UK Product Team

A Kit, Not a Catalogue: Building a Minimum Viable Design System for a UK Product Team