Skip to content

UC earned income deducts the whole benefit unit's tax, including tax on pensions and other unearned income #1942

Description

@MaxGhenis

Problem

uc_earned_income (policyengine_uk/variables/gov/dwp/universal_credit/income/uc_earned_income.py) subtracts benunit_tax from gross earnings:

disregards = add(benunit, period, ["uc_work_allowance", "benunit_tax", "pension_contributions"])
return max_(0, personal_gross_earned_income - disregards)

benunit_tax sums tax (income tax + NI) over every member of the benefit unit, on all their income. So income tax on State Pension, private pensions, property, savings or dividend income is taken off the unit's earnings. It is also taken off earnings of a member who did not pay it. Tax paid by a pensioner on their pension reduces their partner's earned income, so the 55% taper bites less and UC is overstated.

Law (legislation.gov.uk, read 2026-09-30)

UC Regs 2013 reg 55(5) (https://www.legislation.gov.uk/uksi/2013/376/regulation/55):

In calculating the amount of a person's employed earnings in respect of an assessment period, there are to be deducted from the amount of general earnings or benefits specified in paragraphs (2) to (4)— (a) any relievable pension contributions made by the person in that period; (b) any amounts paid by the person in that period in respect of the employment by way of income tax or primary Class 1 contributions under section 6(1) of the Contributions and Benefits Act; and (c) any sums withheld as donations to an approved scheme under Part 12 of ITEPA (payroll giving) ...

UC Regs 2013 reg 57(2), step 3 (https://www.legislation.gov.uk/uksi/2013/376/regulation/57):

Deduct from the amount resulting from step 1 or (if applicable) step 2 any payment made by the person to HMRC in the assessment period by way of national insurance contributions or income tax in respect of any trade, profession or vocation carried on by the person.

The deductions are per person and limited to tax "in respect of the employment" or trade. Tax on unearned income is not deductible, and one person's tax cannot come off another person's earnings. The unearned income itself counts gross: reg 66(1) with reg 22(1)(a) deducts "all" of it.

Counterexample (2026, current main, verified)

Household Couple renting from the council, rent £20,000
Pensioner, aged 70 State Pension £16,000, so income tax (16,000 − 12,570) × 20% = £686
Partner, aged 45 Earnings £13,000, so income tax £86 and NI £34.40 (no marriage allowance, since the partner is above the personal allowance)

By law (with State Pension counted as unearned income, see the linked PR):

  • earned income = 13,000 − 86 − 34.40 = 12,879.60;
  • maximum amount = 8,003.64 + 20,000 = 28,003.64;
  • UC = 28,003.64 − (0.55 × 12,879.60 + 16,000) = £4,919.86.

The model deducts benunit_tax = 806.40:

  • uc_earned_income = 12,193.60;
  • UC = £5,297.16.

That is £377.30 too much, which is 0.55 × the pensioner's £686.

The same happens for a single claimant with earnings and taxable property, savings, dividend or private pension income. Their tax on that income comes off their earnings.

It also breaks a basic invariant. On main, which does not yet count State Pension as UC unearned income, UC rises with State Pension for a mixed-age couple where the pensioner pays tax and the partner has earnings above the work allowance.

Fix sketch

  • Deduct, per person, only the income tax and NI attributable to that person's employment and self-employment.
    • NI is all attributable: Class 1 employee to employment; Class 2/4 to the trade.
    • Income tax needs an attribution rule, for example tax on all income minus tax computed without earnings, following the ITA 2007 s.16 ordering (non-savings income before savings and dividends).
  • Apply the work allowance after that, then the taper.

The fix needs:

  • a real Enhanced FRS impact run;
  • YAML tests hand-computed from reg 55(5) / 57;
  • property tests (the xfail in test_uc_state_pension_properties.py from the State Pension PR flips to pass);
  • the Axiom mirror (rulespec-uk reg 55/57 modules) per the parity rule.

Found by the pound-for-pound property test while building the State Pension fix (branch uc-state-pension-unearned-income).

Activity

  1. MaxGhenis commented on Sep 30, 2026

    @MaxGhenis
    CollaboratorAuthor

    Pinned by a strict xfail in #1943 (test_tax_on_state_pension_does_not_reduce_partners_earned_income in policyengine_uk/tests/test_uc_state_pension_properties.py). When this is fixed, remove the xfail marker and widen the pound-for-pound and property-income equivalence properties there to families with earnings.

  2. added 2 commits that reference this issue on Sep 30, 2026
  3. added 3 commits that reference this issue on Oct 1, 2026
  4. added 2 commits that reference this issue on Oct 2, 2026
  5. added 3 commits that reference this issue on Oct 2, 2026
  6. added 2 commits that reference this issue on Oct 2, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions