Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

State Pension

The State Pension is modelled in PolicyEngine UK as four composable person-level variables, summed into the state_pension aggregate that flows into household benefits. This page describes the current model and the residual aggregate gap against OBR outturn tracked under #1632.

Components

Four variables under gov/dwp/:

The survey records the State Pension in payment. For Family Resources Survey respondents, state_pension_reported is the benefits table’s weekly State Pension amount (benefit code 5) times 52, and policyengine-uk-data maps no separate code for the age addition (datasets/frs.py), so the model assumes the reported amount of a basic State Pension recipient over 80 includes it. state_pension_reported_excluding_age_addition takes the data year’s addition off, at the legislated 25p from 80, and the other three components split what is left. The addition is part of state_pension, so it is taxed and means-tested as the pension is. It is an increase of the pension (s.79(1)), so the model taxes it with the pension it increases: ITEPA 2003 s.577 charges the retirement pensions under SSCBA 1992 ss.44, 48A to 48BB, 51 and 78 as pension income, without naming s.79, and s.677 does not exempt the age addition (the pre-2003 charge in ICTA 1988 s.617(1) reached every benefit under Parts II to IV of the 1992 Act not excepted, and the age addition was not excepted). Pension Credit counts it as retirement pension income (State Pension Credit Act 2002 s.16(1)(e)), as do Universal Credit (Universal Credit Regulations 2013 regs 66(1)(a) and 67) and pension-age Housing Benefit (Housing Benefit (State Pension Credit) Regulations 2006 reg 29(1)(c)). It never reduces Carer’s Allowance: an age addition is adjusted only by reference to another age addition (Overlapping Benefits Regulations 1979 reg 4(3) and Sch 1 row 4), so overlapping_state_pension leaves it out. It does reduce Scotland’s Carer Support Payment: that payment overlaps with a Retirement Pension, defined as “a pension payable under Part II and Part III of the 1992 Act, excluding any additional pension or graduated retirement benefit” (SSI 2023/302 reg 16(3)(a) and (6)), and the age addition is in Part III. So carer_support_payment_overlapping_state_pension keeps it in.

Two edges. A basic State Pension recipient over 80 whose reported amount is below the addition (under 25p a week) has a reported amount of nil once the addition is taken off, and is paid the £13 a year, which is more than they reported. And the contributed gov.contrib.cec.state_pension_increase reform scales state_pension as a whole, age addition included, although no Up-rating Order raises the age addition.

The basic, new and additional State Pension split the amount a person reported in the data year (the dataset’s first year), less any age addition, by the person’s state_pension_type in the year simulated, for anyone over State Pension age:

That follows the law. Each year’s Up-rating Order applies the triple lock to the full rates; the statutory minimum is earnings growth (Social Security Administration Act 1992 s.150A). The Order raises additional pensions (s.150(1)(c)), increments for deferring the pension and the amounts of new State Pension above the full rate (protected payments, s.151A) by the September CPI of the year before. In April 2026 the full rates rose 4.8% and the rest 3.8% (Social Security Benefits Up-rating Order 2026, articles 4(2), 4(3), 6(1) and 6(3)); in April 2025, 4.1% and 1.7% (2025 Order, the same articles). Graduated retirement benefit, paid with the pension, also rose by September CPI (article 11 of each Order). Until the fix for #1941 the model uprated the part above the full rate by the full rate too.

For the years the Up-rating Orders cover (to April 2026), the model reproduces each Order’s percentage exactly. For later years the Act sets a floor, not a rate: the Order must raise additional pensions “by a percentage not less than” the rise in prices (s.150(2)), and protected payments by no less (s.151A(3)). The model pays exactly September CPI, the floor and what every Order has given. A reform that raises the part above the full rate by more has no parameter to set; it needs a reform to this variable.

One simplification remains: additional pension inside a reported total below the full basic rate is not separated, so it is uprated with the full rate (as overlapping_state_pension also notes).

So a reform to the full rates, or to the triple lock, moves only basic and new State Pension. A reform that sets a full rate to zero leaves additional pensions and protected payments in place; gov.contrib.abolish_state_pension removes all State Pension. The September CPI index is read from the simulation’s own parameters, so a scenario applied before the data load that changes September CPI, or the calendar-year CPI growth its forecast follows, moves the part above the full rate.

Survey ages are held fixed in the years a dataset is projected to, so a record’s birth cohort moves one year later for each year projected, and its type can change: a man aged 75 in the 2024-25 data reached State Pension age in 2014, on the basic State Pension, but a man aged 75 in 2030-31 reached it in 2021, on the new State Pension. Until the fix for #1921, additional_state_pension used the data year’s type while the other two used the year’s, so for records like his the part of the reported amount between the basic and new flat rates was paid twice. The records keep their reported amounts: a record that moves to a new State Pension cohort is not given a new State Pension award. That is one reason the model’s State Pension per recipient grows more slowly than DWP’s (see Known aggregate gap below).

The flag-up split (state_pension_type) is settled by PR #1618: classification is based on whether the person reaches State Pension age before or on/after 6 April 2016. A computed state_pension_type is NONE below State Pension age, so no component is paid there.

State Pension age

State Pension age depends on date of birth. Pensions Act 1995 Schedule 4 paragraph 1 sets it for each birth period, either as an age or as the day on which it is attained, and the Pensions Act 2014 s.26 raises it from 66 to 67 for people born on or after 6 April 1960: 66 years and 1 to 11 months for births from 6 April 1960 to 5 March 1961, and 67 from 6 March 1961. The parameters under gov/dwp/state_pension/age/ encode that timetable row by row:

A person attains State Pension age on the later of the two. The model places each person’s date of birth with age and months_since_last_birthday, which counts months since their last birthday on 6 October, the middle of the fiscal year. date_of_birth holds the resulting day (as a YYYYMMDD number), which other date-of-birth rules also read, such as the 6 April 2017 cutoffs in Universal Credit, Child Tax Credit and Pension Credit:

Simulations of a household situation take a whole age to be the middle of the year of age (six months since the birthday); a fractional age is read as the exact age on 6 October, overriding months_since_last_birthday even when another person supplies birthday months. The default implies a birth date of 6 April: an entered age of 66 is above State Pension age at the 6 October check in 2026-27 and below it in 2027-28. Set a fractional age or months_since_last_birthday to specify a different inferred birth date, or set date_of_birth directly (a YYYYMMDD number, with age as the age on 6 October): state_pension_age, months_since_state_pension_age, is_SP_age, the State Pension Credit qualifying age and its attainment, and the Savings Credit age test then all follow that day. A value that is not a calendar date, or that gives a different age, raises an error. Survey microdata records whole years only, so in simulations built from data, including a region or constituency filtered from it, each single year of age and sex is spread evenly over the year by weight, and filter_dataset carries each person’s place into a household it extracts. The weighted share of each age over State Pension age then matches the statute: three quarters of 66-year-olds in 2026-27, a quarter in 2027-28 and none from 2028-29.

Other programmes test State Pension age in two ways:

A person attains an age at the start of the anniversary of their birth (Family Law Reform Act 1969 s.9(1)), and an age of “N years and M months” on the same day of the month, or the month’s last day where that day does not exist; that also gives the three days rule (7A) sets. A reform can change the age or day of any row, or where a row starts; a new phase-in that needs extra rows, such as bringing forward the rise to 68, needs new rows in the parameter files.

The removed scalar parameters gov.dwp.state_pension.age.male and .female remain discoverable in metadata as migration nodes: explicit root get_child lookups, updates, and scalar value-history reads for saved API policies raise an error naming the birth-date scales above. The male.age and male.born_before children remain available for the earlier male cohorts. For example, reform gov.dwp.state_pension.age.age_by_birth_date[14].amount to change the age in months for births from 6 March 1961 until the next bracket; read individual eligibility from is_SP_age or the individual threshold from state_pension_age.

Uprating

State Pension flat-rate parameters live in gov/dwp/state_pension/basic_state_pension/amount.yaml and gov/dwp/state_pension/new_state_pension/amount.yaml. Published rates run to 2026-27. Each later April, create_rate_projection.py raises the previous year’s rate by that year’s growth in gov.economic_assumptions.indices.triple_lock, built from the yearly rates in gov.economic_assumptions.yoy_growth.triple_lock, and rounds the result to the nearest 5p (gov.dwp.state_pension.weekly_rate_rounding). The Up-rating Orders round the full rates the same way (Explanatory Memorandum to SI 2020/234, paragraph 7.17), and the previous published rate, uprated and rounded to the nearest 5p, gives every published basic rate from April 2011 and every full new rate from April 2017 (policyengine_uk/tests/test_triple_lock_outturn.py).

The part of a reported State Pension above the full rate is uprated by gov.economic_assumptions.indices.september_cpi_uprating instead (see Components). Its yearly rises, gov.economic_assumptions.yoy_growth.september_cpi_uprating, are the September CPI of the year before from statutory_uprating_inputs.cpi_september (below), rounded to the 0.1 percentage points the ONS publishes, and zero when prices fall (create_september_cpi_uprating.py). They equal the rise each Up-rating Order gave additional pensions from April 2011 to April 2026, including none in April 2016, when September 2015 CPI was -0.1% (policyengine_uk/tests/test_state_pension_components.py). The index is rounded to five decimal places each year, so it differs from the exact product of the rises by less than 0.001%.

The triple lock

The rise each April is the highest of:

create_triple_lock.py computes each element from these statutory inputs, rounded to the one decimal place the ONS publishes. From them it reproduces every published rise from April 2012 to April 2026. April 2011 is the one override (triple_lock/outturn.yaml): the basic State Pension rose by September 2010 RPI (4.6%) during the switch to CPI. The April 2022 suspension of the earnings element is include_earnings set to false for that year.

The yearly rates run from April 2011 to one year past the end of the economic-assumption series.

The statutory inputs

gov.economic_assumptions.statutory_uprating_inputs holds:

Each holds published figures and then a null. From the null onwards, create_statutory_uprating_inputs.py fills in a forecast: calendar-year growth in the matching OBR series (yoy_growth.obr.consumer_price_index or yoy_growth.obr.average_earnings) plus forecast_gap. The gap is the OBR’s statutory-basis forecast minus the calendar-year growth stored in yoy_growth.yaml, so that in the baseline the input equals the OBR’s figure:

The State Pension triple lock consumes both statutory inputs. The shared indices.earnings_uprating series also projects the Pension Credit standard minimum guarantee, with a zero floor on earnings growth. See Pension Credit uprating for its Savings Credit and pension-age Housing Benefit projections and reform behaviour.

With the October 2026 EFO the baseline rises are 3.9% in April 2027 (the published May-July 2026 earnings), 3.4% in April 2028 (September 2027 CPI), 2.5% in April 2029 to 2031 and 2.6% in April 2032, as in the OBR’s triple lock row (EFO Table A.3). After the EFO horizon the gap is zero, so the inputs follow calendar-year growth. Smooth forecasts pay the higher of earnings, CPI and 2.5% each year, so the baseline has none of the extra cost the triple lock builds up when September CPI and May-July earnings take turns to spike; the OBR’s long-run projections add 0.56 percentage points a year over earnings for it (Fiscal risks and sustainability, July 2026). To capture it, supply simulated paths of the statutory inputs, as below.

policyengine_uk/utils/import_obr_forecasts.py regenerates the gaps with the calendar-year series, from the EFO economy and receipts tables (--receipts-file or --receipts-url). After editing yoy_growth.yaml by hand, run it with --gaps-only.

Scenarios

A macro scenario that edits calendar-year growth moves the forecast inputs one for one, and so the triple lock. Calendar-year series are keyed to 1 January, and a bare year (or year:YYYY-01-01:1) names that calendar year: 5% earnings growth in 2027 sets the May to July 2027 input and so the April 2028 rise. Apply it before the data load to project the data’s incomes with it too.

from policyengine_uk.model_api import Scenario

scenario = Scenario(
    parameter_changes={
        "gov.economic_assumptions.yoy_growth.obr.average_earnings": {
            "2027": 0.05,
        },
    },
    applied_before_data_load=True,
)

A scenario can also set the statutory inputs directly, for example from a model of the monthly series, since the triple lock pays out on how September CPI and May-July earnings differ from each other. A value replaces the forecast for that year only; a bare year names the fiscal year from 6 April, which contains both observation dates:

Scenario(
    parameter_changes={
        "gov.economic_assumptions.statutory_uprating_inputs.cpi_september": {
            "2027": 0.031,
        },
        "gov.economic_assumptions.statutory_uprating_inputs.awe_total_pay_may_july": {
            "2027": 0.024,
        },
    },
    applied_before_data_load=True,
)

These changes, and the reform levers below, work through Scenario(parameter_changes=...) or a reform= dictionary alike: both are written onto the parameters before the rates are built. A rate can also be set directly, as gov.economic_assumptions.yoy_growth.triple_lock or the statutory override triple_lock/outturn.yaml; either uprates the pension from that April.

Reform levers

Scenario(
    parameter_changes={
        "gov.dwp.state_pension.triple_lock.include_earnings": {
            "year:2030-01-01:100": False,
        },
        "gov.dwp.state_pension.triple_lock.earnings_path_guarantee": {
            "year:2030-01-01:100": True,
        },
    },
    applied_before_data_load=True,
)

Each guaranteed year, the rise is the highest of the triple lock elements still included and the rise needed to reach the earnings path, rounded up to 0.1 percentage points.

Known aggregate gap (#1632)

The model’s State Pension covers UK private households: the Family Resources Survey covers private households only, not nursing homes and other communal establishments. DWP’s State Pension spending covers Great Britain and UK State Pensions paid to people living abroad, but not Northern Ireland, whose State Pension the Department for Communities pays. DWP’s Spring Forecast 2026 is consistent with the OBR’s March 2026 forecast. From 2026-27 the two differ by about £2m a year. The OBR’s figures are £1.4bn higher in 2024-25, which the OBR records as outturn, and £0.1bn higher in 2025-26.

The table compares full microsimulation runs on the enhanced FRS 2024-25 (policyengine-uk-data-private 1.57.4) with DWP’s spending less its payments abroad.

£bn2024-252025-262026-272027-282028-292029-302030-31
Model State Pension119.0124.8129.6131.6133.6137.5141.6
OBR March 2026 EFO, State Pension138.0146.2154.2158.9164.0172.2180.7
DWP Spring Forecast 2026, State Pension136.6146.1154.2158.9164.0172.2180.7
of which paid abroad5.35.65.96.16.26.46.6
Model minus DWP less paid abroad-12.2-15.6-18.6-21.3-24.2-28.3-32.5

The model also includes Northern Ireland, which DWP’s figures do not, so the like-for-like gap is larger by Northern Ireland’s State Pension.

These runs predate the fix for #1941, which uprates additional pensions and protected payments by September CPI instead of the triple lock. The fix leaves the data year unchanged. In projected years, when the full rates rise faster than prices, it lowers the model’s State Pension and widens the gap to the forecasts in this table.

The data year. In 2024-25 the model has 11.36m State Pension recipients averaging £201.6 a week, for the UK. The FRS’s own grossed figures for Great Britain are 11.53m recipients averaging £212 a week, and DWP’s administrative figures are 11.88m and £212 (FRS methodology tables M.6a and M.6b, which cover Great Britain). The FRS’s grossed estimate for the UK, with benefit amounts linked to DWP records, is £130.6bn, against £135.1bn from administrative data. So most of the model’s £16bn shortfall against administrative data for the UK arises in building the enhanced FRS, not in the survey. For FRS respondents, state_pension_reported is the FRS benefits table’s weekly State Pension amount times 52 (policyengine-uk-data’s datasets/frs.py). On the rows the enhanced FRS adds from the Survey of Personal Incomes, it is imputed (datasets/imputations/frs_only.py). The shortfall is tracked in policyengine-uk-data#493.

Projected years. The gap widens after the data year for two reasons, tracked in #1929:

Until the fix for #1921, additional_state_pension paid the band between the flat rates twice for records moving from basic to new State Pension cohorts (see Components above): £0.8bn in 2025-26, rising to £6.8bn in 2030-31. That made the model’s State Pension per recipient grow 21.8%, faster than DWP’s, and hid part of the widening.

What’s been fixed

IssueStatusWhere
BASIC vs NEW classification used is_SP_age heuristicFixed#1618
new_state_pension returned flat max for every NEW retiree, ignoring partial NI recordsFixed#1634
Protected Payment only computed for BASIC-type recipientsFixed#1634 (ASP now extends to NEW)
additional_state_pension split the reported amount by the data year’s State Pension type, paying part of it twice for records moving from basic to new cohortsFixed#1921
additional_state_pension uprated additional pensions and protected payments by the full rate (the triple lock), not September CPIFixed#1941
The 25p age addition at 80 was not modelled: in the reported amount it was uprated as additional pension, and no one who turned 80 later got itFixed#2139

What’s still open

Both are part of #1632 and the broader UK pipeline-alignment tracker #1621.

References