If the calculator doesn’t load within a few seconds, please refresh the page.
Here’s how much you might earn
London (GBP)
Other UK Locations (GBP)
Your Gross Salary:
3,541.47 GBP
Your Take-Home Pay:
2,833.18 GBP
Your Growth Potential Over 6 Years
Year
Gross
Net
Experience Bonus
* Net salary is an estimate based on tax regulations as of 2024.
It doesn’t include additional benefits or allowances you may receive. Projections include an estimated annual inflation rate of 2.5%.
This calculator gives you a good idea of potential earnings, but the actual offer may vary based on your specific skills and experience.
(function() {
// Country-specific data for UK only
const countryData = {
‘uk_lon’: {
baseSalary: 3541.47,
currency: ‘GBP’,
taxRates: {
zusRetirement: 0.12,
zusDisability: 0.0,
zusSickness: 0.0,
healthInsurance: 0.0,
taxRate1: 0.20,
taxRate2: 0.40,
annualTaxThreshold: 50270,
monthlyTaxFreeReduction: 1047.50/12
}
},
‘uk_other’: {
baseSalary: 3079.54,
currency: ‘GBP’,
taxRates: {
zusRetirement: 0.12,
zusDisability: 0.0,
zusSickness: 0.0,
healthInsurance: 0.0,
taxRate1: 0.20,
taxRate2: 0.40,
annualTaxThreshold: 50270,
monthlyTaxFreeReduction: 1047.50/12
}
}
};
// Global constants
const EXTERNAL_RATE = 0.03;
const INFLATION_RATE = 0.025;
function calculateNetSalary(grossMonthly, countryCode) {
const taxRates = countryData[countryCode].taxRates;
const annualGross = grossMonthly * 12;
// Social security contributions (equivalent to ZUS in Poland)
const socialBase = grossMonthly;
const retirementContribution = socialBase * taxRates.zusRetirement;
const disabilityContribution = socialBase * taxRates.zusDisability;
const sicknessContribution = socialBase * taxRates.zusSickness;
const totalSocialContributions = retirementContribution + disabilityContribution + sicknessContribution;
// Health insurance
const healthBase = grossMonthly – totalSocialContributions;
const healthInsurance = healthBase * taxRates.healthInsurance;
// Tax calculation
let taxBase = 0;
let deductionRate = 0.99; // Default work-related expense rate
// UK uses personal allowance differently
deductionRate = 1.0;
taxBase = Math.round((grossMonthly – totalSocialContributions) * deductionRate);
// Tax calculation depending on country type
let tax = 0;
// Progressive tax
if (annualGross 0) {
tax -= taxRates.monthlyTaxFreeReduction;
}
} else {
const monthlyThreshold = taxRates.annualTaxThreshold / 12;
tax = (monthlyThreshold * taxRates.taxRate1) +
((taxBase – monthlyThreshold) * taxRates.taxRate2);
if (taxRates.monthlyTaxFreeReduction > 0) {
tax -= taxRates.monthlyTaxFreeReduction;
}
}
// Ensure tax isn’t negative
tax = Math.max(0, tax);
// Calculate net salary
const netSalary = grossMonthly – totalSocialContributions – healthInsurance – tax;
return Math.round(netSalary * 100) / 100;
}
function calculateSalaryForYear(externalYears, internalYears, countryCode) {
const baseCountrySalary = countryData[countryCode].baseSalary;
// Calculate base with inflation
const inflatedBase = baseCountrySalary * Math.pow(1 + INFLATION_RATE, internalYears);
// Calculate external experience bonus (3% per year)
const externalBonus = externalYears * EXTERNAL_RATE;
// Calculate cumulative internal bonus
let internalBonus = 0;
for (let year = 0; year < internalYears; year++) {
if (year < 5) {
internalBonus += 0.07; // First 5 years: 7% each
} else if (year < 10) {
internalBonus += 0.05; // Next 5 years: 5% each
} else if (year < 15) {
internalBonus += 0.03; // Next 5 years: 3% each
} else {
internalBonus += 0.02; // After that: 2% each
}
}
const totalMultiplier = 1 + externalBonus + internalBonus;
return inflatedBase * totalMultiplier;
}
function formatMoney(amount, currency) {
let formattedValue = amount.toFixed(2).replace(/\B(?=(\d{3})+(?!\d))/g, ",");
return `${formattedValue} ${currency}`;
}
function updateSalary() {
const externalYears = Math.max(0, parseInt(document.getElementById('external-years').value) || 0);
const countryCode = document.getElementById('location').value;
const currency = countryData[countryCode].currency;
// Update starting salary
const startingSalaryGross = calculateSalaryForYear(externalYears, 0, countryCode);
const startingSalaryNet = calculateNetSalary(startingSalaryGross, countryCode);
document.getElementById('result-gross').textContent = formatMoney(startingSalaryGross, currency);
document.getElementById('result-net').textContent = formatMoney(startingSalaryNet, currency);
// Generate projection table
let tableHTML = '';
// Calculate base salary without any bonuses
const baseGrossSalary = countryData[countryCode].baseSalary;
for (let year = 0; year <= 6; year++) {
const grossSalary = calculateSalaryForYear(externalYears, year, countryCode);
const netSalary = calculateNetSalary(grossSalary, countryCode);
// Calculate the same salary but without inflation to isolate the experience bonus
const inflatedBase = baseGrossSalary * Math.pow(1 + INFLATION_RATE, year);
const experienceBonus = ((grossSalary – inflatedBase) / inflatedBase) * 100;
tableHTML += `
`;
}
document.getElementById(‘projection-table’).innerHTML = tableHTML;
}
// Initialize the calculator
function initializeCalculator() {
const externalYearsInput = document.getElementById(‘external-years’);
const locationSelect = document.getElementById(‘location’);
const calculatorElement = document.getElementById(‘salary-calculator’);
const loadingElement = document.getElementById(‘calculator-loading’);
if (externalYearsInput && locationSelect && calculatorElement && loadingElement) {
// Hide loading, show calculator
loadingElement.style.display = ‘none’;
calculatorElement.classList.add(‘loaded’);
// Set up event listeners
externalYearsInput.addEventListener(‘input’, updateSalary);
locationSelect.addEventListener(‘change’, updateSalary);
// Initial calculation
updateSalary();
return true;
}
return false;
}
// Try to initialize immediately
if (!initializeCalculator()) {
// If initial attempt fails, retry a few times
let attempts = 0;
const maxAttempts = 5;
const retryInterval = setInterval(() => {
attempts++;
if (initializeCalculator() || attempts >= maxAttempts) {
clearInterval(retryInterval);
if (attempts >= maxAttempts) {
// Show refresh hint if all attempts fail
const loadingElement = document.getElementById(‘calculator-loading’);
if (loadingElement) {
loadingElement.classList.add(‘show-refresh’);
}
}
}
}, 1000);
}
})();
End of calculator π
Stay updated
Stay up-to-date with us and join 403 people who care about animals in the farming industry.
Thank you
That's it⦠almost! You just need to confirm your email address. Click on the confirmation link we've sent you.
Hi!
We are happy that you are visiting our website and thank you for your interest in helping animals. According to law, we are obliged to inform you that we may be processing your personal data using cookies. Cookies are stored on your device while you are using our website or services. As a non-governmental organisation, we prioritise protecting your privacy. We apologise for any inconvenience this may cause!
Cookies information
You can change the cookie settings in your web browser. If you do not agree to the processing of your personal data by cookies stored on your device, please change the settings in your browser. Otherwise, you will not be able to use the Open Cages Association services.
Data Controller
Data controller of your data is BM Open Cages, London WC1N 3XX
Cookies can be read by our IT systems as well as by systems belonging to other entities whose services we use (e.g. Facebook, Google) - you can see this list in our Privacy Policy.
Purpose of data processing
Your data is processed in order to efficiently use our Open Cages website, ensure security when using Open Cages website, perform traffic analysis on the website and allow you to use social media features (such as, "Like" on Facebook).
We share the data with other entities such as suppliers of social media we use, as well as analytical and advertising systems (see the list of third party entities we might share tour data with in our Privacy Policy).
Don't worry! Many cookies are anonymised - without additional information and it is not possible to identify your identity on that basis
Right of Withdrawal
Your web browser allows the use of cookies on your device by default, so this is why we ask you to agree to the use of cookies on your first visit to the website
You can withdraw your consent to the use of cookies at any time - to do this, change the settings in your web browser - you can completely block the automatic handling of cookies or request notification whenever cookies are stored on your device. Settings can be changed at any time
If you have questions or concerns regarding the processing and protection of your personal data, please contact us at https://opencages.org/privacy-policy
We believe that your visit to our website is an expression of your interest in the activities of Open Cages and care for animal rights.
We are happy that you are with us and we hope that together we will fight for a better world for animals.