Contracting in the UK offers flexibility and potentially higher gross income compared to permanent employment. However, calculating your actual take-home pay requires navigating the complexities of UK tax law, specifically the distinction between Inside IR35 and Outside IR35 engagements. This calculator helps convert your hourly or daily rate into realistic net earnings.
Inside IR35 vs Outside IR35
Outside IR35 (Limited Company): If your contract is deemed "Outside IR35," you operate as a genuine business. You can pay yourself a small salary (usually up to the Personal Allowance threshold) and take the rest of your income as dividends, which are taxed at lower rates. You can also deduct legitimate business expenses before calculating Corporation Tax.
Inside IR35 (Umbrella/PAYE): If your role is "Inside IR35," you are treated as a "disguised employee" for tax purposes. The fee payer (usually the recruitment agency or client) must deduct PAYE tax and National Insurance at source. Furthermore, the "Employer" National Insurance contributions (approx. 13.8%) and Apprenticeship Levy (0.5%) are often deducted from your agreed daily rate before your gross taxable salary is even calculated. This can significantly reduce retention rates compared to limited company contractors.
Key Factors Used in This Calculation
Personal Allowance: Currently £12,570 (2024/25 tax year). Income up to this amount is generally tax-free.
Abatement: The Personal Allowance is reduced by £1 for every £2 of adjusted net income over £100,000.
Corporation Tax: For Outside IR35, profits are taxed at 19% (small profits) up to 25% (profits over £250k), with marginal relief in between.
Dividend Tax: Dividends are taxed at 8.75% (Basic), 33.75% (Higher), and 39.35% (Additional).
Why Daily Rates Vary
Because of the extra tax burden associated with Inside IR35 contracts, many contractors negotiate a higher daily rate (typically 20-30% higher) for Inside roles to match the net take-home pay of an equivalent Outside IR35 role. Use this calculator to compare different rate offers and understand your bottom line.
Disclaimer: This tool provides an estimate based on 2024/25 UK tax bands. It simplifies complex accounting rules (such as VAT, flat rate schemes, and specific pension contributions). It does not constitute financial advice. For accurate tax planning, please consult a qualified accountant or umbrella company.
function calculateContractPay() {
// 1. Get Inputs
var rateType = document.getElementById("rateType").value;
var rawRate = parseFloat(document.getElementById("contractRate").value);
var hoursPerWeek = parseFloat(document.getElementById("workVolume").value);
var weeksPerYear = parseFloat(document.getElementById("weeksPerYear").value);
var ir35Status = document.getElementById("ir35Status").value;
var monthlyExpenses = parseFloat(document.getElementById("expenses").value);
// Validation
if (isNaN(rawRate) || rawRate 100000) {
var reduction = (taxableIncome – 100000) / 2;
adjustedPA = Math.max(0, personalAllowance – reduction);
}
var taxable = Math.max(0, taxableIncome – adjustedPA);
var tax = 0;
// Bands relative to 0 after PA is removed? No, UK bands are cumulative.
// Taxable income (salary) sits in bands.
// Band 1: PA to 50270 (Basic 20%)
// Band 2: 50270 to 125140 (Higher 40%)
// Band 3: 125140+ (Additional 45%)
// Logic with Floating PA is tricky. simpler method:
// Calculate total tax on income.
// 1. Basic Rate Band Width
var basicBandWidth = 37700; // 50270 – 12570
// If PA is reduced, the basic band effectively starts earlier (relative to 0) or stays same size?
// Actually: The threshold for higher rate stays at 50,270 usually.
// If PA is 0 (income > 125k), you pay 20% on 0-37700, 40% on 37700-125140.
var t = 0;
// Income up to adjustedPA is 0%.
var rem = taxableIncome – adjustedPA;
if (rem 0) {
var inHigher = Math.min(rem, higherBandWidth);
t += inHigher * 0.40;
rem -= inHigher;
}
// Additional Rate (45%)
if (rem > 0) {
t += rem * 0.45;
}
return t;
}
function calcEmployeeNI(salary) {
// 2024 cuts: 8% between 12570 and 50270, 2% above.
if (salary 50270) {
ni += (salary – 50270) * 0.02;
}
return ni;
}
// 3. Calculation Logic
if (ir35Status === 'inside') {
// INSIDE IR35 LOGIC
// Gross Revenue is the "Assignment Rate" paid to Umbrella.
// Deductions:
// 1. Umbrella Margin (Assume £25/week = £1200/yr)
var margin = 25 * weeksPerYear;
// 2. Employer NI (13.8%) and App Levy (0.5%)
// These are calculated on the "Gross Pay" which is unknown yet.
// Formula: AssignmentRate = GrossPay + EmployerCosts + Margin
// EmployerCosts = (GrossPay – SecondaryThreshold)*13.8% + GrossPay*0.5%
// This is complex. Approximation:
// Deduct margin first.
var revenuePostMargin = annualRevenue – margin;
// Approx Employer Burden ~ 12.5% of total remaining revenue (since ER NI has a threshold).
// Let's use a rough factor: GrossSalary = RevenuePostMargin / 1.15
// More precise:
// Cost = (Gross * 0.138) + (Gross * 0.005) = Gross * 0.143 (ignoring threshold for simplicity provides safer estimate).
// RevenuePostMargin = Gross + (Gross * 0.143) = Gross * 1.143
var grossSalary = revenuePostMargin / 1.143;
var employerCosts = revenuePostMargin – grossSalary;
// Expenses usually not allowed inside IR35
displayUmbrellaCosts = employerCosts + margin;
displayGrossSalary = grossSalary;
displayIncomeTax = calcIncomeTax(grossSalary);
displayNI = calcEmployeeNI(grossSalary);
netAnnual = grossSalary – displayIncomeTax – displayNI;
} else {
// OUTSIDE IR35 LOGIC
// Revenue – Expenses
var taxableProfit = annualRevenue – annualExpenses;
// Strategy: Salary up to Secondary Threshold (approx £9100) or PA (£12570).
// Tax efficient standard: Salary = £12,570 (No Income Tax, minimal NI).
// Note: Employers NI allowance might apply, but let's assume worst case (single director) -> ER NI payable on salary > £9100.
// Let's assume Salary = £12,570.
// ER NI on 12570: (12570 – 9100) * 13.8% = ~£478.
var salary = 12570;
var erNI = 480; // approximate
if (taxableProfit < salary + erNI) {
// Low income case
salary = taxableProfit;
erNI = 0;
}
var profitAfterSalary = taxableProfit – salary – erNI;
// Corp Tax
// 250k = 25%.
var corpTaxRate = 0.19;
if (profitAfterSalary > 50000) {
// Marginal relief is complex. Let's use simplified bands.
if (profitAfterSalary > 250000) corpTaxRate = 0.25;
else corpTaxRate = 0.22; // Blended estimate
}
var corpTax = Math.max(0, profitAfterSalary * corpTaxRate);
var dividends = Math.max(0, profitAfterSalary – corpTax);
displayCorpTax = corpTax;
displayAvailableDist = dividends; // Dividends + Salary is total specific, but this field is pure dividends available.
// Personal Tax on Salary + Dividends
// Salary consumes PA (£12570). Tax = 0.
// Dividends start taxing immediately after PA.
// Dividend Allowance: £500 (2024/25).
var divTax = 0;
var taxableDivs = dividends – 500; // £500 allowance
if (taxableDivs > 0) {
// Total Income = 12570 + dividends.
// Basic Band for divs: Up to 50270 total income.
// Remaining Basic Band = 50270 – 12570 = 37700.
var remBasic = 37700;
var inBasic = Math.min(taxableDivs, remBasic);
divTax += inBasic * 0.0875;
var remDivs = taxableDivs – inBasic;
// Higher Band
// 50270 to 125140. Width = 74870.
if (remDivs > 0) {
var remHigher = 74870;
var inHigher = Math.min(remDivs, remHigher);
divTax += inHigher * 0.3375;
remDivs -= inHigher;
}
// Additional Band
if (remDivs > 0) {
divTax += remDivs * 0.3935;
}
}
displayDivTax = divTax;
displayIncomeTax = 0; // Covered by salary within PA
displayNI = 0; // Salary usually set to avoid NI or covered by EA
netAnnual = salary + dividends – divTax;
}
// 4. Update UI
document.getElementById("results-area").style.display = "block";
document.getElementById("resGrossRevenue").innerText = formatCurrency(annualRevenue);
document.getElementById("resNetAnnual").innerText = formatCurrency(netAnnual);
document.getElementById("resNetMonthly").innerText = formatCurrency(netAnnual / 12);
var retention = (netAnnual / annualRevenue) * 100;
document.getElementById("resRetention").innerText = retention.toFixed(1) + "%";
// Show/Hide specific sections
if (ir35Status === 'inside') {
document.getElementById("inside-breakdown").style.display = "block";
document.getElementById("outside-breakdown").style.display = "none";
document.getElementById("resUmbrellaCosts").innerText = "-" + formatCurrency(displayUmbrellaCosts);
document.getElementById("resGrossSalary").innerText = formatCurrency(displayGrossSalary);
document.getElementById("resIncomeTax").innerText = "-" + formatCurrency(displayIncomeTax);
document.getElementById("resNI").innerText = "-" + formatCurrency(displayNI);
document.getElementById("resDivTax").parentNode.style.display = "none"; // Hide div tax row
} else {
document.getElementById("inside-breakdown").style.display = "none";
document.getElementById("outside-breakdown").style.display = "block";
document.getElementById("resCorpTax").innerText = "-" + formatCurrency(displayCorpTax);
document.getElementById("resAvailableDist").innerText = formatCurrency(displayAvailableDist);
document.getElementById("resIncomeTax").innerText = "£0.00 (Salary within PA)";
document.getElementById("resNI").innerText = "£0.00";
document.getElementById("resDivTax").parentNode.style.display = "flex";
document.getElementById("resDivTax").innerText = "-" + formatCurrency(displayDivTax);
}
}
function formatCurrency(num) {
return "£" + num.toLocaleString('en-GB', {minimumFractionDigits: 2, maximumFractionDigits: 2});
}