From b5502022390fbece9047c51b075966ac055ae923 Mon Sep 17 00:00:00 2001 From: Vahid Ahmadi Date: Wed, 27 May 2026 11:31:14 +0200 Subject: [PATCH 1/7] Add pension tax relief documentation page (#704) #704 reported four worked scenarios where the user expected higher-rate pension contributions to produce only basic-rate (20%) relief, but the model returned full marginal-rate (40%) reductions in income tax. Investigation: the model is correct. The reported numbers match HMRC's treatment in aggregate (RAS + higher-rate top-up via Self Assessment). The user's mental model only counted the first half (relief at source). Persist the explanation in a docs page covering: - how pension_contributions_relief works (reduces taxable income by the contribution amount, capped at annual allowance / basic amount / earned income / age limit), - the four #704 worked scenarios with PolicyEngine's exact returns and the marginal-rate arithmetic that produces them, - the two-part real-world mechanism (RAS + basic-rate-band extension) and why PolicyEngine reports the combined total (matches HMRC pension tax relief statistics methodology), - a note that the 0% marginal-tax-rate display reported in the issue is a frontend concern in the policyengine.org app, not the model repo, - references to FA 2004 s.188-194 and s.227, HMRC's user-facing pension tax relief guide, and pension tax relief statistics. --- changelog.d/704.md | 1 + .../programs/gov/hmrc/pension-tax-relief.md | 97 +++++++++++++++++++ 2 files changed, 98 insertions(+) create mode 100644 changelog.d/704.md create mode 100644 docs/book/programs/gov/hmrc/pension-tax-relief.md diff --git a/changelog.d/704.md b/changelog.d/704.md new file mode 100644 index 0000000000..a05d2972aa --- /dev/null +++ b/changelog.d/704.md @@ -0,0 +1 @@ +- Add a documentation page at `docs/book/programs/gov/hmrc/pension-tax-relief.md` explaining how PolicyEngine UK models personal pension tax relief — full marginal-rate reduction in taxable income via `pension_contributions_relief`, with separate annual-allowance excess charge via `personal_pension_contributions_tax` — and clarifying that the model correctly reports the *total* relief (both relief-at-source + higher-rate top-up combined) for the scenarios reported in #704. diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md new file mode 100644 index 0000000000..3da0983625 --- /dev/null +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -0,0 +1,97 @@ +# Pension tax relief + +This page documents how PolicyEngine UK models tax relief on personal +pension contributions and addresses the confusion reported in +[#704](https://github.com/PolicyEngine/policyengine-uk/issues/704) +about whether higher-rate taxpayers receive the right amount of +relief. + +## What the model does + +`pension_contributions_relief` (defined in +[`variables/gov/hmrc/pensions/pension_contributions_relief.py`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py)) +reduces the person's taxable income by the amount of their pension +contribution, capped at: + +- the higher of `pension_annual_allowance` (currently £60,000) and the + `gov.hmrc.income_tax.reliefs.pension_contribution.basic_amount` + (£3,600 — the unearned-income contribution ceiling), +- the person's total earned income (employment + self-employment), +- subject to the `pension_contributions_relief_age_limit` (75). + +Contributions **above** the annual allowance trigger a separate +charge — `personal_pension_contributions_tax` — which taxes the +excess at the person's marginal rate. + +So the headline behaviour is: **within the annual allowance, pension +contributions reduce taxable income £1-for-£1**. The income-tax saving +that the model reports is the contribution × the person's marginal +rate. + +## Worked examples + +The four scenarios reported in #704 (all 2025-26, all self-employed, +single person, no other income): + +| ID | Self-employed income | Pension contribution | Expected income-tax change | What the model returns | Why | +|-------|---------------------|----------------------|-----------------------------|------------------------|-----| +| 11800 | £30,000 | £0 | baseline | baseline | – | +| 11799 | £30,000 | £3,000 | -£600 | -£600 | £3k contribution × 20% basic rate | +| 11817 | £60,000 | £0 | baseline | baseline | – | +| 11816 | £60,000 | £6,000 | -£2,400 | -£2,400 | £6k contribution × 40% higher rate | + +This is exactly the behaviour reported. The user's expectation that +higher-rate cases should only see -£1,200 (£6k × 20%) corresponds to a +misunderstanding of how UK pension tax relief works in aggregate: the +total tax relief is full marginal rate, even though it is paid in two +parts in the real world (relief at source plus higher-rate top-up via +Self Assessment). + +## Relief at source vs marginal-rate relief + +The user-facing UK pension framework has two parallel mechanisms that +add up to the same total relief: + +1. **Relief at source (RAS)** — the pension provider claims the + basic-rate portion (20%) directly from HMRC. The contributor pays + from net income and the pension grows by the gross amount. For a + basic-rate taxpayer, this is the *entire* relief. +2. **Higher-rate top-up** — for taxpayers at higher or additional + rates, the extra band difference (20% for higher rate, 25% for + additional) is reclaimed via Self Assessment. The mechanism is + technically a **basic-rate-band extension**: HMRC widens the basic + rate band by the gross contribution, pushing income that would + otherwise be taxed at the higher rate down into the basic band. + +PolicyEngine computes the **total** relief — both mechanisms together — +because it operates on annual aggregates rather than walking the +cash-flow steps. That matches HMRC's published statistics on the +*fiscal cost of pension tax relief*, which also report the total +across both mechanisms. + +If you want to see the user-visible tax bill reduction separately from +the pension-provider's RAS claim, you'd need to split the existing +relief into two output variables (a basic-rate-portion and a +higher-rate-top-up portion). This is a presentation question rather +than a calculation question — the totals are unchanged. + +## Marginal tax rate display + +#704 also reported a 0% marginal tax rate where 20% / 40% was +expected. The marginal-tax-rate calculation is a frontend concern +(the policyengine.org app derives it numerically by perturbing income), +so it depends on which variable is being differentiated. PolicyEngine +UK exposes a clean `income_tax` that, when differentiated against +`employment_income` or `self_employment_income`, returns the +person's marginal rate; if the frontend is differentiating against a +different variable (e.g. `household_net_income` net of taper effects) +it can return values that look surprising. This is out of scope for +the model repo. + +## References + +- HMRC, [Tax on your private pension contributions: Tax relief](https://www.gov.uk/tax-on-your-private-pension/pension-tax-relief) — user-facing guide to RAS + higher-rate relief. +- [Finance Act 2004 s. 188-194](https://www.legislation.gov.uk/ukpga/2004/12/section/188) — primary statute for relief-at-source. +- [Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227) — annual allowance excess charge. +- HMRC, [Pension tax relief statistics](https://www.gov.uk/government/collections/personal-pensions-statistics) — published costing methodology used for the calibration target. +- Model variables: [`pension_contributions_relief`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py) and [`personal_pension_contributions_tax`](../../../policyengine_uk/variables/gov/hmrc/pensions/private_pension_contributions_tax.py). From 43accccbf9ada6e1e367c7f09d6ee345ae430542 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Thu, 8 Oct 2026 15:54:30 +0100 Subject: [PATCH 2/7] Refresh the planning page against the current code and type its changelog fragment Checked every variable, parameter, path and link against main in October 2026, updated the data pipeline references to Microcosm UK, and renamed the changelog fragment to a Towncrier type. Co-Authored-By: Claude Opus 5.5 --- changelog.d/{704.md => 704.added.md} | 0 .../programs/gov/hmrc/pension-tax-relief.md | 38 +++++++++++++------ 2 files changed, 27 insertions(+), 11 deletions(-) rename changelog.d/{704.md => 704.added.md} (100%) diff --git a/changelog.d/704.md b/changelog.d/704.added.md similarity index 100% rename from changelog.d/704.md rename to changelog.d/704.added.md diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index 3da0983625..a70c855182 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -4,25 +4,39 @@ This page documents how PolicyEngine UK models tax relief on personal pension contributions and addresses the confusion reported in [#704](https://github.com/PolicyEngine/policyengine-uk/issues/704) about whether higher-rate taxpayers receive the right amount of -relief. +relief. #704 is still open (October 2026); the figures below were re-run +on the current model. ## What the model does `pension_contributions_relief` (defined in [`variables/gov/hmrc/pensions/pension_contributions_relief.py`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py)) -reduces the person's taxable income by the amount of their pension -contribution, capped at: - -- the higher of `pension_annual_allowance` (currently £60,000) and the - `gov.hmrc.income_tax.reliefs.pension_contribution.basic_amount` - (£3,600 — the unearned-income contribution ceiling), -- the person's total earned income (employment + self-employment), -- subject to the `pension_contributions_relief_age_limit` (75). +reduces the person's taxable income by their pension contributions, +limited to: + +- the person's employment plus self-employment income; +- then the higher of `pension_annual_allowance` (£60,000 by default) and + `gov.hmrc.income_tax.reliefs.pension_contribution.basic_amount` (£3,600); +- and only for people under `gov.hmrc.pensions.pension_contributions_relief_age_limit` + (75). + +The law limits relief to the higher of relevant UK earnings and £3,600 +gross ([Finance Act 2004 s. 190](https://www.legislation.gov.uk/ukpga/2004/12/section/190)). +The model applies the earnings limit first, so someone with no earnings gets +no relief. That makes no difference to their income tax, which is zero +anyway, but it means the basic-rate top-up paid into their pension under +relief at source is not modelled. Contributions **above** the annual allowance trigger a separate charge — `personal_pension_contributions_tax` — which taxes the excess at the person's marginal rate. +One gap: the relief does not reduce `adjusted_net_income`, so contributions +do not restore personal allowance lost above £100,000, as they do in law +([Income Tax Act 2007 s. 58](https://www.legislation.gov.uk/ukpga/2007/3/section/58)). +An employee on £110,000 keeps a £7,570 personal allowance in 2025-26 whether +or not they contribute £10,000. + So the headline behaviour is: **within the annual allowance, pension contributions reduce taxable income £1-for-£1**. The income-tax saving that the model reports is the contribution × the person's marginal @@ -31,7 +45,8 @@ rate. ## Worked examples The four scenarios reported in #704 (all 2025-26, all self-employed, -single person, no other income): +single person aged 40, no other income). The "model" column was re-run in +October 2026: | ID | Self-employed income | Pension contribution | Expected income-tax change | What the model returns | Why | |-------|---------------------|----------------------|-----------------------------|------------------------|-----| @@ -93,5 +108,6 @@ the model repo. - HMRC, [Tax on your private pension contributions: Tax relief](https://www.gov.uk/tax-on-your-private-pension/pension-tax-relief) — user-facing guide to RAS + higher-rate relief. - [Finance Act 2004 s. 188-194](https://www.legislation.gov.uk/ukpga/2004/12/section/188) — primary statute for relief-at-source. - [Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227) — annual allowance excess charge. -- HMRC, [Pension tax relief statistics](https://www.gov.uk/government/collections/personal-pensions-statistics) — published costing methodology used for the calibration target. +- HMRC, [Personal pensions statistics](https://www.gov.uk/government/collections/personal-pensions-statistics) — including the published cost of pension tax relief. +- [Finance Act 2004 s. 190](https://www.legislation.gov.uk/ukpga/2004/12/section/190) — the earnings-or-£3,600 limit on relief. - Model variables: [`pension_contributions_relief`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py) and [`personal_pension_contributions_tax`](../../../policyengine_uk/variables/gov/hmrc/pensions/private_pension_contributions_tax.py). From 8e28c70fdaed98a881e00262d69c15d067f405f4 Mon Sep 17 00:00:00 2001 From: vahid-ahmadi Date: Mon, 12 Oct 2026 11:09:22 +0200 Subject: [PATCH 3/7] Correct the pension tax relief page against current main MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Re-ran the four #704 cases on policyengine-uk 2.126.12 (income tax falls by £600 and £2,400, unchanged) and the £110,000 personal allowance example. Described the tapered annual allowance from its parameters, the wider contribution base for the annual allowance charge, and that the charge is added to income tax. Rewrote the marginal tax rate section: the model has its own marginal_tax_rate variable, which now returns 20% and 40% for these cases, so the reported 0% no longer reproduces. Fixed code links that pointed outside the repo, removed em dashes, and dropped the extra bullet from the changelog fragment. Co-Authored-By: Claude Opus 5.5 --- changelog.d/704.added.md | 2 +- .../programs/gov/hmrc/pension-tax-relief.md | 67 +++++++++++-------- 2 files changed, 40 insertions(+), 29 deletions(-) diff --git a/changelog.d/704.added.md b/changelog.d/704.added.md index a05d2972aa..6cd2db94ea 100644 --- a/changelog.d/704.added.md +++ b/changelog.d/704.added.md @@ -1 +1 @@ -- Add a documentation page at `docs/book/programs/gov/hmrc/pension-tax-relief.md` explaining how PolicyEngine UK models personal pension tax relief — full marginal-rate reduction in taxable income via `pension_contributions_relief`, with separate annual-allowance excess charge via `personal_pension_contributions_tax` — and clarifying that the model correctly reports the *total* relief (both relief-at-source + higher-rate top-up combined) for the scenarios reported in #704. +Add a documentation page at `docs/book/programs/gov/hmrc/pension-tax-relief.md` explaining how PolicyEngine UK models personal pension tax relief (full marginal-rate reduction in taxable income via `pension_contributions_relief`, with separate annual-allowance excess charge via `personal_pension_contributions_tax`), and clarifying that the model correctly reports the *total* relief (both relief-at-source + higher-rate top-up combined) for the scenarios reported in #704. diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index a70c855182..bf7c3a7f07 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -5,17 +5,17 @@ pension contributions and addresses the confusion reported in [#704](https://github.com/PolicyEngine/policyengine-uk/issues/704) about whether higher-rate taxpayers receive the right amount of relief. #704 is still open (October 2026); the figures below were re-run -on the current model. +on policyengine-uk 2.126.12. ## What the model does `pension_contributions_relief` (defined in -[`variables/gov/hmrc/pensions/pension_contributions_relief.py`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py)) +[`variables/gov/hmrc/pensions/pension_contributions_relief.py`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py)) reduces the person's taxable income by their pension contributions, limited to: - the person's employment plus self-employment income; -- then the higher of `pension_annual_allowance` (£60,000 by default) and +- then the higher of `pension_annual_allowance` and `gov.hmrc.income_tax.reliefs.pension_contribution.basic_amount` (£3,600); - and only for people under `gov.hmrc.pensions.pension_contributions_relief_age_limit` (75). @@ -27,9 +27,20 @@ no relief. That makes no difference to their income tax, which is zero anyway, but it means the basic-rate top-up paid into their pension under relief at source is not modelled. -Contributions **above** the annual allowance trigger a separate -charge — `personal_pension_contributions_tax` — which taxes the -excess at the person's marginal rate. +`pension_annual_allowance` is the standard annual allowance (£60,000 from +6 April 2023), tapered by £1 for every £2 of adjusted net income above +£260,000 down to a minimum of £10,000 (parameters under +`gov.hmrc.income_tax.allowances.annual_allowance`). The model tapers on +`adjusted_net_income`, which stands in for the statutory "adjusted +income". The money purchase annual allowance is not modelled. + +Contributions **above** the annual allowance trigger a separate charge, +`personal_pension_contributions_tax`, which taxes the excess at the +person's marginal rate and is added to income tax. The amount tested +against the allowance is `pension_contributions_for_annual_allowance`, +which counts employee, personal, employer and salary sacrifice +contributions +([Finance Act 2004 s. 233](https://www.legislation.gov.uk/ukpga/2004/12/section/233)). One gap: the relief does not reduce `adjusted_net_income`, so contributions do not restore personal allowance lost above £100,000, as they do in law @@ -45,8 +56,9 @@ rate. ## Worked examples The four scenarios reported in #704 (all 2025-26, all self-employed, -single person aged 40, no other income). The "model" column was re-run in -October 2026: +single person aged 40, no other income, contributions entered as +`personal_pension_contributions`). The "model" column was re-run in +October 2026 on policyengine-uk 2.126.12: | ID | Self-employed income | Pension contribution | Expected income-tax change | What the model returns | Why | |-------|---------------------|----------------------|-----------------------------|------------------------|-----| @@ -67,18 +79,18 @@ Self Assessment). The user-facing UK pension framework has two parallel mechanisms that add up to the same total relief: -1. **Relief at source (RAS)** — the pension provider claims the +1. **Relief at source (RAS)**: the pension provider claims the basic-rate portion (20%) directly from HMRC. The contributor pays from net income and the pension grows by the gross amount. For a basic-rate taxpayer, this is the *entire* relief. -2. **Higher-rate top-up** — for taxpayers at higher or additional +2. **Higher-rate top-up**: for taxpayers at higher or additional rates, the extra band difference (20% for higher rate, 25% for additional) is reclaimed via Self Assessment. The mechanism is technically a **basic-rate-band extension**: HMRC widens the basic rate band by the gross contribution, pushing income that would otherwise be taxed at the higher rate down into the basic band. -PolicyEngine computes the **total** relief — both mechanisms together — +PolicyEngine computes the **total** relief (both mechanisms together) because it operates on annual aggregates rather than walking the cash-flow steps. That matches HMRC's published statistics on the *fiscal cost of pension tax relief*, which also report the total @@ -88,26 +100,25 @@ If you want to see the user-visible tax bill reduction separately from the pension-provider's RAS claim, you'd need to split the existing relief into two output variables (a basic-rate-portion and a higher-rate-top-up portion). This is a presentation question rather -than a calculation question — the totals are unchanged. +than a calculation question: the totals are unchanged. ## Marginal tax rate display -#704 also reported a 0% marginal tax rate where 20% / 40% was -expected. The marginal-tax-rate calculation is a frontend concern -(the policyengine.org app derives it numerically by perturbing income), -so it depends on which variable is being differentiated. PolicyEngine -UK exposes a clean `income_tax` that, when differentiated against -`employment_income` or `self_employment_income`, returns the -person's marginal rate; if the frontend is differentiating against a -different variable (e.g. `household_net_income` net of taper effects) -it can return values that look surprising. This is out of scope for -the model repo. +#704 also reported a 0% marginal tax rate where 20% or 40% was +expected. The model's `marginal_tax_rate` variable +([`variables/household/marginal_tax_rate.py`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/household/marginal_tax_rate.py)) +raises each adult's `employment_income` by +`gov.simulation.marginal_tax_rate_delta` (£1,000, or 0.1% of employment +income where that is larger) and measures the share of the rise that +does not reach `household_net_income`. Re-run in October 2026, it returns +20% for both £30,000 cases and 40% for both £60,000 cases, so the 0% +reported in #704 no longer reproduces in the model. ## References -- HMRC, [Tax on your private pension contributions: Tax relief](https://www.gov.uk/tax-on-your-private-pension/pension-tax-relief) — user-facing guide to RAS + higher-rate relief. -- [Finance Act 2004 s. 188-194](https://www.legislation.gov.uk/ukpga/2004/12/section/188) — primary statute for relief-at-source. -- [Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227) — annual allowance excess charge. -- HMRC, [Personal pensions statistics](https://www.gov.uk/government/collections/personal-pensions-statistics) — including the published cost of pension tax relief. -- [Finance Act 2004 s. 190](https://www.legislation.gov.uk/ukpga/2004/12/section/190) — the earnings-or-£3,600 limit on relief. -- Model variables: [`pension_contributions_relief`](../../../policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py) and [`personal_pension_contributions_tax`](../../../policyengine_uk/variables/gov/hmrc/pensions/private_pension_contributions_tax.py). +- HMRC, [Tax on your private pension contributions: Tax relief](https://www.gov.uk/tax-on-your-private-pension/pension-tax-relief): user-facing guide to relief at source and higher-rate relief. +- [Finance Act 2004 s. 188-194](https://www.legislation.gov.uk/ukpga/2004/12/section/188): primary statute for relief at source. +- [Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227): annual allowance excess charge. +- HMRC, [Personal pensions statistics](https://www.gov.uk/government/collections/personal-pensions-statistics): including the published cost of pension tax relief. +- [Finance Act 2004 s. 190](https://www.legislation.gov.uk/ukpga/2004/12/section/190): the earnings-or-£3,600 limit on relief. +- Model variables: [`pension_contributions_relief`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/gov/hmrc/pensions/pension_contributions_relief.py) and [`personal_pension_contributions_tax`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/gov/hmrc/pensions/private_pension_contributions_tax.py). From dc265486cbe9fbdf4b25f19626a299bf9491ed18 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 02:19:28 -0400 Subject: [PATCH 4/7] Bring the pension tax relief page up to date with main and the law MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Main's version of the page predates #2488 (merged 20 October) and #2536 (merged 21 October). Corrections, each checked against main a45baf5e4: - #2488 has merged; the page no longer calls it open. - unused_pension_annual_allowance is estimated from 2020-21 (formula_2020) rather than defaulting to nil; nil for the £100k example. - Defined-benefit accrual counts through defined_benefit_pension_share and defined_benefit_pension_input_amount, not only a supplied pension_contributions_for_annual_allowance. - Relevant UK earnings are taxable employment income (less expenses) plus trading profit after capital allowances and the trading allowance, before losses (utils/pensions.py). - The annual allowance charge keeps relief-at-source contributions in income and raises the rate limits only when s. 192(4)'s condition holds (private_pension_contributions_tax.py); new £2,946 example. - s. 192(4) raises the higher rate limit too; the higher-rate top-up can be claimed outside Self Assessment and differs in Scotland. - The model gives no relief on basic-rate RAS above taxable income. - Tapered allowance minimum was £4,000 in 2020-21 to 2022-23. - marginal_tax_rate perturbs the two eldest adults in turn. - #704 gives no year or age, and its reporter expected £0 and -£1,200, so the column is the total relief; examples re-run on 2.148.2. - Replaced the released .added fragment with a .changed fragment. Co-Authored-By: Claude Opus 5.5 --- ...ion-tax-relief-page-corrections.changed.md | 1 + changelog.d/704.added.md | 1 - .../programs/gov/hmrc/pension-tax-relief.md | 100 +++++++++++------- 3 files changed, 65 insertions(+), 37 deletions(-) create mode 100644 changelog.d/704-pension-tax-relief-page-corrections.changed.md delete mode 100644 changelog.d/704.added.md diff --git a/changelog.d/704-pension-tax-relief-page-corrections.changed.md b/changelog.d/704-pension-tax-relief-page-corrections.changed.md new file mode 100644 index 0000000000..fcd0e79b37 --- /dev/null +++ b/changelog.d/704-pension-tax-relief-page-corrections.changed.md @@ -0,0 +1 @@ +Brought the pension tax relief page (`docs/book/programs/gov/hmrc/pension-tax-relief.md`) up to date with main: #2488 has merged, unused annual allowance is now estimated from 2020-21 rather than defaulting to nil, defined-benefit accrual counts through `defined_benefit_pension_share`, relevant UK earnings follow taxable employment income and trading profit before losses, relief-at-source contributions stay in income for the annual allowance charge, and s. 192(4) raises the higher rate limit as well as the basic rate limit. The worked examples were re-run on policyengine-uk 2.148.2. diff --git a/changelog.d/704.added.md b/changelog.d/704.added.md deleted file mode 100644 index 6cd2db94ea..0000000000 --- a/changelog.d/704.added.md +++ /dev/null @@ -1 +0,0 @@ -Add a documentation page at `docs/book/programs/gov/hmrc/pension-tax-relief.md` explaining how PolicyEngine UK models personal pension tax relief (full marginal-rate reduction in taxable income via `pension_contributions_relief`, with separate annual-allowance excess charge via `personal_pension_contributions_tax`), and clarifying that the model correctly reports the *total* relief (both relief-at-source + higher-rate top-up combined) for the scenarios reported in #704. diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index 1762ca37f6..16d893b634 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -5,7 +5,7 @@ pension contributions and addresses the confusion reported in [#704](https://github.com/PolicyEngine/policyengine-uk/issues/704) about whether higher-rate taxpayers receive the right amount of relief. #704 is still open (October 2026); the figures below were re-run -on policyengine-uk 2.140.0. +on policyengine-uk 2.148.2. ## What the model does @@ -17,12 +17,13 @@ by their pension contributions, up to the annual limit for relief in - the person's relevant UK earnings ([s. 189(2)](https://www.legislation.gov.uk/ukpga/2004/12/section/189)), - which the model takes as employment income, plus employer-paid Statutory - Sick Pay and Statutory Maternity Pay (`employment_benefits`, listed as - relevant UK earnings in HMRC's + which the model takes as taxable employment income: employment income + plus employer-paid Statutory Sick Pay and Statutory Maternity Pay + (`employment_benefits`, listed as relevant UK earnings in HMRC's [PTM044100](https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm044100)), - plus self-employment profit (a trading loss counts as zero, and does not - reduce employment earnings). Statutory Paternity Pay is not yet counted; + less allowable employment expenses; plus trading profit after capital + allowances and the trading allowance but before losses (a trading loss + counts as zero, and does not reduce employment earnings). Statutory Paternity Pay is not yet counted; open pull request [#2368](https://github.com/PolicyEngine/policyengine-uk/pull/2368) would add it to taxable employment pay; @@ -46,10 +47,10 @@ PolicyEngine does not represent the £720 claim as a payment, and with no taxable income the deduction saves no income tax. Statutory Sick Pay and Statutory Maternity Pay were added to relevant earnings by [#2464](https://github.com/PolicyEngine/policyengine-uk/pull/2464), merged on -19 October 2026. One open pull request would change this section once merged: -[#2488](https://github.com/PolicyEngine/policyengine-uk/pull/2488) would apply -the same relief-at-source-only rule to the pension uplift in adjusted total -income. +19 October 2026. +[#2488](https://github.com/PolicyEngine/policyengine-uk/pull/2488), merged on +20 October 2026, applied the same relief-at-source-only rule to the pension +uplift in adjusted total income. The annual allowance does not limit the relief. `pension_annual_allowance` is the standard annual allowance (£60,000 from 6 April 2023). From 2016-17 it @@ -58,17 +59,24 @@ is tapered only when both the statutory adjusted income threshold income (`pension_annual_allowance_threshold_income`, above the taper level less the standard allowance, £200,000 from 2023-24) are over their limits, by £1 for every £2 of adjusted income above the taper level, -rounded down to whole pounds, to a minimum of £10,000 +rounded down to whole pounds, to a minimum of £10,000 (£4,000 from 2020-21 +to 2022-23) ([Finance Act 2004 s. 228ZA](https://www.legislation.gov.uk/ukpga/2004/12/section/228ZA); parameters under `gov.hmrc.income_tax.allowances.annual_allowance`). See `docs/engineering/pension-annual-allowance.md` for the income conventions. Unused allowance carried forward from the previous three tax years ([s. 228A](https://www.legislation.gov.uk/ukpga/2004/12/section/228A)) is -the input `unused_pension_annual_allowance`, which is added to the allowance -when the charge is worked out. It defaults to nil, because survey data does -not record past pension input amounts, and the model does not derive it from -earlier years. The money purchase annual allowance, the £10,000 limit on -money purchase savings after pensions are first flexibly accessed +`unused_pension_annual_allowance`, which is added to the allowance when the +charge is worked out. It can be supplied for a year. Otherwise, because +survey data does not record past pension input amounts, from 2020-21 the +model estimates it: it assumes that in each of the five previous years the +pension input and the incomes tested for the taper were this year's (times +`gov.simulation.pensions.prior_year_input_ratio`, 1, for the input), deflated +by average earnings growth, and carries forward what the last three years' +allowances leave unused, earliest first. The estimate is nil for someone with +no pension input this year, and nil before 2020-21. The money purchase +annual allowance, the £10,000 limit on money purchase savings after pensions +are first flexibly accessed ([s. 227ZA](https://www.legislation.gov.uk/ukpga/2004/12/section/227ZA)), is not modelled. @@ -78,16 +86,29 @@ separately attract the annual allowance charge, the excess at the basic, higher and additional rates on the slices that fall in each band when it is added on top of the person's income after allowances ([Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227)). +Relief-at-source contributions are not deducted from that income; for people +who would otherwise pay tax above the basic rate, they raise the rate limits +instead (s. 192(4), s. 227(4C)). So an employee on £45,000 who pays £20,000 +into a personal pension, with £50,000 of employer contributions, pays a £2,946 +charge on the £10,000 excess in 2025-26: the excess sits on top of £32,430 of +income after the personal allowance, so part of it falls in the higher rate +band. Deducting the contributions first would have given £2,000. The amount tested against the allowance is `pension_contributions_for_annual_allowance`, which counts member contributions made before age 75, employer contributions and salary sacrifice ([Finance Act 2004 s. 233](https://www.legislation.gov.uk/ukpga/2004/12/section/233)). For example, an employee on £100,000 who pays £70,000 into a personal pension in 2025-26 gets £70,000 of relief and a £2,000 charge on the £10,000 excess, -which falls in the basic rate band. With £10,000 of unused allowance +which falls in the basic rate band. The model's default estimate of unused +allowance for this person is nil, since the estimated input in each earlier +year also exceeds that year's allowance; with £10,000 of unused allowance brought forward, there is no charge. By default the pension input amount is -cash contributions: defined-benefit accrual counts only if supplied through -`pension_contributions_for_annual_allowance`. +cash contributions: `defined_benefit_pension_share` defaults to nil, which +treats every contribution as money purchase. Defined-benefit accrual counts +when that share is supplied (the accrual is then +`defined_benefit_pension_input_amount`, supplied or estimated from those +contributions), or when `defined_benefit_pension_input_amount` or +`pension_contributions_for_annual_allowance` is supplied. Relieved contributions also reduce `adjusted_net_income`, so they restore personal allowance lost above £100,000, as in law @@ -102,12 +123,12 @@ rate, plus any personal allowance restored. ## Worked examples -The four scenarios reported in #704 (all 2025-26, all self-employed, -single person aged 40, no other income, contributions entered as -`personal_pension_contributions`). The "model" column was re-run in -October 2026 on policyengine-uk 2.140.0: +The four scenarios reported in #704 (all self-employed, no other income), +re-run for 2025-26 for a single person aged 40 with contributions entered as +`personal_pension_contributions`; #704 gives no year or age. The "model" +column was re-run in October 2026 on policyengine-uk 2.148.2: -| ID | Self-employed income | Pension contribution | Expected income-tax change | What the model returns | Why | +| ID | Self-employed income | Pension contribution | Total relief as an income-tax change | What the model returns | Why | |-------|---------------------|----------------------|-----------------------------|------------------------|-----| | 11800 | £30,000 | £0 | baseline | baseline | – | | 11799 | £30,000 | £3,000 | -£600 | -£600 | £3k contribution × 20% basic rate | @@ -131,17 +152,23 @@ add up to the same total relief: from net income and the pension grows by the gross amount. For a basic-rate taxpayer, this is the *entire* relief. 2. **Higher-rate top-up**: for taxpayers at higher or additional - rates, the extra band difference (20% for higher rate, 25% for - additional) is reclaimed via Self Assessment. The mechanism is - technically a **basic-rate-band extension**: HMRC widens the basic - rate band by the gross contribution, pushing income that would - otherwise be taxed at the higher rate down into the basic band. - -PolicyEngine computes the **total** relief (both mechanisms together) -because it operates on annual aggregates rather than walking the -cash-flow steps. That matches HMRC's published statistics on the -*fiscal cost of pension tax relief*, which also report the total -across both mechanisms. + rates, the extra relief (in England, Wales and Northern Ireland, 20% + for higher rate and 25% for additional rate) is claimed through Self + Assessment or directly from HMRC. The mechanism is technically a + **rate-band extension**: the basic rate limit and the higher rate + limit are both raised by the gross contribution + ([Finance Act 2004 s. 192(4)](https://www.legislation.gov.uk/ukpga/2004/12/section/192)), + pushing income that would otherwise be taxed at the higher or + additional rate down a band. + +PolicyEngine computes the **total** relief (both mechanisms together) as a +reduction in income tax, because it operates on annual aggregates rather +than walking the cash-flow steps. The exception is basic-rate relief at +source on contributions above the person's taxable income, such as the £720 +on a non-taxpayer's £3,600 contribution: the provider still claims it, but +the model has no tax to reduce. Otherwise this matches HMRC's published +statistics on the *fiscal cost of pension tax relief*, which also report the +total across both mechanisms. If you want to see the user-visible tax bill reduction separately from the pension-provider's RAS claim, you'd need to split the existing @@ -154,7 +181,8 @@ than a calculation question: the totals are unchanged. #704 also reported a 0% marginal tax rate where 20% or 40% was expected. The model's `marginal_tax_rate` variable ([`variables/household/marginal_tax_rate.py`](https://github.com/PolicyEngine/policyengine-uk/blob/main/policyengine_uk/variables/household/marginal_tax_rate.py)) -raises each adult's `employment_income` by +raises the `employment_income` of each of the household's two eldest adults +in turn (`gov.simulation.marginal_tax_rate_adults`) by `gov.simulation.marginal_tax_rate_delta` (£1,000, or 0.1% of employment income where that is larger) and measures the share of the rise that does not reach `household_net_income`. Re-run in October 2026, it returns From 85e04609380cfd034197cf1d6412d7445ab1121e Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 03:12:47 -0400 Subject: [PATCH 5/7] Explain the s. 192(4) condition and correct the defined-benefit route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit From the independent review of the corrections: - The £45,000 example's £2,946 arises because s. 192(4)'s condition fails (income below the basic rate limit), so the limits are not raised; HMRC's PTM056120 states no such condition and would give £2,000. The page now says the model follows the statute (as docs/engineering/gift-aid.md does). - defined_benefit_pension_input_amount must be supplied with defined_benefit_pension_share; alone it double counts, and a share alone changes nothing (defined_benefit_input_per_contribution is 1). - The model also gives less than the 20% relief at source on contributions coming off income taxed below 20% (dividends, the Scottish starter band). - The carry-forward estimate applies s. 228A(7) to each earlier excess. Co-Authored-By: Claude Opus 5.5 --- ...ion-tax-relief-page-corrections.changed.md | 2 +- .../programs/gov/hmrc/pension-tax-relief.md | 55 +++++++++++++------ 2 files changed, 39 insertions(+), 18 deletions(-) diff --git a/changelog.d/704-pension-tax-relief-page-corrections.changed.md b/changelog.d/704-pension-tax-relief-page-corrections.changed.md index fcd0e79b37..9625acf6e2 100644 --- a/changelog.d/704-pension-tax-relief-page-corrections.changed.md +++ b/changelog.d/704-pension-tax-relief-page-corrections.changed.md @@ -1 +1 @@ -Brought the pension tax relief page (`docs/book/programs/gov/hmrc/pension-tax-relief.md`) up to date with main: #2488 has merged, unused annual allowance is now estimated from 2020-21 rather than defaulting to nil, defined-benefit accrual counts through `defined_benefit_pension_share`, relevant UK earnings follow taxable employment income and trading profit before losses, relief-at-source contributions stay in income for the annual allowance charge, and s. 192(4) raises the higher rate limit as well as the basic rate limit. The worked examples were re-run on policyengine-uk 2.148.2. +Brought the pension tax relief page (`docs/book/programs/gov/hmrc/pension-tax-relief.md`) up to date with main: #2488 has merged, unused annual allowance is now estimated from 2020-21 rather than defaulting to nil, defined-benefit accrual can be supplied as `defined_benefit_pension_input_amount`, with `defined_benefit_pension_share` for the workplace contributions it replaces, relevant UK earnings follow taxable employment income and trading profit before losses, relief-at-source contributions stay in income for the annual allowance charge and raise its rate limits only under the s. 192(4) condition, which HMRC's PTM056120 does not state, and s. 192(4) raises the higher rate limit as well as the basic rate limit. The worked examples were re-run on policyengine-uk 2.148.2. diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index 16d893b634..c804d4eed9 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -73,7 +73,8 @@ model estimates it: it assumes that in each of the five previous years the pension input and the incomes tested for the taper were this year's (times `gov.simulation.pensions.prior_year_input_ratio`, 1, for the input), deflated by average earnings growth, and carries forward what the last three years' -allowances leave unused, earliest first. The estimate is nil for someone with +allowances leave unused, after each year's excess has used the unused +allowance of the three years before it, earliest first (s. 228A(7)). The estimate is nil for someone with no pension input this year, and nil before 2020-21. The money purchase annual allowance, the £10,000 limit on money purchase savings after pensions are first flexibly accessed @@ -86,13 +87,24 @@ separately attract the annual allowance charge, the excess at the basic, higher and additional rates on the slices that fall in each band when it is added on top of the person's income after allowances ([Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227)). -Relief-at-source contributions are not deducted from that income; for people -who would otherwise pay tax above the basic rate, they raise the rate limits -instead (s. 192(4), s. 227(4C)). So an employee on £45,000 who pays £20,000 -into a personal pension, with £50,000 of employer contributions, pays a £2,946 -charge on the £10,000 excess in 2025-26: the excess sits on top of £32,430 of -income after the personal allowance, so part of it falls in the higher rate -band. Deducting the contributions first would have given £2,000. +Relief-at-source contributions are not deducted from that income. Under +s. 192(4) they raise the basic and higher rate limits instead, but only for +someone whose income other than savings and dividends would otherwise be +taxed at the higher or additional rate (for a Scottish taxpayer, at a +Scottish rate above the basic rate); s. 227(4C) then applies the raised +limits to the charge, and the excess itself does not count towards that test +(s. 227(5)). So an employee on £45,000 who pays £20,000 gross into a personal +pension, with £50,000 of employer contributions, pays a £2,946 charge on the +£10,000 excess in 2025-26: the excess sits on top of £32,430 of income after +the personal allowance, which is below the £37,700 basic rate limit, so the +limits are not raised and £4,730 of the excess falls in the higher rate +band. Paid through a net pay arrangement, the same contributions would be +deducted first and the charge would be £2,000. HMRC's +[PTM056120](https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm056120) +describes the limits as raised by any relief-at-source contribution, without +the s. 192(4) condition, and says the charge is the same whichever way the +contribution is paid; on that reading this charge would also be £2,000. The +model follows the statutory condition. The amount tested against the allowance is `pension_contributions_for_annual_allowance`, which counts member contributions made before age 75, employer contributions and salary @@ -104,11 +116,16 @@ allowance for this person is nil, since the estimated input in each earlier year also exceeds that year's allowance; with £10,000 of unused allowance brought forward, there is no charge. By default the pension input amount is cash contributions: `defined_benefit_pension_share` defaults to nil, which -treats every contribution as money purchase. Defined-benefit accrual counts -when that share is supplied (the accrual is then -`defined_benefit_pension_input_amount`, supplied or estimated from those -contributions), or when `defined_benefit_pension_input_amount` or -`pension_contributions_for_annual_allowance` is supplied. +treats every contribution as money purchase. To count defined-benefit +accrual, supply `defined_benefit_pension_input_amount` (for example from a +pension savings statement) together with `defined_benefit_pension_share`, the +share of workplace contributions it replaces; without the share it is added +on top of contributions that still count as money purchase. A share supplied +alone leaves the total unchanged before age 75, since the input amount is +then estimated as those contributions times +`gov.simulation.pensions.defined_benefit_input_per_contribution` (1). +Supplying `pension_contributions_for_annual_allowance` overrides the whole +total. Relieved contributions also reduce `adjusted_net_income`, so they restore personal allowance lost above £100,000, as in law @@ -163,10 +180,14 @@ add up to the same total relief: PolicyEngine computes the **total** relief (both mechanisms together) as a reduction in income tax, because it operates on annual aggregates rather -than walking the cash-flow steps. The exception is basic-rate relief at -source on contributions above the person's taxable income, such as the £720 -on a non-taxpayer's £3,600 contribution: the provider still claims it, but -the model has no tax to reduce. Otherwise this matches HMRC's published +than walking the cash-flow steps. It gives less than the law where +basic-rate relief at source is worth more than the tax the deduction saves: +on contributions above the person's taxable income, such as the £720 on a +non-taxpayer's £3,600 contribution, and on contributions that come off +income taxed below 20%, such as dividends at the dividend ordinary rate or a +Scottish taxpayer's starter rate band. The provider still claims 20% in those +cases (s. 192(1)-(3)), but the model has less or no tax to reduce. Otherwise +this matches HMRC's published statistics on the *fiscal cost of pension tax relief*, which also report the total across both mechanisms. From a204a987d07d2373d6e6d7639e00a9e194208c9b Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 03:48:52 -0400 Subject: [PATCH 6/7] State the s. 192(4) condition precisely and where the model over-relieves MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Second-round review, checked against FA 2004 s. 192(4)-(4A) and a household run on main: - s. 192(4) turns on tax at the higher or additional rate, so savings (from 2017-18) and dividends do not count, and the model also leaves out property income from 2027-28 (private_pension_contributions_tax.py); Scottish limits are raised under s. 192(4A). - Where only savings or dividends sit above the basic rate limit the model's deduction gives more than the 20% relief at source: £15,000 pay and £60,000 dividends with £10,000 gross contributions saves £3,648 in the model (2025-26) against £2,000 in law. - Re-wrapped two long lines. Co-Authored-By: Claude Opus 5.5 --- .../programs/gov/hmrc/pension-tax-relief.md | 35 ++++++++++++------- 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index c804d4eed9..8e2c673b5e 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -23,8 +23,8 @@ by their pension contributions, up to the annual limit for relief in [PTM044100](https://www.gov.uk/hmrc-internal-manuals/pensions-tax-manual/ptm044100)), less allowable employment expenses; plus trading profit after capital allowances and the trading allowance but before losses (a trading loss - counts as zero, and does not reduce employment earnings). Statutory Paternity Pay is not yet counted; - open pull request + counts as zero, and does not reduce employment earnings). Statutory + Paternity Pay is not yet counted; open pull request [#2368](https://github.com/PolicyEngine/policyengine-uk/pull/2368) would add it to taxable employment pay; - raised towards `gov.hmrc.income_tax.reliefs.pension_contribution.basic_amount` @@ -74,8 +74,9 @@ pension input and the incomes tested for the taper were this year's (times `gov.simulation.pensions.prior_year_input_ratio`, 1, for the input), deflated by average earnings growth, and carries forward what the last three years' allowances leave unused, after each year's excess has used the unused -allowance of the three years before it, earliest first (s. 228A(7)). The estimate is nil for someone with -no pension input this year, and nil before 2020-21. The money purchase +allowance of the three years before it, earliest first (s. 228A(7)). The +estimate is nil for someone with no pension input this year, and nil before +2020-21. The money purchase annual allowance, the £10,000 limit on money purchase savings after pensions are first flexibly accessed ([s. 227ZA](https://www.legislation.gov.uk/ukpga/2004/12/section/227ZA)), @@ -89,12 +90,15 @@ in each band when it is added on top of the person's income after allowances ([Finance Act 2004 s. 227](https://www.legislation.gov.uk/ukpga/2004/12/section/227)). Relief-at-source contributions are not deducted from that income. Under s. 192(4) they raise the basic and higher rate limits instead, but only for -someone whose income other than savings and dividends would otherwise be -taxed at the higher or additional rate (for a Scottish taxpayer, at a -Scottish rate above the basic rate); s. 227(4C) then applies the raised -limits to the charge, and the excess itself does not count towards that test -(s. 227(5)). So an employee on £45,000 who pays £20,000 gross into a personal -pension, with £50,000 of employer contributions, pays a £2,946 charge on the +someone with income that would otherwise be taxed at the higher or additional +rate. Savings from 2017-18, dividends and, from 2027-28, property income have +their own rates and do not count. For a Scottish taxpayer, s. 192(4A) raises +the Scottish basic rate limit and the limits above it where non-savings income +would otherwise be taxed at a Scottish rate above the basic rate. +Section 227(4C) then applies the raised limits to the charge, and the excess +itself does not count towards that test (s. 227(5)). So an employee on +£45,000 who pays £20,000 gross into a personal pension, with £50,000 of +employer contributions, pays a £2,946 charge on the £10,000 excess in 2025-26: the excess sits on top of £32,430 of income after the personal allowance, which is below the £37,700 basic rate limit, so the limits are not raised and £4,730 of the excess falls in the higher rate @@ -186,8 +190,15 @@ on contributions above the person's taxable income, such as the £720 on a non-taxpayer's £3,600 contribution, and on contributions that come off income taxed below 20%, such as dividends at the dividend ordinary rate or a Scottish taxpayer's starter rate band. The provider still claims 20% in those -cases (s. 192(1)-(3)), but the model has less or no tax to reduce. Otherwise -this matches HMRC's published +cases (s. 192(1)-(3)), but the model has less or no tax to reduce. It gives +more than the law where only savings or dividends would be taxed above the +basic rate limit: s. 192(4) then raises no limits, so the relief is the 20% +the provider claims, while the model's deduction saves tax at the savings or +dividend rates. An employee on £15,000 with £60,000 of dividends who pays +£10,000 gross into a personal pension saves £3,648 of income tax in the model +in 2025-26, against £2,000 of relief at source in law (raising the limits +regardless of the condition would give £4,500). Otherwise this matches +HMRC's published statistics on the *fiscal cost of pension tax relief*, which also report the total across both mechanisms. From 87eaa7b59d13d4e7dde95571851702f7c8517d82 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 23 Oct 2026 04:07:19 -0400 Subject: [PATCH 7/7] Show the model can give more or less than the law, and qualify the totals MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Third-round review, re-run on main: where only dividends sit above the basic rate limit the model's saving can exceed the 20% in law (£15,000 pay and £60,000 dividends: £3,648 against £2,000) or fall short of it (£12,000 and £40,000: £1,307.50). The headline, the "full marginal rate" sentence, the two-mechanism section and the presentation note now hold only for income taxed at one rate; s. 192(4A) wording follows the statute. Co-Authored-By: Claude Opus 5.5 --- .../programs/gov/hmrc/pension-tax-relief.md | 53 +++++++++++-------- 1 file changed, 31 insertions(+), 22 deletions(-) diff --git a/docs/book/programs/gov/hmrc/pension-tax-relief.md b/docs/book/programs/gov/hmrc/pension-tax-relief.md index 8e2c673b5e..b2636f48a7 100644 --- a/docs/book/programs/gov/hmrc/pension-tax-relief.md +++ b/docs/book/programs/gov/hmrc/pension-tax-relief.md @@ -94,7 +94,7 @@ someone with income that would otherwise be taxed at the higher or additional rate. Savings from 2017-18, dividends and, from 2027-28, property income have their own rates and do not count. For a Scottish taxpayer, s. 192(4A) raises the Scottish basic rate limit and the limits above it where non-savings income -would otherwise be taxed at a Scottish rate above the basic rate. +would otherwise be taxed at a Scottish rate above the Scottish basic rate. Section 227(4C) then applies the raised limits to the charge, and the excess itself does not count towards that test (s. 227(5)). So an employee on £45,000 who pays £20,000 gross into a personal pension, with £50,000 of @@ -138,9 +138,10 @@ An employee on £110,000 has a £7,570 personal allowance in 2025-26, and the full £12,570 if they pay £10,000 gross into a personal pension. So the headline behaviour is: **up to the relief limit, pension -contributions reduce taxable income £1-for-£1**. The income-tax saving -that the model reports is the contribution × the person's marginal -rate, plus any personal allowance restored. +contributions reduce taxable income £1-for-£1**. Where the deduction comes +off one kind of income taxed at one rate, as in the worked examples below, +the income-tax saving that the model reports is the contribution × the +person's marginal rate, plus any personal allowance restored. ## Worked examples @@ -158,24 +159,27 @@ column was re-run in October 2026 on policyengine-uk 2.148.2: This is exactly the behaviour reported. The user's expectation that higher-rate cases should only see -£1,200 (£6k × 20%) corresponds to a -misunderstanding of how UK pension tax relief works in aggregate: the -total tax relief is full marginal rate, even though it is paid in two +misunderstanding of how UK pension tax relief works in aggregate: for +someone like this, whose taxable income is at least the contribution and is +all taxed at the basic, higher or additional rate, the total tax relief is +the full marginal rate, even though it is paid in two parts in the real world (relief at source plus higher-rate top-up via Self Assessment). ## Relief at source vs marginal-rate relief The user-facing UK pension framework has two parallel mechanisms that -add up to the same total relief: +together make up the total relief: 1. **Relief at source (RAS)**: the pension provider claims the basic-rate portion (20%) directly from HMRC. The contributor pays from net income and the pension grows by the gross amount. For a basic-rate taxpayer, this is the *entire* relief. -2. **Higher-rate top-up**: for taxpayers at higher or additional - rates, the extra relief (in England, Wales and Northern Ireland, 20% - for higher rate and 25% for additional rate) is claimed through Self - Assessment or directly from HMRC. The mechanism is technically a +2. **Higher-rate top-up**: for taxpayers with income taxed at the higher + or additional rate itself (not at the savings, dividend or property + rates; see above), the extra relief (in England, Wales and Northern + Ireland, 20% for higher rate and 25% for additional rate) is claimed + through Self Assessment or directly from HMRC. The mechanism is technically a **rate-band extension**: the basic rate limit and the higher rate limit are both raised by the gross contribution ([Finance Act 2004 s. 192(4)](https://www.legislation.gov.uk/ukpga/2004/12/section/192)), @@ -190,23 +194,28 @@ on contributions above the person's taxable income, such as the £720 on a non-taxpayer's £3,600 contribution, and on contributions that come off income taxed below 20%, such as dividends at the dividend ordinary rate or a Scottish taxpayer's starter rate band. The provider still claims 20% in those -cases (s. 192(1)-(3)), but the model has less or no tax to reduce. It gives -more than the law where only savings or dividends would be taxed above the -basic rate limit: s. 192(4) then raises no limits, so the relief is the 20% -the provider claims, while the model's deduction saves tax at the savings or -dividend rates. An employee on £15,000 with £60,000 of dividends who pays -£10,000 gross into a personal pension saves £3,648 of income tax in the model -in 2025-26, against £2,000 of relief at source in law (raising the limits -regardless of the condition would give £4,500). Otherwise this matches -HMRC's published +cases (s. 192(1)-(3)), but the model has less or no tax to reduce. Where +the only income that would be taxed above the basic rate limit is savings +(from 2017-18), dividends or (from 2027-28) property income, s. 192(4) raises +no limits, so the relief in law is the 20% the provider claims, while the +model's deduction saves tax at the rates of the income it removes. The model +can then give more or less than the law. An employee on £15,000 with £60,000 +of dividends who pays £10,000 gross into a personal pension saves £3,648 of +income tax in the model in 2025-26, against £2,000 of relief at source in law +(raising the limits regardless of the condition would give £4,500: the +£2,000 plus £2,500 less tax on dividends moved from the 33.75% upper rate to +the 8.75% ordinary rate). With £12,000 of earnings and £40,000 of dividends, +the same contribution saves £1,308 in the model, below the £2,000 in law. +Otherwise this matches HMRC's published statistics on the *fiscal cost of pension tax relief*, which also report the total across both mechanisms. If you want to see the user-visible tax bill reduction separately from the pension-provider's RAS claim, you'd need to split the existing relief into two output variables (a basic-rate-portion and a -higher-rate-top-up portion). This is a presentation question rather -than a calculation question: the totals are unchanged. +higher-rate-top-up portion). Outside the cases above where the model's +total differs from the law, this is a presentation question rather than a +calculation question: the totals are unchanged. ## Marginal tax rate display