Repository navigation
UK bus fares: outside London the stage makes only older-person eligibility and under-5s free, but its yield removes all concessionary journeys #1385
Description
Summary
Outside London, the stage makes only people eligible for the older-person concession, and children under 5, travel free. But its yield removes all concessionary journeys.
assign_bus_pass_eligibilityflags older-person eligibility (State Pension age, 66) and under-5s outside London.price_bus_journeysandprice_bus_supportdivide by BUS01c total concessionary journeys: 519.1m in 2024-25. Of these, 402.8m are older and disabled journeys and 116.3m are other concessions.- So about 99m boardings that the yield removes as concessionary are priced as fare-paying.
- The declaration's basis says disabled passes and child half-fares "are absorbed by the yield". The yield cannot absorb them, because its denominator already excludes them.
On the certified build (microcosm-uk-2024-25-national-20261019T083323Z-6cba5d71, built from 810315ac), model year 2024:
- Eligible boardings outside London are 420m, against 519m in C.
- Fare-paying boardings are 1,417m, against 1,331m published (+6.5%).
- Other-local-bus fares of residents outside London are £2,210m, against BUS05ai £2,070m (+6.8%). This holds in policyengine-uk 2.132.6 and in 2.152.7.
- Support: the reimbursement per concessionary boarding is £630.6m / 519.1m = £1.215. The stage applies it to 420m eligible boardings.
Why now: since #1324, the national calibration measures the England fare-receipt rows through the engine at 2025. With this gap, the next build will meet the England row by moving weight off fare-paying riders.
Existing issues. None is open. #930, #1207 and #1331 (closed) built and moved the pricing. #1095 tracks uk-data defects and does not cover this.
All figures below are published DfT figures or weighted totals and shares at nation or region level.
What the other concessions are
National Travel Survey (SN 5340), 2022 to 2024, residents of England outside London, other-local-bus boardings weighted by W5 × JJXSC × NumBoardings. Boardings are classed by SpecialTicket_B01ID, as clean_nts_travel_tables classes them:
- People outside the free flag ride on a concession for 12.0% of all boardings:
- scholar's passes, 6.9% (mostly ages 5 to 20);
- disabled person's passes, 2.8%;
- other concessionary tickets, 1.7%;
- older-person passes held before eligibility, 0.6%.
- People outside the flag ride free with no ticket for a further 1.9% of boardings.
- People inside the flag pay a fare or use a season ticket for 1.2% of boardings.
Each share rests on at least 10 unweighted boardings and 10 people. The full cross-tabulation stays in the licensed area.
London's rule (60 and over, or under 18) matches London's total concessionary count: 504m eligible boardings against 498m. So London is not affected.
Changes
1. Near term, with PolicyEngine/policyengine-uk#2640 (option A there).
- Set the England-outside-London
concessionaryselector tojourney_category: elderly_disabled_concessionaryin all three places it appears:price_bus_journeys(uk/spec/sources.yaml:3676);price_bus_support's pricing area (:4110);price_bus_support's support area (:4199).
- Update the eligibility basis (
:3225). The other concessions are absorbed by the yield. Disabled pass holders are not yet flagged. - The yield outside London becomes £1.430. The reimbursement per concessionary boarding becomes £630.6m / 402.8m = £1.566.
- On the certified build's weights, fares outside London move from +6.8% to about −1.8% against BUS05ai.
- Run the usual pin pass: stage hash, coverage manifest, H2 fixture and digests.
bus_engine_parityholds once the engine release is locked.
2. Then, one of these two:
- (B) Flag disabled pass holders from the FRS. The build carries
pip_m_category,dla_m_categoryandis_blind. A broad rule (PIP mobility standard or enhanced, DLA higher mobility, or blind) flags 2.33m people aged 5 and over in England who are not already free. DfT counts about 1.0m disabled passes (11% of 8.9m). So the rule needs to be narrower, or needs a take-up step checked against DfT's pass counts and the NTS disabled-pass share. - (D) Impute each person's concessionary share of boardings from the NTS ticket types. Impute it by series, residence group, frequency band and age band, as
local_bus_single_fare_shareis imputed, and keep C at the total. This needs the engine input in Bus fares: outside London the yield removes all concessionary journeys, but bus_pass_eligible makes only older-person eligibility and under-5s free policyengine-uk#2640 option D. Scholar's pass eligibility depends on distance to school, which the FRS does not carry, so a share fits better than a flag.
Not in this issue
- London, Scotland, Northern Ireland and Wales.
- The lowest frequency band (UK bus travel: the lowest frequency band gives about half the population trips, so incidence counts are about double #1386).
Related
#930, #954, #1207, #1324, #1331. PolicyEngine/policyengine-uk#1871, PolicyEngine/policyengine-uk#2546, and the companion issue PolicyEngine/policyengine-uk#2640. Found while checking PolicyEngine/bus-fare-cap#12.
Activity
juaristi22 commentedon Oct 24, 2026
The companion model fix is in PolicyEngine/policyengine-uk#2641. Its review also flagged the eligibility
basisinpackages/microcosm-build/src/microcosm/build/uk/spec/sources.yamlfor the near-term selector update here.Please replace the statement that "disabled passes and child half-fares are absorbed by the yield". With
elderly_disabled_concessionaryas the denominator selector outside London, youth-scheme journeys remain priced and their discounts enter the average yield; disabled-pass journeys are excluded from that denominator, but their holders are not yet flagged. The revised basis should state that residual explicitly, along with the separate under-5 mismatch.The existing issue's measured comparison holds the certified build's weights fixed: outside-London fares move from 6.8% above BUS05ai to about 1.8% below it. The model documentation attributes those figures to this issue and names the build; this review round has not rerun the population calculation.
The existing selector changes, engine lock, stage hashes/fixtures and
bus_engine_parityfollow-up remain required before certifying a new build against the engine release.