PolicyEngine / PolicyEngine/policyengine-uk

Starting rate for savings: band is not tapered until other income exceeds £30,140; should taper from the Personal Allowance (£12,570)

Open
#1,799 0 comments 0 reactions 0 assignees View on GitHub

Nobody has claimed this yet.

Dominant language
Python
Stars
50
Forks
33
Avg merge
20h 58m
Merged PRs (30d)
14

Description

Summary

The savings starting rate band (£5,000) is not being reduced by non-savings income above the Personal Allowance. Empirically, the taper does not begin until non-savings income reaches £30,140, and completes at £35,140.

Under HMRC rules the band should taper from the Personal Allowance (£12,570) and be fully exhausted at £17,570.

The effect is that PolicyEngine grants the full £5,000 starting rate band to taxpayers who are not entitled to any of it, understating their income tax.

The rule

GOV.UK — Tax on savings interest:

Starting rate for savings
You may also get up to £5,000 of interest and not have to pay tax on it. This is your starting rate for savings.
The more you earn from other income (for example your wages or pension), the less your starting rate for savings will be.
If your other income is £17,570 or more — You're not eligible for the starting rate for savings.
If your other income is less than £17,570 — Your starting rate for savings is a maximum of £5,000. Every £1 of other income above your Personal Allowance reduces your starting rate for savings by £1.

Legislation: Income Tax Act 2007, s.12 (the starting rate limit for savings) and s.12(3) (the reduction). PolicyEngine already references ITA 2007 s.11D and s.12B elsewhere in the income-tax module.

So:

SRB = max(0, 5_000 - max(0, other_income - PERSONAL_ALLOWANCE))

Observed behaviour

PolicyEngine appears to compute:

SRB = max(0, 5_000 - max(0, other_income - 30_140))

The taper threshold is £30,140 instead of £12,570 — a shift of exactly £17,570 (the point at which the band should be fully exhausted).

This formula reproduces PolicyEngine's output at every point tested (11 income levels, exact match).

Reproduction

savings_income_tax for a person aged 55, England, tax year 2026, varying non-savings income and savings interest.

(Identical results with employment_income and with private_pension_income — the income type is not a factor.)

other income savings interest PE savings_income_tax correct (HMRC) PE's implied SRB correct SRB
£14,000 £6,000 £0 £286 £5,000 £3,570
£20,000 £4,000 £0 £600 £5,000 £0
£25,000 £4,000 £0 £600 £5,000 £0
£30,000 £4,000 £0 £600 £5,000 £0
£33,000 £4,000 £172 £600 £2,140 £0
£35,000 £1,400 £52 £80 £140 £0
£36,000 £4,000 £600 £600 £0 £0
£40,000 £1,400 £80 £80 £0 £0

The clearest case is £30,000 of other income: the taxpayer is well above the £17,570 cut-off and is entitled to no starting rate band at all, but PolicyEngine grants the full £5,000 and charges £0 tax on £4,000 of savings interest. The correct figure is £600.

Below the £30,140 threshold PolicyEngine's answers are correct only by coincidence, where the Personal Allowance and PSA happen to cover the interest anyway.

Minimal reproduction
curl -s -X POST https://api.policyengine.org/uk/calculate \
  -H 'Content-Type: application/json' \
  -d '{
    "household": {
      "people": { "person": {
        "age":                     { "2026": 55 },
        "employment_income":       { "2026": 30000 },
        "savings_interest_income": { "2026": 4000 },
        "savings_income_tax":      { "2026": null }
      }},
      "benunits":   { "benunit":   { "members": ["person"] } },
      "households": { "household": { "members": ["person"] } }
    },
    "policy": {}
  }'

Returns savings_income_tax: 0. Expected: 600.

(£4,000 interest; starting rate band = £0 at this income; PSA = £1,000; so £3,000 taxable at the basic rate of 20% = £600.)

Likely cause

£30,140 = £12,570 + £17,570 — the Personal Allowance plus the point at which the band is fully exhausted.

This is consistent with the £17,570 figure having been implemented as a deduction applied on top of the Personal Allowance, rather than as the income level at which the band reaches zero. In the HMRC guidance £17,570 is a consequence of the taper (PA £12,570 + band £5,000), not an input to it.

I have not located the exact line in the source, so treat this as a hypothesis — the observed threshold of £30,140 is the finding; this is only the most plausible explanation for it.

Impact

The affected range is roughly £12,570 to £35,140 of non-savings income — i.e. basic-rate taxpayers with modest incomes, including many pensioners. This is precisely the group the starting rate for savings exists to help, and precisely the group whose tax liability PolicyEngine currently understates.

Environment

  • API: https://api.policyengine.org/uk/calculate
  • Tax year: 2026
  • Region: England (no region set; also reproduced with LONDON)
  • Date observed: 13 July 2026

Contributor guide

Open the contributing guide

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Research direction

Start by tracing the savings_income_tax entry point in the UK income-tax module and reproduce the reported £30,000-income case with the provided API request. Done means the starting rate band tapers from the Personal Allowance and the reproduction returns £600 rather than £0, while the cited HMRC rules remain satisfied.

Written by the indexing model from the issue text.

Assessment

Tech stack
python
Domain
fintech-quant
Issue type
Bug
Difficulty
3/5
Estimated time
1-2 days
Activity status
Quiet
Clarity
Mostly clear
Newbie friendliness
64/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.