# fleet.company-car-bik
Status: needs review by a tax professional before it is published.
The taxable benefit in kind of a company car for one UK tax year, and of free
fuel for it: what goes on a P11D or is payrolled. It follows the method in
ITEPA 2003 s121:
1. the price: list price plus taxable accessories (`listPrice`), less the
employee's capital contributions, of which only the first 5,000.00 counts
(s132);
2. times the appropriate percentage for the car's CO2 figure and, for 1-50
g/km, its electric range, in that tax year (s139), plus the 4% diesel
supplement where it applies (s141);
3. cut for the days the car was unavailable: price x percentage x (days in
year - unavailable days) / days in year (s143);
4. less what the employee was required to pay, and paid, for private use,
never below nil (s144).
Free fuel (s149-150) is the year's car fuel benefit multiplier times the same
appropriate percentage, cut for the same unavailable days. It is not reduced by
private use payments. Electricity is not fuel (s149(4)), so a zero-emission car
has no fuel benefit even when `freeFuel` is true.
`taxYear`, `daysInYear` (366 in a year containing 29 February, such as
2023-24 and 2027-28) and the percentage come back with the answer, so a payroll
line can show its working.
## What the caller decides
- `co2` is the whole-number g/km on the registration documents: the NEDC
figure for a car first registered before 6 April 2020, WLTP otherwise.
s139(2) rounds a fractional figure down; do that before calling.
- `electricRangeMiles` is rounded up to a whole mile (s139(2)(b)). It only
matters for 1-50 g/km up to 2027-28; from 2028-29 every 1-50 g/km car has
one percentage.
- `dieselSupplement` is true for a car propelled solely by diesel that is not
certified to Euro 6d (RDE2). Hybrids are not "solely by diesel". The
supplement never takes the percentage past the year's maximum.
- `firstRegistered` picks the table column. Only 2021-22 has different
percentages for cars first registered before 6 April 2020 (NEDC, one point
higher). It must not be after the tax year.
- `unavailableDays` are the days before the car was first available, after it
was last available, and in any spell of 30 or more consecutive days when it
was not available. Shorter gaps do not count; this function trusts the count.
## Rounding
Each benefit is one exact division, rounded down to the penny, so neither is
ever more than the statutory figure. The P11D takes whole pounds; converting
is left to the caller. The same rounding is used for 2021-22 and 2029-30.
## What it does not do
Cars without a CO2 figure (s140), cars first registered before 1998 (s142),
shared cars, a replacement car (s145), classic cars valued at market value,
optional remuneration arrangements (salary sacrifice, s121A), fuel withdrawn
part way through the year (s152), and the easement for plug-in hybrids
approved under Euro 6e-bis from 1 January 2025 (EIM24710). Vans are a
different charge.
## Rates
Three tables in `data/`, each with dated rows, looked up on `onDate`:
- `bik-bands.json`: the percentages below 75 g/km, including 0 g/km and the
1-50 g/km electric range bands, by tax year and registration column.
- `bik-limits.json`: the percentage at 75 g/km, the maximum, the 4% diesel
supplement and the 5,000.00 capital contribution cap. From 75 g/km the
percentage rises one point per whole 5 g/km (s139(3)). Note that since
2025-26 the 70-74 and 75-79 g/km bands share a percentage (21% in
2026-27), so "one point per 5 g/km from 55" gets 75-79 wrong.
- `fuel-multipliers.json`: the car fuel benefit multiplier, 24,600 (2021-22),
25,300, 27,800, 27,800, 28,200 and 29,200 (2026-27). The multiplier for
2027-28 and later is set each Budget and is not published yet, so free fuel
in those years is an error rather than a guess; 2027-28 onward percentages
are legislated, so the car benefit itself is answered.
| tax year | 0 g/km | 1-50 g/km by range (130+, 70-129, 40-69, 30-39, <30) | 51-54 | at 75 g/km | max |
|---|---|---|---|---|---|
| 2021-22 WLTP | 1% | 1, 4, 7, 11, 13% | 14% | 19% | 37% |
| 2021-22 NEDC | 1% | 2, 5, 8, 12, 14% | 15% | 20% | 37% |
| 2022-23 to 2024-25 | 2% | 2, 5, 8, 12, 14% | 15% | 20% | 37% |
| 2025-26 | 3% | 3, 6, 9, 13, 15% | 16% | 21% | 37% |
| 2026-27 | 4% | 4, 7, 10, 14, 16% | 17% | 21% | 37% |
| 2027-28 | 5% | 5, 8, 11, 15, 17% | 18% | 21% | 37% |
| 2028-29 | 7% | 18% | 19% | 22% | 38% |
| 2029-30 on | 9% | 19% | 20% | 23% | 39% |
Years before 2021-22 are not carried and are an error. The tables declare
effective columns, so a `history=current` build refuses an earlier tax year
instead of answering it with today's figures. When a rate changes, a new
version of this capability carries it.
## Sources
- HMRC Employment Income Manual, EIM24705, "Car benefit calculation: step 5:
appropriate percentage: tax years 2015 to 2016 onwards: ready reckoner for
type A cars" (tables 2020-21 to 2026-27, NEDC and WLTP columns, the diesel
supplement and Euro 6d):
https://www.gov.uk/hmrc-internal-manuals/employment-income-manual/eim24705
- Finance Act 2023 s11 (tables for 2025-26, 2026-27 and 2027-28, and 21% at
75 g/km): https://www.legislation.gov.uk/ukpga/2023/1/section/11/enacted
- Finance Act 2025 s5 and s6 (2028-29 and 2029-30, maximum 38% and 39%):
https://www.legislation.gov.uk/ukpga/2025/8/section/5/enacted and
https://www.legislation.gov.uk/ukpga/2025/8/section/6/enacted
- HMRC policy paper, "Taxation of company cars: The appropriate percentage for
tax years 2028 to 2029 and 2029 to 2030" (30 October 2024):
https://www.gov.uk/government/publications/income-tax-company-car-tax-rates-2028-to-2030
- ITEPA 2003 s132 (capital contributions, 5,000), s139, s141 (diesel), s143
(unavailability), s144 (private use payments), s149 (fuel; electricity is
not fuel): https://www.legislation.gov.uk/ukpga/2003/1/part/3/chapter/6
- HMRC, "Travel - mileage and fuel rates and allowances" (car fuel benefit
multiplier by tax year):
https://www.gov.uk/government/publications/rates-and-allowances-travel-mileage-and-fuel-allowances/travel-mileage-and-fuel-rates-and-allowances
1.0.1 fixes Python accepting a trailing newline or non-ASCII digits in firstRegistered and onDate; adds tests.