Inspect the Arithmetic — Canada Capital Gains Tax Calculator

Version 2.0
Last verified: August 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 answers: how much additional income tax will this capital gain cause, given income before the gain?

Primary model (default): progressive incremental personal tax. The calculator runs the shared Canada personal-tax engine twice — once without the capital gain and once with it — then reports additional tax as tax after minus tax before.

Optional model: manual marginal-rate estimate. Taxable (included) gain × one combined marginal rate you enter. That path is labelled as a sensitivity check; it does not walk brackets.

It is an educational tool only. It does not replicate every CRA rule for loss carryovers, reserves, special elections, or full T1 detail.

This version does not subtract outlays and expenses of disposition (such as selling commissions or legal fees); users should reflect those manually in their gross gain inputs if they want a closer estimate.

Definitions

Let:

Primary Model: Progressive Incremental Tax

1. Gross Capital Gain

The primary input is gross capital gain G. Optionally, proceeds P and adjusted cost base A can fill G as:

G = P − A

If G ≤ 0, the calculator treats the result as a capital loss for this simplified view: included amount = 0 and additional tax = 0. Loss carryovers are not modelled.

2. Principal Residence Exemption (Educational Toggle)

If PRE is checked and G > 0, included taxable gain and additional tax are set to 0. The gross gain is still shown. Real eligibility depends on CRA rules; the toggle does not test those rules.

3. Inclusion Rate (Progressive Mode)

Progressive mode uses the shared engine constant CAPITAL_GAINS_INCLUSION_RATE = 0.5 (50%). It is not user-editable in that mode.

If G ≤ 0 or PRE is true:
  Gtaxable = 0
Else:
  Gtaxable = G × 0.5

4. Taxable Income Before the Gain

Ibefore is the user’s taxable income before this capital gain. It is passed to computePersonalTax as source-neutral otherIncome (not employment income), with employment and self-employment incomes set to 0. The shared engine therefore does not generate CPP or EI premiums/credits or the Canada Employment Amount from Ibefore alone. Ordinary federal/provincial brackets, the basic personal amount, and other generally applicable mechanics still apply.

This is intentionally an approximation of the pre-gain tax position. It does not reproduce every source-specific credit or deduction that could appear on a T1. The calculator answers how much additional income tax the capital gain creates given that starting taxable-income level.

5. Additional Tax = Tax After − Tax Before

Two personal-tax runs share the same year, province, and Ibefore:

Taxbefore = totalIncomeTax(otherIncome = Ibefore, capitalGains = 0)
Taxafter = totalIncomeTax(otherIncome = Ibefore, capitalGains = max(0, G) when PRE is false and G > 0; else 0)
ΔTax = Taxafter − Taxbefore

The shared engine applies inclusion and brackets internally. This calculator’s primary headline figure is ΔTax — not “one marginal rate × the whole gain.” A large gain can cross brackets; credits and bracket stacking are reflected in the two full runs.

6. Effective Rate on Gross Gain

If G > 0:
  EffectiveRategross = ΔTax / G
Else:
  EffectiveRategross = 0

When shown, “marginal rate after the gain” is the engine’s marginal rate at the after-gain income level — the rate on the next dollar — not a rate applied to the entire gain.

Optional Model: Manual Marginal-Rate Estimate

Manual mode is a labelled sensitivity. It does not use province brackets or the shared progressive run for the tax figure. Combined marginal rate and inclusion rate must be between 0% and 100%; values outside that range throw a clear validation error rather than producing silent nonsense.

If G ≤ 0 or PRE is true:
  TaxableGain = 0; TaxOwing = 0
Else:
  TaxableGain = G × (rincl / 100)
  TaxOwing = TaxableGain × (tmarg / 100)

Inclusion rate and marginal rate are user-supplied in this mode. Useful for “what if my combined rate were X%.” Not a substitute for the progressive incremental estimate when brackets matter.

Inputs, Parsing, and Edge Cases

Implementation Notes

If any discrepancy is identified between this documentation and the live calculator engine, the engine’s arithmetic (calculateProgressiveCapitalGainsTax / calculateManualMarginalRateEstimate) is the source of truth. This page will be updated to match the engine.

Sources and References