TFSA vs RRSP vs FHSA Calculator (Canada)

Compare TFSA, RRSP, and FHSA outcomes using explicit assumptions and after-tax results. Contribution-year RRSP/FHSA tax savings use progressive personal tax on the income you model (current, next year, or hypothetical). Retirement tax remains a planning assumption.

No opinions. No hidden assumptions. Just arithmetic.

Assumptions shown

  • Refund default: RRSP/FHSA refund is modeled as spent unless you toggle reinvestment.
  • Room constraints: Opening TFSA room is user-entered. Opening RRSP room defaults to 18% of current taxable income (prior-year earned-income proxy) plus optional carry-forward, using the same formula as the RRSP Contribution Room calculator; edit the total to override. From simulation year 2, each January adds your specified new TFSA amount and RRSP room equal to min(18% of current taxable income, indexed dollar cap from tax data). Unused room carries forward until used; overflow goes to non-registered.
  • Returns: same net return and fee structure for all accounts; no asset-location modeling.
  • Tax rates: Contribution-year RRSP/FHSA refunds equal the progressive tax delta tax(income, deductions=0) − tax(income, deductions=RRSP+FHSA) from the shared personal-tax engine (cumulative within each tax year). Contribution-year income is modelled as employment income (CPP, EI, and Canada Employment Amount apply where the engine does). Displayed t_now is the starting next-dollar rate for information; it does not set the refund. Withdrawals still use a constant t_ret. Select the tax year above to load the matching official tables.
  • Real dollars: when enabled, growth uses a real return while contribution and room amounts stay at the figures you entered (constant in today's dollars).
  • FHSA: annual room (user input; default $8,000) and a $40,000 lifetime contribution cap are enforced; growth does not count toward the lifetime cap. Contribution carry-forward is not modeled. Qualifying first-home withdrawal is a separate toggle from FHSA eligibility.
  • Non-registered: only refund overflow can be routed to a non-registered bucket; non-registered tax drag is not modeled in this version.
Report an Issue