Retirement Income Projector

How These Numbers Are Calculated

A plain-language walkthrough of what the projector does each year, for each person, to turn your inputs into the table and charts. For the shorter version, see the disclaimer at the bottom of every page.

This tool produces a planning estimate, not a tax return or a guarantee. Real CRA and Service Canada rules have more exceptions and finer detail than are modelled here — see "What's simplified" at the end of each section.

1. The order of operations, each year

For every year of the projection, and for each person separately, the calculator works through these steps in order:

  1. Grow each account balance by its expected return rate and add that year's contribution (if the person is still contributing).
  2. If the person has reached their RRSP→RRIF conversion age, calculate that year's mandatory minimum RRIF withdrawal from the balance at the start of the year.
  3. Calculate CPP, OAS, and any other pension income the person is entitled to that year.
  4. Add up guaranteed income (CPP + OAS + other pension + mandatory RRIF minimum). If that's already enough to meet the household's spending target, no further withdrawals are made.
  5. If it's not enough, draw additional money from accounts in your chosen order (default: non-registered, then RRSP/RRIF, then TFSA) — Person 1's accounts before Person 2's within each tier — until the target is met or accounts run out.
  6. For a couple with pension income splitting on, find the split of eligible pension income between spouses that maximizes their combined after-tax cash for the year.
  7. Calculate GIS (income-tested, based on income excluding OAS).
  8. Calculate federal and provincial income tax and the OAS clawback on the resulting income.
  9. What's left is that person's after-tax cash for the year. The household total is compared against the spending target to show a surplus or shortfall.

2. Income sources, one at a time

Employment / other income (before retirement)

If you enter an amount here, it counts as taxable income in every year before that person's retirement age, and stops entirely once they reach it. Its purpose is to cover working-year spending so the withdrawal solver doesn't start drawing down retirement accounts before retirement has actually begun.

For as long as it applies, employee CPP (including the CPP2 second additional contribution introduced in 2024) and EI premiums are also deducted from net pay, using the rates, exemption, YMPE/YAMPE, and maximum insurable earnings on file for the scenario's tax year (indexed forward with inflation for later years, same as tax brackets). Base CPP + EI generate an approximate federal and provincial tax credit; the CPP2 portion is instead deducted from taxable income, matching its real treatment.

This is a flat placeholder for "whatever this person earns while still working," not a career-earnings or CPP-contribution model — it doesn't affect the CPP estimate you enter separately. Leave it at $0 for a scenario that already starts at retirement.

CPP (Canada Pension Plan)

You enter your own estimate of what CPP would pay at age 65, taken from your Service Canada "Statement of Contributions" or My Service Canada Account — the calculator does not try to reconstruct this from an earnings history.

If you start CPP earlier or later than 65, that estimate is adjusted:

Once it starts, the amount is carried forward and increased with inflation each year, same as in real life (CPP is indexed to the cost of living).

OAS (Old Age Security)

OAS starts from the current maximum annual amount (higher for ages 75+), then adjusted by:

The OAS "clawback" (recovery tax)

If a person's net income for the year is above a threshold, 15% of the amount over that threshold is repaid, up to the full OAS amount. This is calculated fresh every year from that year's projected income — it's a real, well-known feature of OAS, not a penalty this tool is inventing.

GIS (Guaranteed Income Supplement)

GIS is a top-up for lower-income seniors who are already receiving OAS. You don't enter anything for it — it's calculated automatically each year from projected income (excluding OAS itself, which is not counted in the GIS income test).

For a couple where both people receive OAS, GIS is based on their combined income and split between them. This tool uses a straight-line approximation of the real reduction formula, calibrated to match the published maximum benefit and the income level where GIS reaches zero — the real formula is a stepped table, so amounts near the edges may differ slightly from the official GIS estimator.

Other pension income

A workplace pension (e.g. a defined-benefit plan) starts at the retirement age you enter, and grows with inflation each year if you checked "Indexed to inflation" — otherwise it stays flat in dollar terms, the way many private pensions actually work.

RRSP / RRIF

Your RRSP is assumed to convert to a RRIF at the age you specify (71 by default, matching the legal deadline). From that point on, a mandatory minimum withdrawal applies every year, calculated as that year's opening balance × the CRA's prescribed age-based percentage (rising from about 5.3% at 71 to 20% at 95+). This minimum is fully taxable income whether or not you actually need the cash.

If more money is needed to meet the spending target, additional (voluntary) withdrawals are also fully taxable, same as the minimum.

Non-registered (taxable) investment accounts

Each non-registered account has a "% of growth taxed annually" setting, since real non-registered accounts usually generate a mix of interest/dividends (taxed every year, whether or not you withdraw) and unrealized capital gains (taxed only when you sell). That percentage of the account's growth each year is added straight to that person's taxable income for the year — it's not paid out as cash, but the resulting tax has to come from somewhere, so it reduces after-tax household cash exactly like real T5/T3 income would.

The rest of the account's growth stays deferred. When money is withdrawn, that same percentage of the withdrawal comes out tax-free (it was already taxed as it accrued), and 50% of the remaining, still-deferred portion is a taxable capital gain, consistent with the CRA's 50% inclusion rate.

This is a proportional approximation, not full lot-by-lot adjusted-cost-base tracking — it assumes the account's mix of interest/dividend vs. capital-gain growth stays roughly constant over time, which is reasonable for a steady buy-and-hold portfolio but won't capture a big shift in holdings. No separate dividend tax credit is modelled (dividends are taxed here at the plain marginal rate, like interest), which slightly overstates tax for a dividend-heavy account. Leave the percentage at 0 for an account that's entirely unrealized capital gains until you sell — that reproduces the older, fully tax-deferred behaviour.

TFSA

Grows and withdraws completely tax-free, and is not counted in either the OAS clawback test or the GIS income test — exactly as in real life. This is why the withdrawal order defaults to spending down the TFSA last: it's the most valuable dollar-for-dollar, so it's typically best preserved as long as possible.

3. Income tax

Tax is calculated separately for each person (Canada doesn't have joint filing), using:

Not modelled: provincial versions of the age amount / pension income credits, and various smaller provincial credits. This means provincial (and therefore total) tax is usually a slight underestimate for retirees, outside Ontario and Quebec's specific rules above.

"Effective Tax Rate" column

The Effective Tax Rate shown in the tables is income tax ÷ taxable income for that year — the average rate across all of that year's income. It is not the marginal rate (the rate that would apply to one more dollar earned), which is typically higher once you're already in a given bracket. Taxable income here means CPP + OAS + other pension + RRIF withdrawals + the taxable share of non-registered growth/withdrawals, minus any CPP2 deduction; it excludes TFSA withdrawals and GIS, which are never taxed.

4. Pension income splitting (couples)

For a couple, eligible pension income — other pension income, plus RRIF withdrawals once the recipient is 65 or older (the same income that qualifies for the federal pension income credit) — can be reallocated up to 50% from one spouse to the other, for tax purposes only. Real money never moves between spouses; only the tax calculation changes, exactly like electing pension income splitting on a real T1 return.

When this is turned on for a scenario (the default, and recommended, setting), the calculator searches every year for the split percentage that maximizes the couple's combined after-tax cash — taking into account tax, the OAS clawback, and GIS together, since moving income between spouses can affect all three. It only ever helps or leaves things unchanged: "don't split" is always one of the options being compared, so it can't make a couple worse off.

You can turn this off per scenario (in the Household section of the scenario form) if you'd rather see the numbers without it, e.g. to compare against a plan that assumes no splitting.

5. Keeping pace with inflation

Everything in the projection is nominal-dollar (not adjusted back to "today's dollars" in the output). Your starting account balances, CPP/OAS estimates, and spending target are all real numbers today; the tool grows tax brackets, credits, CPP/EI payroll figures, and OAS/GIS/CPP figures forward at the same assumed inflation rate as everything else, since in reality all of these are legislated to move roughly with the cost of living. This keeps the projection internally consistent without needing the tax tables to be re-entered every single year.

6. Filling the gap: the withdrawal order

Whenever guaranteed income falls short of your spending target, the calculator finds the smallest additional withdrawal (using your chosen account order) that closes the gap exactly — not more, not less — by solving for it directly rather than using a fixed formula. This means it automatically accounts for how an extra withdrawal changes tax, the OAS clawback, and GIS in the same year.

This is a sensible default ordering, not a fully tax-optimized withdrawal strategy. It does account for pension income splitting between spouses (see above), but it does not otherwise try to minimize lifetime tax across a household beyond that — a financial planner could likely sequence withdrawals even more efficiently for your specific situation.

7. Your spending target: simple vs. detailed

Every scenario needs a target for after-tax household spending to measure income against each year. There are two ways to set it, chosen per scenario:

Simple mode uses a single "desired annual spending" figure that optionally grows with inflation every year. It's fast to set up and a reasonable starting point.

Detailed mode replaces that single number with an Expense Model — an itemized household budget: recurring categories (housing, food, transportation, and so on) plus one-time expenses in specific years. Expense Models are managed on their own page, separate from any one scenario, and each of your logins only sees its own models.

The point of keeping models separate from scenarios is reuse and live comparison: build one budget once, then pick it from any number of scenarios — "retire at 62" and "retire at 65" can both use the same "Base household budget" model so you're comparing apples to apples. Editing a model updates every scenario currently using it, immediately (there's no per-scenario snapshot) — so if you want to compare two different budgets, create two models rather than editing one back and forth.

Each recurring category has its own annual amount, entered as a monthly or yearly figure (the form converts monthly entries to yearly automatically), and can optionally be limited to a range of ages — for example, a "travel" category active only from age 65 to 80, or a mortgage payment that ends at a chosen age. If a category doesn't set its own inflation rate, it grows at the scenario's default rate; otherwise it uses its own rate, which is useful for costs that outpace or lag general inflation, like health care.

One-time expenses (a new roof, a vehicle, a wedding gift) are entered as a description, an amount, and the specific calendar year they occur, and are added to that single year's spending target only.

The detailed total for each year is simply the sum of every active category's indexed amount plus any one-time expenses landing in that year. It's used as the spending target exactly the way the simple flat figure would be — everything else in the projection (guaranteed income, withdrawal solving, tax) works identically either way. Ages used for start/end windows are always Person 1's age of whichever scenario the model is being used in, so couples should frame category windows relative to the first person on each scenario.

8. RRSP meltdown (optional tax minimization)

RRSP/RRIF withdrawals are fully taxable whenever they happen. Left alone, a RRIF's mandatory minimum withdrawal (a percentage that rises with age) can eventually force out more taxable income each year than a person actually needs to spend — especially once CPP and OAS are also flowing — pushing them into a higher tax bracket, or triggering the OAS clawback, later in retirement than would have been necessary. "RRSP meltdown" is the common name for deliberately withdrawing more RRSP than required during earlier, naturally low-income years (for example, the gap between retiring and CPP/OAS starting) to use up cheap tax brackets while they're available, instead of leaving that income to be forced out later at a higher rate.

Turn this on per scenario (in the Tax Optimization section of the scenario form) with a single setting: a target taxable income, in today's dollars, that grows with inflation the same way your spending target does. Each year, after the spending target has been funded from your chosen withdrawal order, the calculator tops up each person's own RRSP/RRIF withdrawal (beyond the mandatory minimum) until their taxable income — after pension income splitting, for couples — reaches that ceiling, or their RRSP/RRIF balance runs out, whichever comes first. Because the rule is self-limiting (it stops as soon as CPP, OAS, and RRIF minimums alone reach the ceiling), it naturally winds down and eventually stops doing anything once other income catches up — no separate age cutoff is needed.

Since this extra withdrawal wasn't needed for spending, its after-tax proceeds are swept into the non-registered account rather than treated as spent, and taxed going forward under that account's own "% of growth taxed annually" setting like any other non-registered money — unless the optional TFSA routing described below is also turned on.

This is a bracket-filling heuristic, not a full lifetime tax optimizer — it doesn't search for the mathematically optimal withdrawal schedule, and it doesn't know your GIS eligibility or OAS clawback exposure ahead of time. Setting the target ceiling too high can increase near-term OAS clawback or reduce GIS instead of helping; the scenario form's "Use OAS clawback threshold" button fills in a common, conservative starting point (the level at which OAS starts being clawed back) — it isn't a recommendation for your specific situation, and the Household Summary tab's "Total Lifetime Tax" figure is the best way to check whether a given target actually reduces total tax paid across the whole projection.

Optional: route melted-down proceeds into a simulated TFSA

In reality, the more tax-efficient destination for melted-down RRSP money is usually a TFSA — once inside, it grows and can later be withdrawn completely tax-free, forever, instead of eventually being taxed under non-registered rules. With RRSP meltdown turned on, a second checkbox lets you route each person's own after-tax meltdown proceeds into a simulated TFSA contribution room first, so you can compare "meltdown only" against "meltdown + TFSA routing" for the same scenario.

Because this tool has no way to know a person's real pre-existing TFSA room — that depends on a lifetime of contribution and withdrawal history entirely outside anything the calculator collects — it models a simplified version instead: starting the year each person reaches their own retirement age, a fixed amount of new room (the "TFSA annual contribution limit" reference figure, editable on the Reference Data page and indexed forward with inflation like the OAS/GIS figures) becomes available every year, carried forward if unused. Each melting-down person's own share of that year's after-tax proceeds is contributed into their own room first, reducing it; only any leftover beyond available room still spills into the non-registered account as before. Room is tracked per person, not shared between spouses.

Two things this simplified model deliberately does not do: it doesn't know or use any real TFSA room you already have from contribution room accumulated since 2009 (or whenever you turned 18) — if you already have substantial unused room, this feature will understate how much can be routed to TFSA in the early years; and it doesn't model room being restored the calendar year after a TFSA withdrawal (a real CRA rule). Both are documented simplifications, not bugs — use the "Meltdown → TFSA" and "TFSA Room Left" columns on each person's Detail tab to see exactly how much was routed and how much simulated room remains each year, and treat the feature as directional (does TFSA routing help this scenario's total lifetime tax?) rather than a precise forecast of your real available room.

9. RESP (Registered Education Savings Plan, optional)

A scenario can optionally include one or more RESPs — for example, money you plan to contribute to a grandchild's education savings during retirement. Each RESP is set up in the "RESP (Registered Education Savings Plan)" section of the scenario form, one card per beneficiary.

An RESP is deliberately modelled as a separate asset from your own retirement accounts: it is never part of the withdrawal order, never counted toward your household's "Total Assets," and its growth and eventual payout are never part of your household's after-tax income. The only place an RESP touches your own numbers is the contribution — every year the account is still contributing, that amount is added to the year's total cash requirement (alongside your spending target) and funded from your own accounts through the scenario's normal withdrawal order, exactly like any other spending need. It's shown as its own "RESP Contribution" column on the Household Summary tab so it's never hidden inside "Account Withdrawals."

Contributions, the CESG grant, and the two lifetime caps

Each year, while the beneficiary's age is at or under the account's "Contributions stop at beneficiary age" setting (17 by default, matching the real CESG eligibility cutoff), the calculator contributes the account's annual contribution amount (optionally indexed to inflation), then adds the federal Canada Education Savings Grant on top — 20% of that year's contribution by default, capped at $500 per beneficiary per year and $7,200 per beneficiary over the account's lifetime. Real contributions also have a $50,000-per-beneficiary lifetime cap. Both lifetime totals start from the "already made / already received to date" figures you can enter for an RESP that existed before the projection begins, so an RESP that's already well-funded correctly stops receiving new grant money sooner. All four of these figures (match rate, annual cap, lifetime CESG cap, lifetime contribution cap) are federal parameters, editable on the Reference Data page — and like OAS/GIS, they're organized by benefit year, but unlike OAS/GIS they are not grown forward with inflation, since the real CESG program's dollar figures are fixed by law rather than indexed.

Drawdown (Educational Assistance Payments)

Once the beneficiary reaches the account's "Drawn down starting at beneficiary age" setting (18 by default), the calculator pays the remaining RESP balance out in level installments over the chosen number of drawdown years (4 by default) — each year's payment is simply the balance remaining divided by the years remaining in the drawdown window, so the account reaches exactly $0 at the end of it. This money is treated as leaving the family unit for the beneficiary's education: it is not added back to your household's after-tax cash or account balances anywhere in the projection.

Documented simplifications: the real-world taxation of Educational Assistance Payments in the student's own hands (typically minimal or zero, given a student's usually low income) isn't modelled, since it has no effect on your own household's numbers either way; and the calculator doesn't enforce the RESP's real maximum-lifespan rule (a plan must be collapsed by a set number of years after it's opened) — if you set a very late drawdown window, the model will simply keep growing the balance until then. Use the "RESP" tab on a scenario's projection page for the full year-by-year breakdown per beneficiary (contribution, CESG grant, growth, withdrawal, and both lifetime running totals).

10. Monte Carlo simulation

The main projection (everything above) grows every account at a single, flat "Expected return" every single year. That's useful for comparing scenarios apples-to-apples, but real markets don't move in a straight line — and the order good and bad years arrive in matters, not just their average. A 20% drop the year you retire and start withdrawing does far more lasting damage than the same drop ten years into a solid recovery, even though the average return over the full period is identical. This is usually called sequence-of-returns risk, and a flat-rate projection can never show it.

"Run Monte Carlo Simulation" (from a scenario's page) addresses this by re-running the exact same year-by-year engine many times — 100, 200, or 300 times, your choice — each time using a randomly generated return for every account, every year, instead of the flat rate. It then reports the spread of outcomes across all those runs instead of one line.

How the random returns are generated

Reading the results

The headline number is the success rate: the percentage of simulated market histories in which the household's assets lasted the entire projection without running out. The chart shows, for each year, the 10th/25th/50th(median)/75th/90th percentile of total household assets across all trials — the shaded band is the "typical" range (25th–75th percentile), and the dashed lines show a wider range of possible outcomes.

Setting every account's Return volatility to 0 reproduces the flat-rate deterministic projection exactly, in every trial — a useful sanity check, and a reminder that Monte Carlo is an additional lens on the same underlying model, not a different one. Return volatility only affects this page; it has no effect on the main projection, which always uses the flat Expected return.

Looking for the full technical detail (exact formulas, seed data sources, and how to update the tax tables in future years)? See README.md in the application folder.