Inspect the Arithmetic — TFSA Contribution Room Calculator
Version 1.0
Last verified: August 2026
Transparent arithmetic is the operating system of this calculator.
This document publishes the formulae, eligibility rules, and assumptions used to estimate TFSA contribution room on the calculator page.
No opinions. No hidden assumptions. Just arithmetic.
Back to Calculator
Purpose
The calculator estimates available TFSA contribution room for a chosen as-of year from annual CRA dollar limits, lifetime contributions, and withdrawals. It is an estimate mode: it does not reconstruct a transaction-by-transaction history.
Definitions
Let:
- Y0 = eligibility start year (first calendar year the person was eligible for a TFSA)
- Y = as-of year (the year for which room is being estimated)
- L(y) = CRA annual TFSA dollar limit for calendar year y
- Clife = lifetime TFSA contributions entered by the user
- Wprior = withdrawals made in years before Y (up to 31 December of Y − 1)
- CY = contributions made in year Y
- WY = withdrawals made in year Y
- RY = estimated available room in year Y
- RY+1 = projected room for year Y + 1 if no further contributions are made
Formulae
1. Eligibility start year
TFSA room begins in 2009, the first year of the program. The calculator suggests an eligibility start year from birth year as:
Y0 = max(2009, birth year + 18)
Rationale: CRA TFSA eligibility requires being a Canadian resident who is 18 or older. Room is not granted for years before 2009 or before age 18.
Limitation: The birth-year suggestion does not know residency history. If the person became a resident later, or was otherwise ineligible in the year they turned 18, the eligibility start year must be set manually.
2. Cumulative entitlement
Total entitlement = Σ L(y) for y = Y0 … Y
Rationale: Unused annual room carries forward. The estimate adds every published annual limit from the first eligible year through the as-of year.
Limitation: If a year is missing from the stored limit table, that year’s limit is treated as $0. Unused room from years before eligibility is not included.
3. Available room this year
RY = total entitlement − Clife + Wprior − CY
Rationale: Contributions reduce room. Withdrawals from prior years have already been added back on the following 1 January, so they increase the current-year estimate. Withdrawals in year Y are excluded from RY.
The January 1 add-back is the rule this formula encodes. CRA states that amounts withdrawn from a TFSA in a year are added back to contribution room at the beginning of the following year, not immediately.
4. Projected room next year
RY+1 = RY + L(Y + 1) + WY
Rationale: If no further contributions are made, next year’s room is this year’s remaining room, plus the next published annual limit, plus this year’s withdrawals (which add back on 1 January of Y + 1).
Limitation: If year Y + 1 is not in the stored limit table, L(Y + 1) = 0 and the projection omits that year’s new room.
5. Over-contribution amount
Over-contribution = max(0, −RY)
Negative available room is reported as an over-contribution amount. This page does not compute the 1% monthly tax on excess TFSA amounts. That arithmetic lives on the TFSA Over-Contribution Penalty Calculator methodology.
Assumptions
- Annual limits are the CRA dollar limits stored in
/assets/data/tfsa_limits.json (2009 through the latest published year in that file).
- The user-entered lifetime contribution and withdrawal totals are complete and correctly dated (prior-year vs this-year).
- Eligibility is a single start year. Partial-year residency, multiple non-resident periods, and successor-holder or exempt-contribution rules are not modeled.
- Investment growth, transfers, and qualifying transfers do not change contribution room in this estimate.
- Internal arithmetic uses floating point. Display rounding is to the nearest dollar.
- This is an educational estimate. CRA My Account is the record that governs actual room.
Implementation notes
- All financial math lives in
calculators/tfsa-room/engine.js (calculateTFSARoom).
- The page UI reads engine results. It does not re-implement the formulas.
- Limits are loaded at runtime from
/assets/data/tfsa_limits.json.
If any discrepancy is identified between this documentation and the calculator output, the arithmetic in the engine governs.
Sources and References