USS cost sharing
Summary of proposed changes
Member contributions to increase from 8% to 8.8% of salary from 1 April 2019
Further increases to member contributions to be phased in at 1 October 2019 (10.4%) and 1 April 2020 (11.7%)
Employer contributions to increase to 19.5% of salary from 1 April 2019, followed by 22.5% from 1 October 2019 and 24.9% from 1 April 2020
8% of member contributions from salary above the defined benefit threshold (2018/19: £57,216.50) to continue to be saved in the USS Investment Builder, with the excess of these member contributions supporting defined benefits in the USS Retirement Income Builder
The 1% employer match into the USS Investment Builder to be discontinued from 1 April 2019
Model
Caveat: this will only give a rough estimate. It isn't very elegant and it probably contains errors. If you find an error you can @josstified or as this is a notepad, fork the model and refine it.
Current salary £Salary above threshold £
viewof totalSalary = html`<input type="range" value="36000" step="100" min="1000" max="100000">`
Estimated future salary based on % payrise annually, late 2018: £ , late 2019: £ late 2020: £Salary above threshold late 2018: £ late 2019: £ late 2020: £
Salary is capped at 100,000 to avoid dealing with pension contributions cap
Select your level of contribution into the match scheme %
viewof matchLevel = html`<input type="number" value="0" min="0" max="5">`
Employee contributions
html`<table><tr><th>Timeframe</th><th>Contribution rate</th><th>Pre tax salary</th><th>Contribution (monthly)</th><th>Pre tax salary after contribution</th></tr> <tr><th>Now</th> <td>${(contributionRates[0])}%+${matchLevel}%</td> <td>£${Math.round(monthly(totalSalary))}</td> <td>£${Math.round(monthly(totalSalary)*((contributionRates[0]+matchLevel)/100))}</td> <td>£${Math.round(monthly(totalSalary)*(1-((contributionRates[0]+matchLevel)/100)))}</td> </tr> <tr><th>From April 2019</th> <td>${contributionRates[1]}% ${salaryAboveThreshold>0?'('+addRate+')':''}</td> <td>£${Math.round(annualSalaries[1]+annualSAT[1])}</td> <td>£${Math.round(annualSalaries[1]*(contributionRates[1]/100)+(annualSAT[1]*0.08))}</td> <td>£${Math.round(annualSalaries[1]*(1-(contributionRates[1]/100))+(annualSAT[1]*0.92))}</td> </tr> <tr><th>From October 2019</th> <td>${contributionRates[2]}%${salaryAboveThreshold>0?'('+addRate+')':''}</td> <td>£${Math.round(annualSalaries[2]+annualSAT[2])}</td> <td>£${Math.round(annualSalaries[2]*(contributionRates[2]/100)+(annualSAT[2]*0.08))}</td> <td>£${Math.round(annualSalaries[2]*(1-(contributionRates[2]/100))+(annualSAT[2]*0.92))}</td></tr> <tr><th>From April 2020 (to Oct)</th> <td>${contributionRates[3]}%${salaryAboveThreshold>0?'('+addRate+')':''}</td> <td>£${Math.round(annualSalaries[2]+annualSAT[2])}</td> <td>£${Math.round(annualSalaries[2]*(contributionRates[3]/100)+(annualSAT[2]*0.08))}</td> <td>£${Math.round(annualSalaries[2]*(1-(contributionRates[3]/100))+(annualSAT[2]*0.92))}</td> </tr> <tr><th>From April 2020 (to Oct)</th> <td>${contributionRates[3]}%${salaryAboveThreshold>0?'('+addRate+')':''}</td> <td>£${Math.round(annualSalaries[3]+annualSAT[3])}</td> <td>£${Math.round(annualSalaries[3]*(contributionRates[3]/100)+(annualSAT[3]*0.08))}</td> <td>£${Math.round(annualSalaries[3]*(1-(contributionRates[3]/100))+(annualSAT[3]*0.92))}</td> </tr> </table>`
*salary increases are based initially on current 2% pay offer and increments taking place in October annually- evenly across all pay grades although in reality this is likley to be weighted with higher grades receiving <2%. You can vary the rate below.
Payrise
viewof payrise = html`<input type="number" value="2.0" min="0" step="0.1" max="10" >`
Employer contributions
This is more complicated than I thought so will change when I have the more info. For now it attempts to illustrate the total cost to employer related to your salary
html`<table><tr> <th>Timeframe</th><th>Contribution rate (CR)</th><th>Pre tax salary (monthly)</th><th>Contribution related to your salary*</th><th>Extra cost as a result of increase in CR</th></tr> <tr> <th>Now</th> <td>${employerCR[0]}% </td> <td>£${Math.round(totalMonthlySalaries[0])}</td> <td>£${Math.round(totalMonthlySalaries[0]*employerCR[0]/100)}</td> <td>0</td> </tr> <tr><th>From April 2019</th> <td>${employerCR[1]}% </td> <td>£${Math.round(totalMonthlySalaries[1])}</td> <td>£${Math.round(totalMonthlySalaries[1]*employerCR[1]/100)}</td> <td>£${Math.round(totalMonthlySalaries[1]*(employerCR[1]-employerCR[0])/100)}</td></tr> <tr><th>From October 2019</th> <td>${employerCR[2]}% </td> <td>£${Math.round(totalMonthlySalaries[2])}</td> <td>£${Math.round(totalMonthlySalaries[2]*employerCR[2]/100)}</td> <td>£${Math.round(totalMonthlySalaries[2]*(employerCR[2]-employerCR[0])/100)}</td> </tr> <tr><th>From April 2020 (to Oct)</th> <td>${employerCR[3]}% </td> <td>£${Math.round(totalMonthlySalaries[2])}</td> <td>£${Math.round(totalMonthlySalaries[2]*employerCR[3]/100)}</td> <td>£${Math.round(totalMonthlySalaries[2]*(employerCR[3]-employerCR[0])/100)}</td> </tr> <tr><th>From Oct 2020 (again assuming +2% pay)</th> <td>${employerCR[3]}% </td> <td>£${Math.round(totalMonthlySalaries[3])}</td> <td>£${Math.round(totalMonthlySalaries[3]*employerCR[3]/100)}</td> <td>£${Math.round(totalMonthlySalaries[3]*(employerCR[3]-employerCR[0])/100)}</td> </tr></table>`
*Employer pays the contributions rate shown of your salary to USS. However, not all of the contribution above threshold goes into your DC pot, plus there are contributions related to deficit recovery
*All figures are rounded.
threshold=57126.5
salary=totalSalary<=threshold?totalSalary:threshold
salaryAboveThreshold=totalSalary>threshold?totalSalary-threshold:0
addRate=8
monthly = (s) => (s/12)
contributionRates=[8,8.8,10.4,11.7]
employerCR=[18,19.5,22.5,24.9]
annualSalaries=payIncreases.map(x=>(x*salary>threshold?monthly(threshold):monthly(x*salary)))//this is monthly not annual!
totalAnnualSalaries=payIncreases.map(x=>(Math.round(x*totalSalary*100)/100))//this may round in a weird way for some values
totalMonthlySalaries=payIncreases.map(x=>monthly(x*totalSalary))
annualSAT=payIncreases.map(x=>x*salary>=threshold?monthly((x*salary-threshold)+(x*salaryAboveThreshold)):0)
compound = (n) => (Math.pow(1+(payrise/100),n))
payIncreases= [1, compound(1),compound(2),compound(3)]
satrate=0.12