For HR platforms, payroll tools, and compliance systems dealing with UK immigration, salary threshold logic is one of the trickiest areas to implement correctly. The rules have layers, exceptions, and a dependency on occupation classification data — making naive implementations a common source of compliance failures.
This post is a technical walkthrough of how the threshold system works and what your systems need to account for.
The Two-Test Model
Every Skilled Worker visa salary eligibility check reduces to a max of two independent tests:
salary_floor = max(general_threshold, going_rate_for_soc_code)
eligible = candidate_salary >= salary_floor
That's the core logic. The complexity is in how general_threshold and going_rate_for_soc_code are correctly determined.
General Threshold Values
There are two tiers, effective from April 2024:
| Category | Annual Threshold |
|---|---|
| Standard | £38,700 |
| New entrant | £30,960 |
A worker qualifies as "new entrant" if they meet any of:
- Under 26 at time of application
- Currently on a Student or Graduate visa switching to Skilled Worker
- In a role that is a recognised training or apprenticeship position
- Within four years of their first Skilled Worker visa grant in this category
The new entrant status expires after four years — at which point the full going rate for the occupation must be met. If your system tracks visa holders over time, this transition needs to be surfaced proactively.
Going Rate Data Source
Going rates are tied to Standard Occupational Classification (SOC) codes, published under the SOC 2020 taxonomy. Your system needs to:
- Store or fetch the assigned SOC 2020 code for each sponsored role
- Map that code to the published going rate (from the Home Office immigration salary list appendix)
- Apply any applicable Immigration Salary List (ISL) discount — 20% reduction on going rate only, not on the general threshold
The going rate table is published in the immigration salary list appendix to the immigration rules. This data changes when the Home Office updates the rules — worth building a refresh mechanism that doesn't require a code deploy.
The Immigration Salary List Discount
If the occupation is listed on the Immigration Salary List (ISL — introduced in April 2024, replacing the Shortage Occupation List):
if occupation_on_isl:
effective_going_rate = going_rate * 0.80 # 20% discount
else:
effective_going_rate = going_rate
# General threshold always applies as the absolute floor
salary_floor = max(general_threshold, effective_going_rate)
A common implementation error: applying the 20% discount to the general threshold. The discount only applies to the going rate comparison. The £38,700 (or £30,960 for new entrants) floor remains unchanged.
Salary Composition Rules
Not all compensation is countable. When computing candidate_salary for threshold comparison:
Counts:
- Base salary (contracted annual amount)
- Guaranteed allowances — explicitly committed in the Certificate of Sponsorship and unconditional
Does not count:
- Performance bonuses (not guaranteed)
- Tips or gratuities
- Non-guaranteed overtime
- Benefits in kind (company car, healthcare, etc.)
For part-time workers, there are two separate tests that must both pass:
fte_annual = (actual_salary / contracted_hours) * standard_full_time_hours
assert fte_annual >= salary_floor # FTE test
assert actual_annual >= salary_floor # Actual salary test
Part-time doesn't get a proportional threshold reduction. A high hourly rate doesn't substitute for the annual total. Both tests must pass independently.
SOC Code Assignment: Where Most Errors Originate
The SOC code assigned to a role determines which going rate applies. Common failure patterns:
- Title/duties mismatch: Using a SOC code that matches the job title but not the actual role responsibilities. UKVI assesses on duties, not titles.
- Inflated code selection: Assigning a higher-paying SOC code to push the going rate threshold lower. This creates a compliance risk if audited.
- Stale codes: Not updating SOC codes when a worker's responsibilities change materially.
- Limited system options: HR systems that only expose a subset of SOC codes, forcing approximate assignments.
Building SOC code assignment into your sponsor management workflow with an audit trail — including who assigned the code and when — is good compliance hygiene.
Testing Edge Cases
Before shipping threshold logic, validate these scenarios:
1. ISL occupation: going_rate = £36,000. candidate_salary = £31,000
effective_going_rate = £28,800 (20% discount)
salary_floor = max(38700, 28800) = £38,700
FAIL: £31,000 < £38,700
2. New entrant on Graduate visa switch: candidate_salary = £31,500
general_threshold = £30,960
going_rate = £28,000 (non-ISL)
salary_floor = max(30960, 28000) = £30,960
PASS: £31,500 > £30,960
3. Part-time: 25 hrs/week at £20/hr = £26,000/year, FTE = £41,600
actual (£26,000) < £38,700: FAIL (both tests must pass)
4. High going rate occupation: going_rate = £52,000, candidate = £45,000
salary_floor = max(38700, 52000) = £52,000
FAIL: £45,000 < £52,000, even though above general threshold
Getting these wrong doesn't just affect the candidate's application. It can expose the sponsoring organisation to a compliance finding during a UKVI audit, with potential suspension or revocation of their sponsor licence.
Data Access and Integration Options
There is no official public API for UK immigration salary thresholds. Practical options:
- Parse the Home Office immigration salary list appendix directly (published on legislation.gov.uk)
- Integrate with a compliance data provider that maintains this as a structured, versioned dataset
- Use tools like ImmigrationGPT to query current threshold values and eligibility rules in natural language
This post is for technical and informational purposes only. UK immigration rules change frequently. Always verify current thresholds against GOV.UK guidance and consult a regulated immigration adviser before making compliance decisions.
Top comments (0)