Skip to content

Employer NI annualises the secondary threshold as 52 × £96 = £4,992, not the statutory £5,000 #1967

Closed

Description

@MaxGhenis

Problem

ni_class_1_employer annualises the weekly secondary threshold (ST) as 52 weeks:

secondary_threshold = class_1.thresholds.secondary_threshold * WEEKS_IN_YEAR  # WEEKS_IN_YEAR = 52

secondary_threshold.yaml stores the statutory weekly £96 from 2025-26, so the model's annual ST is 52 × £96 = £4,992.

The law gives £5,000 a year. SI 2001/1004 reg 11(3A) says:

  • (b): "where the earnings period is a year, £5,000".
  • (c): for a period that is a multiple of a week, the annual figure / 52 × the multiple (rounded up to a whole pound under reg 11(4)).

The primary threshold and upper earnings limit already follow reg 11(3)(c) and 11(2A)(c): they store annual / 52 (12,570 / 52 and 50,270 / 52). The ST is the only Class 1 threshold stored as the reg 10 weekly figure. Before 2025-26 the two conventions agreed (52 × £175 = £9,100).

Effect: from 2025-26, employer NI is overstated by up to 15% × £8 = £1.20 per employee a year above the ST. For example, the model gives £5,251.20 on £40,000 in 2026-27; £5,250.00 is correct.

Fix

  • Store the ST from 2025-26 as 5,000 / 52, with a reg 11(3A) reference.
  • Update the tests that pin £4,992. These include ni_class_1_employer.yaml, the salary sacrifice YAML tests, and ni_threshold_freeze.yaml / test_ni_threshold_freeze.py from Hold NICs thresholds at 2026-27 levels through 2030-31 #1959, which has a strict xfail for this.
  • Run an Enhanced FRS impact.

Found while reviewing #1959.

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