You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Tracking issue for adding benefits-in-kind (BiK) modelling to policyengine-uk.
Current state
There is no BiK modelling in the repo today. Searches for benefit_in_kind, bik, p11d, company_car, etc. return no hits in parameters/, variables/, or tests/.
The integration hook does exist:
policyengine_uk/variables/gov/hmrc/income_tax/bases/taxable_employment_income.py
already adds an employment_benefits term to taxable earnings.
policyengine_uk/variables/household/benefits/employment_benefits.py
currently only sums statutory_sick_pay and statutory_maternity_pay —
i.e. statutory cash payments, not P11D-style benefits-in-kind.
So the slot exists, but nothing fills it.
Scope (priority order)
UK BiK has a long tail. Roughly 80% of the aggregate taxable BiK base is
captured by four categories — proposing we MVP these and defer the rest:
Phase 1 — MVP
Company cars (P11D section F) — biggest single category by value
Car fuel benefit (F)
Private medical and dental insurance (I)
Living accommodation (D)
Beneficial loans (H) — interest below HMRC official rate
Phase 2 — moderate prevalence
Vans and van fuel (G)
Vouchers and credit cards (C)
Mileage allowances above HMRC approved rates (E)
Relocation expenses above £8k (J)
Assets transferred / placed at disposal (A, L)
Phase 3 — long tail / niche
Services supplied (K), payments on employee's behalf (B), entertainment,
non-qualifying travel and subsistence, employer-paid income tax,
educational assistance, etc.
Exempt categories (no charge — out of scope): trivial benefits <£50, one
mobile phone, workplace parking/nurseries, employer pension contributions,
cycle-to-work, eye tests for VDU users, pensions advice up to £500.
Implementation plan
Variables
New benefit_in_kind variable on Person, summing typed sub-components.
One sub-variable per BiK category in variables/gov/hmrc/income_tax/bik/
(e.g. company_car_benefit, car_fuel_benefit, private_medical_benefit, living_accommodation_benefit, beneficial_loan_benefit).
Adds benefit_in_kind to employment_benefits so it flows into taxable_employment_income via the existing hook.
Parameters
New tree under parameters/gov/hmrc/income_tax/bik/:
company_car/appropriate_percentage_by_co2.yaml (year-by-year CO2 bands)
BiK feeds into adjusted net income, which means it touches:
Personal allowance taper at £100k
High Income Child Benefit Charge
Tapered annual allowance for pensions
Class 1A NICs (employer side) — not currently modelled in repo;
filing this here as a flag for separate work.
Tests
Unit tests per BiK category against worked HMRC examples.
Integration test asserting BiK flows through to taxable employment income,
ANI, and HICBC where applicable.
Data needs and FRS coverage
This is the harder half of the project. Summary of where each Phase 1
component sits w.r.t. our current data:
Component
FRS has flag?
FRS has value?
Calibration source
Company car
Yes
No (no list price / CO2 / fuel)
HMRC Benefits in Kind statistics, Company Car Tax statistics
Car fuel
Partially (fuel-provided flag)
No
HMRC BiK statistics
Private medical insurance
Yes (employer-paid flag)
No
HMRC BiK statistics
Living accommodation
Yes (job-tied accommodation flag)
No
HMRC BiK statistics; SPI (restricted)
Beneficial loans
No reliable flag
No
HMRC BiK statistics; SPI (restricted)
Public sources (no special access)
HMRC "Benefits in Kind" statistics — annual P11D-based release;
recipient counts and total taxable values by category and income band.
Primary calibration target.
HMRC "Company Car Tax" statistics — CO2 and fuel-type distributions.
HMRC Personal Incomes Statistics (SPI tables) — published totals.
DVLA / SMMT — new-car registrations for company-car list-price/CO2
distributions.
Restricted-access (HMRC Datalab)
SPI microdata — actual P11D values per individual; gold standard
but requires accreditation and stays in the secure environment.
For company cars in particular: either (a) skip the list-price/CO2
mechanics and assign a calibrated taxable value directly, or (b) layer
a simplified CO2-band model over an imputed list-price distribution.
Recommend (a) for MVP and (b) as a Phase-1.5 refinement.
Effort estimate
Framework wiring + a flat-value benefit_in_kind variable feeding the
existing hook: ~1–2 days.
Trustworthy distributional version (CO2 bands modelled, beneficial-loan
amounts, sensitivity-checked imputation): closer to a month, with most
time on the data side rather than the rules.
Class 1A NICs (employer side): separate workstream.
Open questions
Do we want to model Class 1A NICs in the same effort, or split it?
Should BiK enter Universal Credit / legacy means tests as earned income?
(HMRC treats most BiK as taxable but UC treats earned income via RTI;
payrolled BiK flows through, non-payrolled BiK does not — needs a
decision.)
Pursue HMRC Datalab access for SPI/RTI microdata, or stick to
public-aggregate calibration for now?
Note
Filing this as a planning issue for future discussion with NEF before we
commit to a build order. Happy to split into per-category issues once
the scope and imputation approach are agreed.
Tracking issue for adding benefits-in-kind (BiK) modelling to policyengine-uk.
Current state
There is no BiK modelling in the repo today. Searches for
benefit_in_kind,bik,p11d,company_car, etc. return no hits inparameters/,variables/, ortests/.The integration hook does exist:
policyengine_uk/variables/gov/hmrc/income_tax/bases/taxable_employment_income.pyalready adds an
employment_benefitsterm to taxable earnings.policyengine_uk/variables/household/benefits/employment_benefits.pycurrently only sums
statutory_sick_payandstatutory_maternity_pay—i.e. statutory cash payments, not P11D-style benefits-in-kind.
So the slot exists, but nothing fills it.
Scope (priority order)
UK BiK has a long tail. Roughly 80% of the aggregate taxable BiK base is
captured by four categories — proposing we MVP these and defer the rest:
Phase 1 — MVP
Phase 2 — moderate prevalence
Phase 3 — long tail / niche
non-qualifying travel and subsistence, employer-paid income tax,
educational assistance, etc.
Exempt categories (no charge — out of scope): trivial benefits <£50, one
mobile phone, workplace parking/nurseries, employer pension contributions,
cycle-to-work, eye tests for VDU users, pensions advice up to £500.
Implementation plan
Variables
benefit_in_kindvariable onPerson, summing typed sub-components.variables/gov/hmrc/income_tax/bik/(e.g.
company_car_benefit,car_fuel_benefit,private_medical_benefit,living_accommodation_benefit,beneficial_loan_benefit).benefit_in_kindtoemployment_benefitsso it flows intotaxable_employment_incomevia the existing hook.Parameters
parameters/gov/hmrc/income_tax/bik/:company_car/appropriate_percentage_by_co2.yaml(year-by-year CO2 bands)company_car/fuel_charge_multiplier.yamlcompany_car/electric_vehicle_rates.yamlcar_fuel/multiplier.yamlliving_accommodation/cost_threshold.yaml(currently £75k)beneficial_loan/official_rate.yamlbeneficial_loan/de_minimis.yaml(currently £10k)vouchers/...(Phase 2)Knock-on effects (must not be missed)
BiK feeds into adjusted net income, which means it touches:
filing this here as a flag for separate work.
Tests
ANI, and HICBC where applicable.
Data needs and FRS coverage
This is the harder half of the project. Summary of where each Phase 1
component sits w.r.t. our current data:
Public sources (no special access)
recipient counts and total taxable values by category and income band.
Primary calibration target.
distributions.
Restricted-access (HMRC Datalab)
but requires accreditation and stays in the secure environment.
payrolling reforms).
Proposed imputation approach for the FRS-based pipeline
population total and income-band breakdown match HMRC's published BiK
statistics. (This mirrors the second-stage imputation pattern flagged
in Align UK model/data pipeline with US patterns: reported-anchoring, second-stage imputation, and downstream bugs #1621.)
mechanics and assign a calibrated taxable value directly, or (b) layer
a simplified CO2-band model over an imputed list-price distribution.
Recommend (a) for MVP and (b) as a Phase-1.5 refinement.
Effort estimate
benefit_in_kindvariable feeding theexisting hook: ~1–2 days.
through ANI/HICBC, tests): ~2 weeks.
amounts, sensitivity-checked imputation): closer to a month, with most
time on the data side rather than the rules.
Open questions
(HMRC treats most BiK as taxable but UC treats earned income via RTI;
payrolled BiK flows through, non-payrolled BiK does not — needs a
decision.)
public-aggregate calibration for now?
Note
Filing this as a planning issue for future discussion with NEF before we
commit to a build order. Happy to split into per-category issues once
the scope and imputation approach are agreed.