Inspectable Arithmetic for the TFSA vs RRSP vs FHSA Calculator (Canada)
Version 1.0
Last updated: March 2026
Transparent arithmetic is the operating system of this calculator.
This document publishes the formulae, computational structure, and assumptions used to generate the outputs displayed on the calculator page.
No opinions. No hidden assumptions. Just arithmetic.
Purpose
This calculator compares the after-tax future value of contributing a fixed cash amount to different Canadian registered accounts:
TFSA, RRSP, and FHSA. It models recurring or lump-sum contributions, simple net investment growth, and explicit tax treatment on
contribution and withdrawal under user-supplied marginal tax rates.
Definitions
Let:
- C = contribution amount per period (monthly, annual, or one-time lump)
- T = investment horizon in years
- r = expected annual return before fees (percent)
- f = annual fee drag (percent)
- i = annual inflation rate (percent, optional)
- tnow = current marginal tax rate on contributions (percent)
- tret = marginal tax rate at withdrawal (percent)
- rnet = (r − f)/100 (net nominal annual return, decimal)
- id = i/100 (annual inflation in decimal form)
- rm = monthly nominal rate
- rm,real = monthly real rate (if real mode enabled)
- BTFSA,t, BRRSP,t, BFHSA,t = account balances at month t
- Brefund,t = refund bucket balance at month t (when refunds are reinvested)
Core Equations
1. Net return and monthly rate
Net annual nominal return (after fees):
rnet = (r − f) / 100
Nominal monthly rate:
rm = (1 + rnet)1/12 − 1
If “Show results in real dollars” is enabled, the calculator converts to a real annual rate first:
rreal = \(\dfrac{1 + r_{\text{net}}}{1 + i_d}\) − 1
and then to a real monthly rate:
rm,real = (1 + rreal)1/12 − 1
The engine uses a single monthly rate for all accounts. There is no asset-location modeling (no different returns per account).
2. Contributions and horizon
Time horizon in months:
N = 12T
Contribution schedule:
- Monthly mode: C is contributed each month (C per month).
- Annual mode: C per year, internally modeled as C/12 contributed each month.
- Lump-sum mode: a single contribution C at month t = 0; no further contributions.
3. Refund arithmetic
For any RRSP or FHSA deposit d in a month, the modeled refund is:
refund = d × tnow/100
Refund handling modes:
- Spend refund (default): refund is ignored in the projection (treated as consumed).
- Reinvest refund: refund is added to a global refund bucket Brefund for that strategy in the month it occurs and compounds at the same monthly rate as other balances.
There is one refund bucket per strategy. The calculator does not separately label which portion of Brefund originated from RRSP vs FHSA contributions.
4. Monthly evolution (per strategy)
For each month t = 0,…,N−1, the engine:
- Computes the intended gross contribution Gt for that month based on mode (monthly, annual/12, or lump at t = 0).
- Allocates Gt between TFSA, RRSP, and FHSA according to the strategy and FHSA annual room constraints (see next section).
- Applies refunds on RRSP/FHSA deposits into the refund bucket when “reinvest refund” is selected.
- Applies growth to all balances using the monthly rate.
Growth step (using either rm or rm,real):
BTFSA,t+1 = BTFSA,t(1 + rm)
BRRSP,t+1 = BRRSP,t(1 + rm)
BFHSA,t+1 = BFHSA,t(1 + rm)
Brefund,t+1 = Brefund,t(1 + rm)
FHSA Room and Allocation Rules
5. FHSA annual room
Let:
- R0 = FHSA annual room in year 1 (user input; default 8,000)
- R = FHSA annual room in subsequent years (same as input by default)
For each simulation year y = 1,…,⌈T⌉, FHSA room at the start of the year is:
room1 = R0
roomy = R for y ≥ 2
At each month in year y, any amount assigned to FHSA reduces roomy. If a monthly allocation would exceed roomy, the engine:
- Contributes up to roomy to FHSA.
- Spills the remainder of that month’s contribution to TFSA or RRSP, depending on the strategy.
FHSA lifetime caps and carry-forward rules are not modeled in this version. Only the annual room you specify is enforced.
6. Strategies
The engine simulates several deterministic strategies:
- ALL_TFSA: All contributions go to TFSA.
- ALL_RRSP: All contributions go to RRSP.
- ALL_FHSA (if FHSA eligible): Contributions go to FHSA until roomy is exhausted each year; remainder goes to TFSA.
- FHSA_FIRST_THEN_TFSA (if FHSA eligible): FHSA first up to roomy, then TFSA with any remainder.
- FHSA_FIRST_THEN_RRSP (if FHSA eligible): FHSA first up to roomy, then RRSP with any remainder.
The OPTIMAL strategy is defined as:
- If FHSA is not eligible: the better of ALL_TFSA and ALL_RRSP (by final after-tax value).
- If FHSA is eligible: the better of FHSA_FIRST_THEN_TFSA and FHSA_FIRST_THEN_RRSP (by final after-tax value), with ALL_TFSA, ALL_RRSP, and ALL_FHSA still reported for comparison.
Withdrawals and After-Tax Values
7. Withdrawal tax treatment at horizon
At the end of the horizon (month N), balances are:
BTFSA,N, BRRSP,N, BFHSA,N, Brefund,N
After-tax values by account:
- TFSA: tax-free withdrawals
VTFSA = BTFSA,N
- RRSP: withdrawals taxed at tret
VRRSP = BRRSP,N(1 − tret/100)
\(\displaystyle
V_{\text{FHSA}} =
\begin{cases}
B_{\text{FHSA},N} & \text{if FHSA is eligible and “plan to buy using FHSA” is checked (home-qualified)} \\
B_{\text{FHSA},N}(1 - t_{\text{ret}}/100) & \text{otherwise (FHSA behaves like RRSP)}
\end{cases}
\)
- Refund bucket: always treated as tax-free in this version
Vrefund = Brefund,N
Total after-tax value for a given strategy is:
V_{\text{total}} = V_{\text{TFSA}} + V_{\text{RRSP}} + V_{\text{FHSA}} + V_{\text{refund}}
Allocation Summary
The calculator reports a human-readable “optimal split” sentence based on the simulated strategy that maximizes Vtotal:
- annualContribution: annualized contribution amount under the selected mode (12 × monthly for monthly mode, C for annual, C for lump treated as a one-year contribution).
- fhsaUsedAnnual: estimated FHSA dollar amount used in year 1 (capped at the modeled annual FHSA room).
- remainderAnnual: annualContribution − fhsaUsedAnnual.
- remainderDestination: “TFSA” or “RRSP”, depending on which account receives the modeled remainder in the optimal FHSA-first strategy.
Worked Example (Using Your Last Inputs)
The example below substitutes the last inputs you used on the calculator page (if available from this browser). Values are rounded for readability.
Open the TFSA vs RRSP vs FHSA calculator, enter your assumptions, and then click “Inspect the Arithmetic” to see a worked example here with your values.
Horizon T ≈ years,
nominal return r ≈ ,
fees f ≈ ,
so net annual rnet ≈ .
Monthly rate used in the simulation:
With contribution mode and contribution amount C ≈ ,
the engine simulates N = 12T ≈ monthly steps and allocates up to
per year to FHSA before spilling the remainder to
.
Assumptions and Limitations
- All simulations use monthly time steps with deterministic compounding and fixed contribution schedules.
- Investment returns, fees, and (optionally) inflation are modeled as constant over the full horizon.
- RRSP and FHSA refunds are either treated as immediately spent (default) or reinvested in a TFSA-like bucket; actual tax timing and withholding are more complex in practice.
- Tax rates tnow and tret are user-supplied and held constant; the calculator does not derive marginal rates from taxable income.
- FHSA modeling uses only the annual room you specify; lifetime FHSA contribution caps, carry-forward mechanics, and detailed withdrawal conditions are not modeled.
- Non-registered (taxable) accounts are not included in this version; it is an account-to-account comparison between registered options.
- All results are rounded for display; internal calculations use full floating-point precision.
If any discrepancy is identified between this documentation and the calculator output, the arithmetic in the engine governs.