How the KiwiSaver calculators work
The formulas, the assumptions and every test the engine must pass before the site is published.
Rules as at 10 November 2026.
Two figures, and why they differ
Every projection shows two figures. The annual statement figure follows Schedule 7A of the Financial Markets Conduct Regulations 2014, the formula every KiwiSaver provider must use on your annual statement. The year-by-year model runs one year at a time, so it can include the move to 4% on 1 April 2028 and work out ESCT and the government contribution for each year.
The figures differ because the annual statement follows the Schedule 7A formula, which keeps today’s contribution rates to 65 and rounds to the nearest $1,000, while the year-by-year model also includes the move to 4% on 1 April 2028 and works out ESCT and the government contribution for each year.
The Schedule 7A formulas
N is 65 minus your age, rounded to the nearest whole year. m is this year’s contributions from you and your employer (after ESCT), n is the government contribution, p is your balance now. Midpoints round up.
Balance at 65 (when g is not equal to k)
c = m × ((1+g)^N − (1+k)^N) / (g − k) + n × ((1+g)^N − 1) / g + p × (1+g)^N
Balance at 65 (when g equals k)
c = m × N × (1+g)^(N−1) + n × ((1+g)^N − 1) / g + p × (1+g)^N
In today’s dollars
b = c / (1+d)^N, rounded to the nearest $1,000
Weekly to age 90
r = b × (7 / 365.25) × (h − d) × (1+h)^(s−e−0.5) / ((1+d)^0.5 × ((1+h)^(s−e) − (1+d)^(s−e))), rounded to the nearest $10
Assumptions
| Assumption | Value | Source |
|---|---|---|
| Return to 65, after fees and tax (Defensive) | 1.5% | source |
| Return to 65, after fees and tax (Conservative) | 2.5% | source |
| Return to 65, after fees and tax (Balanced) | 3.5% | source |
| Return to 65, after fees and tax (Growth) | 4.5% | source |
| Return to 65, after fees and tax (Aggressive) | 5.5% | source |
| Inflation (d) | 2% | source |
| Pay growth (k) | 3.5% | source |
| Return after 65 (h) | 2.5% | source |
| Withdrawal age (e) | 65 | source |
| Payments stop at age (s) | 90 | source |
| Government contribution | 25c per $1, up to $260.72 a year | source |
| Income cap for the government contribution | $180,000 | source |
| Default employee rate | 3.5% now, 4% from 1 April 2028 | source |
| Employer minimum | 3.5% now, 4% from 1 April 2028 | source |
| First home: must remain | $1,000 | source |
The year-by-year model
Each year from your age to 65 the model adds your contributions, your employer’s contribution after ESCT and the government contribution, then the year’s return on the balance. Pay grows by 3.5% a year.
Your rate and your employer’s minimum follow the law: 3.5% now and 4% from 1 April 2028 (the model applies the step from its third year). If you choose 4%, 6%, 8% or 10%, your rate stays there and your employer’s minimum still steps up.
ESCT is worked out each year from your pay plus your employer’s contribution, using these bands: 10.5% up to $18,720, 17.5% up to $64,200, 30% up to $93,720, 33% up to $216,000, 39% over $216,000. The government contribution is 25 cents per dollar up to $260.72, nothing over $180,000, and stops at 65.
Fees in the fees calculator are taken off the assumed return, and member fees off the balance each year. Today’s dollars take out 2% inflation a year.
With pay growth and the 2028 step switched off, the model matches the Schedule 7A formula to the cent. That check runs before every publish.
What the calculators do not include
- Part-year government contributions, for people who join or turn 16 or 65 during the year. The proration formula in the Income Tax Act has not been confirmed, so test GC10 stays marked as unverified.
- Which tax year’s income the $180,000 cap is tested on. That depends on when your tax return is filed, so it is explained, not calculated (tests GC6 and GC7).
- Savings suspensions, hardship withdrawals, market ups and downs, and changes to the law after 10 November 2026.
Engine tests
These checks run every time the site is built and before every publish. If any fails, nothing is published. Results from the build on 10 November 2026: 46 passed, 0 failed, 3 skipped.
| Test | What it checks | Kind | Result | Source |
|---|---|---|---|---|
| GC1 | governmentContribution {"ownContributions":1042.86,"eligibleDays":365,"daysInYear":365,"taxableIncome":60000,"age":30} | Official example | Pass | source |
| GC2 | governmentContribution {"ownContributions":500,"eligibleDays":365,"daysInYear":365,"taxableIncome":60000,"age":30} | Derived from the rule | Pass | source |
| GC3 | governmentContribution {"ownContributions":3000,"eligibleDays":365,"daysInYear":365,"taxableIncome":60000,"age":30} | Derived from the rule | Pass | source |
| GC4 | governmentContribution {"ownContributions":1042.86,"eligibleDays":365,"daysInYear":365,"taxableIncome":180000,"age":40} | Official example | Pass | source |
| GC5 | governmentContribution {"ownContributions":1042.86,"eligibleDays":365,"daysInYear":365,"taxableIncome":180001,"age":40} | Official example | Pass | source |
| GC6 | incomeTestYear {"creditYear":"2025/26","returnFiledOrFinalisedBy30June":true,"currentYearIncome":175000} | Official example | Skipped | source |
| GC7 | incomeTestYear {"creditYear":"2025/26","returnFiledOrFinalisedBy30June":false,"priorYearIncome":178000} | Official example | Skipped | source |
| GC8 | governmentContribution {"ownContributions":0,"employerContributions":3000,"eligibleDays":365,"daysInYear":365,"taxableIncome":60000,"age":30} | Official example | Pass | source |
| GC9 | governmentContribution {"ownContributions":1042.86,"eligibleDays":365,"daysInYear":365,"taxableIncome":12000,"age":17,"creditYear":"2025/26"} | Derived from the rule | Pass | source |
| GC10 | governmentContribution {"ownContributions":2000,"eligibleDays":181,"daysInYear":365,"taxableIncome":60000,"age":30,"note":"joined 1 Jan 2026"} | Derived from the rule | Skipped | source |
| P1 c | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"growth"} | Derived from the rule | Pass | source |
| P1 b | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"growth"} | Derived from the rule | Pass | source |
| P1 lump sum | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"growth"} | Derived from the rule | Pass | source |
| P1 weekly | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"growth"} | Derived from the rule | Pass | source |
| P2 c | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"balanced"} | Derived from the rule | Pass | source |
| P2 b | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"balanced"} | Derived from the rule | Pass | source |
| P2 lump sum | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"balanced"} | Derived from the rule | Pass | source |
| P2 weekly | fmaProjection {"age":30,"balance":20000,"contributions":5000,"govContribution":260.72,"fundType":"balanced"} | Derived from the rule | Pass | source |
| P3 c | fmaProjection {"age":55,"balance":80000,"contributions":3000,"govContribution":260.72,"fundType":"defensive"} | Derived from the rule | Pass | source |
| P3 b | fmaProjection {"age":55,"balance":80000,"contributions":3000,"govContribution":260.72,"fundType":"defensive"} | Derived from the rule | Pass | source |
| P3 lump sum | fmaProjection {"age":55,"balance":80000,"contributions":3000,"govContribution":260.72,"fundType":"defensive"} | Derived from the rule | Pass | source |
| P3 weekly | fmaProjection {"age":55,"balance":80000,"contributions":3000,"govContribution":260.72,"fundType":"defensive"} | Derived from the rule | Pass | source |
| P4 c | fmaProjection {"age":25,"balance":1000,"contributions":4000,"govContribution":0,"fundType":"aggressive"} | Derived from the rule | Pass | source |
| P4 b | fmaProjection {"age":25,"balance":1000,"contributions":4000,"govContribution":0,"fundType":"aggressive"} | Derived from the rule | Pass | source |
| P4 lump sum | fmaProjection {"age":25,"balance":1000,"contributions":4000,"govContribution":0,"fundType":"aggressive"} | Derived from the rule | Pass | source |
| P4 weekly | fmaProjection {"age":25,"balance":1000,"contributions":4000,"govContribution":0,"fundType":"aggressive"} | Derived from the rule | Pass | source |
| P5 | contributionGrowth {"monthly":200,"wageGrowth":0.035,"years":[1,2]} | Official example | Pass | source |
| F1 | annualisedOtherCharges {"weeklyAdminFee":2.5,"monthlyMemberFee":10} | Official example | Pass | source |
| FH1 | firstHomeMax {"balance":50000,"australianTransferred":5000} | Derived from the rule | Pass | source |
| FH2 | firstHomeEligible {"membershipMonths":35,"previousWithdrawal":false,"ownedBefore":false} | Derived from the rule | Pass | source |
| FH3 | firstHomeMax {"balance":800,"australianTransferred":0} | Derived from the rule | Pass | source |
| H1 | hardshipMax {"balance":30000,"crownContributions":2600} | Derived from the rule | Pass | source |
| E1 | emigrationMax {"destination":"UK","monthsSinceLeaving":12,"balance":40000,"governmentContributions":3000,"australianTransferred":0} | Derived from the rule | Pass | source |
| E2 | emigrationMax {"destination":"Australia","balance":40000,"governmentContributions":3000} | Derived from the rule | Pass | source |
| SS1 | savingsSuspensionAvailable {"monthsSinceFirstContribution":8,"hardship":false} | Official example | Pass | source |
| SS2 | savingsSuspensionLength {"monthsSinceFirstContribution":24,"requestedDays":30} | Official example | Pass | source |
| consistency: year model = Schedule 7A with flat pay | yearByYear | Consistency | Pass | source |
| consistency: growing pay within 2% of Schedule 7A | yearByYear | Consistency | Pass | source |
| election: current-law scenario equals the existing year-by-year model exactly | yearByYear {"schedule":"current"} | Election scenario | Pass | source |
| election: current law is 3.5% each until 2028, then 4% each, with the government contribution | policyYear {"id":"current","years":"2026 to 2070"} | Election scenario | Pass | source |
| election: National 5.5% each in 2031, 6% each in 2032 and after | policyYear {"id":"national","year":2032} | Election scenario | Pass | source |
| election: Labour employee 4% and employer 6% in 2033 (employer 5% in 2030) | policyYear {"id":"labour","year":2033} | Election scenario | Pass | source |
| election: Opportunity 5% each in 2032 and 6% each from 2036 (our assumed timetable) | policyYear {"id":"top","year":2032} | Election scenario | Pass | source |
| election: ACT government contribution paid in 2026, none from 2027, rates unchanged | policyYear {"id":"act","year":2027} | Election scenario | Pass | source |
| election: ACT no tax on earnings grosses 3.5% up to 3.5% / (1 - 28%) for a $70,000 earner | policyYear {"id":"act","year":2027,"pay":70000} | Election scenario | Pass | source |
| election: PIR 10.5% to $15,600, 17.5% to $53,500, then 28% | pirFor {"taxable":[15600,15601,53500,53501,70000]} | Election scenario | Pass | source |
| election: all scenarios give the same balance in the first year (2026) | yearByYear {"year":2026} | Election scenario | Pass | source |
| election: page balances and differences are computed by the engine | election {"age":30,"salary":70000,"balance":20000} | Election scenario | Pass | source |
| election: extra from you in 2032 is 2% of pay under National, 0 under Labour and ACT | election {"year":2032,"salary":70000} | Election scenario | Pass | source |
Open data
The rules behind every calculator are published as a JSON file at /data/kiwisaver-rules-2026-27.json. It holds every rate, cap, date and assumption with its source, plus the test cases.
Licensed under Creative Commons Attribution 4.0 International (CC BY 4.0). You may share and adapt it, including commercially, if you credit “KiwiSaver Calculator NZ (kiwisavercalculator.co.nz)” and link to this page.