How this works
Method
Every number on this site is the output of one function over one set of parameters. Here is the function, the parameters, and the limits of both.
One engine, two callers
All figures come from src/model.mjs. The build imports it to render every page; the browser
imports a byte-identical copy to run the calculator. The build fails if the two files differ. This matters
because the alternative — a server-rendered figure and a client-side calculator written separately — is a
seam where a site quietly starts contradicting itself, and no test of either half alone can see it.
The order of operations
Two bases are in play and confusing them is the easiest way to be wrong here. Income tax bands apply to taxable income — pay after the personal allowance. National Insurance and student loan thresholds apply to pay, with no allowance deducted. The parameter file labels which is which.
Money is held in pence
All internal arithmetic is in whole pence. Working in decimal pounds and rounding at the end lets a half-penny drift accumulate across six bands and produce a total a penny away from HMRC's, and a penny is enough to make a reader checking against a payslip distrust everything else on the page.
The marginal rate is measured, not looked up
The rate on further pay is computed by difference: tax the salary, tax the salary plus £100, compare. It is not read off a band table, because the cases anyone needs this number for are exactly the cases a band table gets wrong — an allowance being withdrawn, a threshold being crossed, a loan repayment starting.
The step is £100 rather than £1, and that is a correction rather than a convenience. Tax is rounded to the penny inside each band, so a £1 step carries up to half a penny of rounding noise — which on a £1 base is half a percentage point of the answer. Measured: Scotland at £110,000 reported 70.0% against a hand-worked 69.5%, purely because 45% of £1.50 is £0.675 and payroll rounds it to £0.68. At £100 the same noise is ±0.005 points.
The bands are discovered
The marginal band tables are produced by walking every £100 from £0 to £180,000 and recording where the rate changes. Nothing is typed in. A hand-kept list of thresholds is correct on the day it is written and silently wrong afterwards; this list cannot be, because it is generated by the same code that computes the tax.
One consequence worth naming: a £100 step that straddles a threshold reports its own blended rate and appears as a band exactly one step wide. Those rows are arithmetically true but are an artefact of where the ruler fell rather than a band anyone earns inside, so they are merged into the neighbour they are closest to. The boundaries still tile the whole range with no gaps.
What is modelled
- 2026/27 rates for England, Wales & Northern Ireland.
- One employment, paid through payroll, taxed on the standard code with no adjustments carried in.
- Employment income only — no dividends, savings interest, rental or self-employment income.
- No taxable benefits in kind, no company car, no unpaid leave.
- National Insurance category A: the standard case for an employee over 21 and under State Pension age.
- Income Tax is annual, but National Insurance is charged per pay period — a large one-off bonus can pay more NI than this annual view shows.
- No student or postgraduate loan repayment.
- No salary sacrifice and no workplace pension contribution.
What is deliberately not
- Benefits with their own cliffs. The High Income Child Benefit Charge and the England free childcare hours that stop dead at £100,000 both change the real marginal rate around that income, in some cases past 100%. They depend on household circumstances this calculation does not ask for, so they are explained in the guides rather than folded into a number that would look authoritative and be wrong for most readers.
- Non-standard tax codes. A code carrying an underpayment, a benefit in kind or a marriage allowance transfer changes the answer, and the code is on your payslip rather than derivable from your salary.
- Pay-period National Insurance. Income tax is cumulative across the year; NI is charged on each pay period separately. A large one-off bonus therefore pays more NI than an annual view implies. Every NI figure here carries that note.
- Anything that is not employment income. Dividends, savings interest, rent and self-employment are taxed under different rules.
Checking
The build runs a suite of assertions whose expected values were worked by hand from the GOV.UK tables and written down with their arithmetic, rather than copied from this code's own output. A test whose expected value came from the thing it tests agrees with it forever, including when both are wrong.
If a figure here disagrees with your payslip, that is worth an email to corrections@taxwedge.com — corrections get published on /changes/.
Why the boundaries are discovered rather than typed
The obvious way to publish a table of marginal rates is to write down the thresholds you know and compute a rate between each pair. It is also the way to publish an error that nothing can catch, because the table and the calculator would then be two independent statements of the same rule, and nothing forces them to agree.
So the bands on this site are found by asking the engine. The rate on the next pound is computed across the income range, the points where the answer changes are bracketed, and each bracket is bisected to the nearest pound. The result is then checked against the published statutory thresholds, and the build fails if they disagree. That check is what makes the rest trustworthy: the boundaries the engine discovers reproduce £12,570, £50,270, £100,000 and £125,140 for the rest of the UK, and Scotland's £16,537, £29,526, £43,663 and £75,000, without any of those numbers appearing in the search.
Two things that look like pedantry and are not
The probe used to find the boundaries runs with rounding switched off. Tax is rounded to the penny inside each band, and a one-pound probe therefore carries up to half a penny of rounding noise — which on a one-pound base is half a percentage point of the answer. Measured: Scotland at £110,000 reported 70.0% against a hand-worked 69.5%. Payroll figures elsewhere on the site still round, because payroll rounds; the boundary search does not, because it is measuring a rate rather than paying anyone.
The discovered ranges are then shifted by one pound before publication. The scan answers "at income g, what is the next pound taxed at", so a boundary lands on the last income before a new rate applies. Every official table answers the other question — "a pound of income in this range is taxed at" — which puts the same boundary one pound higher. Publishing the scan's own framing would put every threshold on this site one pound away from the threshold on GOV.UK: correct under a reading nobody uses, and indistinguishable from an off-by-one bug to any reader who checks.
One engine, sent to your browser unchanged
The pre-built pages and the interactive calculators are the same code. The engine file used to generate the pages is copied verbatim into the site and loaded by the browser, and a test asserts the two copies are byte-identical. That is not tidiness. Two implementations of a tax rule is one implementation too many: they drift, and the drift shows up as a calculator that disagrees with the page it sits on, which is the single most trust-destroying thing a site like this can do.
What is not modelled, and why
Benefits in kind, non-standard tax codes, second employments, dividend and savings income, and anything assessed through self-assessment rather than PAYE are all outside the model. So are the benefit interactions — Universal Credit tapers in particular, which produce marginal rates well above anything shown here but depend on household circumstances that a salary box cannot ask about. Modelling them badly would be worse than not modelling them, because a reader would have no way to tell the difference between a figure that accounts for their situation and one that merely appears to.