Calculation Methodology
Every rule behind the ActiveACB ACB calculator, with CRA references and known limitations.
1. Adjusted Cost Base Pooling
Canadian tax law (ITA s. 47(1)) requires that identical securities held in a taxable account form a single ACB pool. When you buy, the total ACB increases by the full cost (price × quantity + commission). When you sell, you remove a proportional slice of the pool: ACB removed = (ACB per share) × (quantity sold). The remaining shares carry the adjusted per-share ACB forward. The rules themselves, with worked examples, are in the guide to adjusted cost base.
For accurate results, upload your full trading history from account inception. If part of your history is genuinely unavailable, reconstruct the missing early trades in the starter template from the column mapper guide and upload it alongside your broker files; the engine derives opening positions and opening foreign-cash balances from the trades before your tax year. These pooled figures are what the CRA expects on your return; see T5008 and Schedule 3 for how they replace the broker’s Box 20 numbers.
CRA reference: IT-387R2 “Meaning of Identical Properties”
2. Superficial Loss Rules
A superficial loss (ITA s. 54) occurs when you sell a security at a loss and you, or an affiliated person, buys the same or identical property within the 61-day window: 30 days before the sale, the day of the sale, and 30 days after. For a complete breakdown with worked examples, see the superficial loss rule guide.
Denied loss = min(window buys, shares held at window end, shares sold at a loss).
The denied amount is added to the ACB of the replacement shares (deferred, not permanent).
- Identical property: Any security with the same CUSIP or a call option on the same underlying. ITA s. 54 para (i) deems a right to acquire property identical to it, and CRA 2008-0284441C6 applies that rule to call options. IT-387R2 remains a secondary identical-property reference.
- Affiliated persons: Spouse or common-law partner, corporation controlled by you, and registered accounts (TFSA, RRSP, RRIF, FHSA) you contribute to. The engine detects cross-account superficial losses when you upload multiple accounts in the same session.
- TFSA/RRSP replacement: If the replacement purchase is inside a registered account, the denied loss is permanently lost (not added to the ACB of replacement shares), because the registered account’s ACB is irrelevant for tax purposes. The engine flags this separately.
- December-to-January look-forward: The 30-day window extends into January. The engine scans the full window even when it crosses a tax-year boundary.
CRA references: ITA s. 54, s. 40(2)(g)(i); IT-387R2
3. Foreign Currency (FX) ACB
Every purchase or sale of a foreign security requires converting to CAD at the exchange rate on the settlement date. The exchange rate used is the Bank of Canada nominal rate for that date (or the annual average if the daily rate is unavailable). Cost converts at the buy-date rate and proceeds at the sell-date rate; broker gain/loss reports typically convert net P&L at a single rate, which is not the CRA method. For explicit currency conversions, the engine uses the actual rate at which your broker executed the conversion.
USD cash held in your account is itself a foreign currency and subject to FX gain/loss rules. The engine maintains a running ACB pool for USD (and any other foreign currency) just like a security pool. Each purchase of USD (when you buy a USD security) adds to the pool at the rate paid. Each sale of USD (when you sell a USD security) removes a proportional slice and computes a gain or loss. See USD cash ACB Canada for a worked example.
CRA reference: ITA s. 39(1), 39(1.1); Folio S5-F4-C1
4. Options
The CRA treats options premiums and the shares acquired or disposed through them as linked events. The engine applies the following four-way matrix:
- Buy a call, then exercise: Premium paid increases the ACB of the shares acquired on exercise.
- Write (sell) a call, shares assigned away: Premium received increases the proceeds of the shares disposed of.
- Buy a put, then exercise: Premium paid reduces the proceeds of the shares disposed of.
- Write (sell) a put, shares assigned to you: Premium received reduces the ACB of the shares acquired.
- Expiry: A purchased option that expires worthless is a capital loss equal to the premium paid. A written option that expires unexercised is a capital gain equal to the premium received.
The engine links exercise and assignment events to the original option opening trade by matching symbol, expiry, strike, and option type within your uploaded data.
CRA reference: IT-479R “Transactions in Securities”; ITA s. 49
5. Corporate Actions
- Splits and consolidations: Share count scales by the factor; ACB per share scales inversely so total ACB is unchanged.
- Spinoffs: A portion of the parent’s ACB is allocated to the new entity based on the relative fair market value at the time of the spinoff. Standard cost-base allocation spinoffs are applied automatically using the ratio in your broker's corporate action data; taxable spinoffs that require a deemed disposition are flagged for manual review rather than calculated automatically.
- Mergers and name/CUSIP changes: Name and CUSIP changes rename the pool without resetting ACB. Qualifying share-for-share exchanges use the automatic rollover by default. Reporting the gain on Schedule 3 opts out where the statute allows it. Canadian amalgamation rollovers are mandatory. Cash-only and unallocated mixed-consideration mergers are treated as dispositions at the consideration received.
- Return of capital (ROC): ROC distributions reduce the ACB of the security. If ROC reduces ACB below zero, the excess is a capital gain in that year. Verified annual per-unit ROC and reinvested-distribution factors are applied automatically for covered Canadian ETFs, with a review panel during each calculation. See Known Limitations below for coverage.
- Fractional shares, cash-in-lieu: Treated as proceeds from a partial disposition of the position.
- Worthless securities: ITA s. 50(1) allows an election to treat a security as disposed of at nil proceeds. The engine processes worthless-security elections and detects reversal events within the 30-day window.
6. T1135 Foreign Property Warnings
If the total cost of your foreign property (securities, real property, and other specified foreign property) exceeds $100,000 CAD at any point in the tax year, you are required to file Form T1135. The engine monitors the running cost of foreign-currency securities and flags a warning when the $100,000 threshold is approached or exceeded based on your uploaded data.
The warning is informational. The engine does not generate a T1135 form. Use CRA My Account or tax software for that.
CRA reference: ITA s. 233.3; Form T1135
7. Verification, Reconciliation, and Corrections
- Broker Reconciliation (IBKR): for IBKR uploads, the broker's own realized P&L per symbol is compared against the engine's Schedule 3 figure, with each difference explained by flags such as superficial loss, return of capital, phantom distributions, FX method, options, and short sales. Shown on results, in history, and in the PDF.
- T5008 checker: enter your slip's Box 21 and Box 20 totals and the checker compares them against the engine's figures entirely in your browser, with delta explanations. Works for any broker.
- Report detail: the PDF shows every disposition with date, quantity, proceeds, ACB, ACB per share, gain, and superficial-loss flags, plus replacement-purchase linkage, short sales, FX results, broker reconciliation, and a Notes and Assumptions page. Figures are consistent to the penny across pages. Dual-listed journal transfers carry a wash-sale disclosure, and a disclosure is added when speculative FX positions are present but not calculated.
- Correcting trades: an inline editor on the results page lets you fix, add, or delete rows with per-action validation and re-run the calculation without re-uploading. You can also enter a prior-year net capital loss to apply against the year's gains; the entry survives trade edits and re-runs.
8. Test Coverage
The engine runs over 2,800 automated tests on every release. Test categories include:
- ACB pooling: buy/sell sequences, partial fills, average cost across multiple lots
- Superficial loss: basic denial, three-limiter edge cases, cross-account TFSA/RRSP, December-to-January look-forward, options as identical property
- FX: USD pool ACB, $200 exemption, multi-currency, annual average vs. daily rate
- Options: all four exercise/assignment cases, expiry, same-day linking, multi-contract fills
- Corporate actions: splits, reverse splits, spinoffs, mergers, ROC, name changes, worthless-security elections and reversals
- Multi-account: cross-account superficial loss detection, merged pool ACB
- Multi-year: carry-forward ACB from prior years, prior-year net capital loss application
- Parser: IBKR Flex Query XML edge cases, Questrade XLSX edge cases, Wealthsimple CSV edge cases, multi-file deduplication
9. Known Limitations
- Supported brokers: Interactive Brokers (Flex Query XML), Questrade (Activity Report XLSX), and Wealthsimple (Activity Export CSV) are parsed natively. Any other broker's trade-history CSV or XLSX imports through the column mapper. Mapped generic files import trades, and with an Amount column mapped they also import dividend, withholding, interest, and FX conversion rows. Options are recognized per row from a standard option symbol or explicitly mapped option columns, including exercise, assignment, and expiry. Stock splits and ticker renames import from generic files when their action words are explicitly mapped to those row types; mergers for shares and spinoffs are not read from generic files.
- ETF/fund distribution adjustments: Automated coverage is limited to the verified issuer dataset: more than 215 Canadian ETFs for tax years 2022 through 2025 (2026 factors publish in early 2027, and current-year runs warn accordingly). Covered funds have per-unit ROC and reinvested-distribution amounts applied automatically and shown with issuer sources in the review panel. For funds outside the dataset, enter the per-unit amounts from the issuer’s tax factor sheet in the same panel. See the Canadian ETF tax factor lookup for the public factor table and ETF return of capital and ACB for how these adjustments work.
- Cryptocurrency: Not supported. CRA guidance on crypto ACB is still evolving and the asset class requires a separate calculation approach.
- Non-calendar tax years: Not supported. The engine assumes January 1 to December 31 for all tax year calculations.
- Taxable spinoffs: Native surrender-type spinoffs are calculated as dispositions at the FMV received. Pure taxable spinoffs still create foreign dividend income at FMV, and standard cost-base allocation spinoffs are handled.
- Short selling: Tracked separately from long pools and reported on its own line, including cover trades that cross tax years. Complex synthetic short positions involving multiple instruments may require manual review.
- Professional advice: Unusual corporate actions, cross-border estates, section 85 rollovers, and other non-standard events may require a tax professional to review the output.