← Home

Changelog

Engine updates, parser improvements, and feature releases.

Free calculation covers one file, any accounts

Feature

The free calculation now runs on any single broker file whatever number of accounts it covers, and the results page names the plan that fits. Multi-file uploads still need season access.

New guide to proceeds of disposition

Feature

A new guide explains what proceeds of disposition means, quotes the Income Tax Act and CRA definitions, shows where the figure comes from when a T5008 reports it and when nothing does, and works twelve examples from a plain share sale to gifts, transfers in kind, death, a principal residence, a rental property and the capital gains reserve. The ACB, T5008, Norbert's gambit and options guides now link to it.

New guide to adjusted cost base

Feature

A new guide explains what adjusted cost base is, quotes the Income Tax Act sections that define it, and works eleven examples with the slip boxes and Schedule 3 lines each one lands on. The homepage, methodology, book cost and superficial loss guides now link to it. The compare page also gained a short FAQ.

Public site cleanup from the Semrush audit

Fix

The homepage no longer downloads its hero image twice on a first visit, two T5008 guides link to the CRA page that replaced a retired one, inner pages dropped an empty duplicate home link that screen readers announced twice, each changelog release now has its own heading, five guides split their longest paragraphs, and a new llms.txt lists the public guides for AI search crawlers.

Audit hardening for edge cases and operations paths

Fix

Corporate-action builder inputs now reject oversized Decimal values, import audit row details are capped, unknown API paths return JSON 404s, and imported stock-for-stock mergers now warn about the s. 85.1 rollover path while keeping the taxable default. Edge cases for cash-in-lieu relief, annual ETF factors, zero-position s. 50(1) elections, and Canadian taxable spinoffs were tightened. Affiliate activation, season-open email selection, and referral-credit locks now page and clean up more predictably.

Audit fixes for public content and frontend polish

Fix

ETF statistics now use true medians, the public ETF factor API accepts bare Canadian symbols where a .TO listing is covered, static table headers carry explicit scope attributes, and the 404 page no longer declares a canonical URL. The calculator now warns earlier for large XLSX uploads, preserves T5008 slip comparisons across recalculation, clears saved slip figures on sign-out, validates empty corporate-action builder entries before saving, and uses clearer timeout copy that tells users to check History before rerunning.

Audit fixes for referral credit, refunds, payouts, and checkout guards

Fix

Referral credit refunds now claw back the same expiring buckets the credit would otherwise spend from, Stripe webhook reversals now retry on Supabase patch failures, credit-funded checkouts are serialized per user, season activation email refs are per account, affiliate payout reference retries can finish partial settlements, short referral and affiliate links accept lower-case codes, and duplicate checkout clicks collapse into one request.

Audit fixes for corporate actions, ETF factors, and client comparisons

Fix

Stored bifurcated merger facts now refine cleanly, builder entries for imported spinoffs, split-offs, and mergers now apply to the imported event instead of duplicating it, ETF factor adjustments now follow renamed holding intervals, and accountant prior-year ACB checks now compare against the selected client's own prior-year calculation.

Superficial loss windows now use settlement dates

Engine

Superficial-loss windows now anchor to settlement dates when broker files provide them, matching CRA technical interpretation 2012-0468931C6. Results can change for sales and repurchases near the 30-day boundary. If a file is missing settlement dates, ActiveACB falls back to trade dates for those rows and warns when that fallback could matter.

Creator affiliate track

Feature

Approved creators can now share an affiliate link that gives readers $10 off Standard or Pro and earns commission on a new account's first purchase. Affiliate program details

Referral program adds preparer codes

Feature

Accountant seats now include a client code that gives clients $10 off Standard or Pro while paying no reward to the preparer. Accountant users can also refer other preparers and earn $50 credit when the new preparer buys an Accountant license. Earned referral credit can now be used on any tier.

Email: season activation, referral reward notices, one-click unsubscribe

Feature

ActiveACB now sends account email for season activation, referral reward notices, and the once-a-season opening reminder. Every app-sent email includes a one-click unsubscribe link, and the same preference can be changed from the profile page.

Refer a friend: give $10, get $10

Feature

Referral links now give a friend $10 off their first Standard or Pro season. The referrer receives $10 in ActiveACB credit 7 days after the qualifying purchase, up to 10 rewards per season. Credit can be used on a future Standard or Pro season or on the Pro upgrade.

ETF tax factors now follow ticker renames

Engine

Verified ETF return-of-capital and reinvested-distribution factors now apply to the pooled ticker after a rename. If issuer rows exist under both old and new tickers, identical rows are counted once and conflicting rows are held back with a review warning. Results change for affected books because missed ETF adjustments are now included.

Native split-offs now calculate as dispositions

Engine

Native broker files with surrender-type spinoffs now remove the foreign-dividend inclusion and add the missing disposition at the FMV of shares received. Results change for affected books.

Reconciliation mode compares slips and prior-year ACB

Engine

The T5008 checker now accepts individual slip rows, can match a slip to engine dispositions by symbol, and keeps those typed slip values in this browser only. Reports also include opening positions so signed-in users can compare this year's starting ACB with their newest prior-year closing position.

Adjusted option contract support

Engine

The corporate-action builder now accepts adjusted option roots and OCC deliverables. Superficial-loss checks use those entered terms for split-adjusted call contracts, while rows without entered terms still receive a review warning.

Corporate-action builder v2

Engine

The corporate-action builder now handles split-offs, qualifying mixed-consideration merger allocations, automatic rollover defaults for share-for-share exchanges, Schedule 3 opt-out acknowledgments, and the CRA $200 cash-in-lieu relief choice. Questrade and Wealthsimple corporate-action detections now appear as review hints instead of log-only notices.

Assisted corporate-action builder

Engine

The trade editor now accepts user-entered spinoffs, mergers, and s.50(1) worthless-security elections. ActiveACB validates those facts on the server, stores them through recalculation, and labels the resulting report assumptions as user-entered.

Custom import audit preview shows how your file was read

Parser

The column mapper now has a Verify file step before calculation. It runs a server-side dry read of the staged CSV or XLSX and shows how many rows will import, how many are ignored, which rows are skipped, and which option, split, or ticker rename rows need review. The same audit is saved with the result and appears again from history and trade edits.

First-party campaign attribution is disclosed and bounded

Security

ActiveACB now records which of our own tagged campaign links brought a visitor here, including tagged arrivals before sign-in. The browser keeps the first and most recent campaign labels in localStorage, and calculation or checkout events carry those labels after sign-in. Anonymous tagged landings are stored without an account ID, kept for the same 180-day analytics window, and reported only in aggregate. No third-party analytics script, tracking pixel, advertising cookie, uploaded file data, file name, tax figure, IP address, or device information is added to the event payload.

Download your history before deleting your account

Security

The profile page now offers a history bundle download before you delete anything. It includes the stored calculation records for everyone, adds report exports where the account tier allows them, and uses JSON-only bundles for larger histories within the self-serve export limit. Very large accountant histories are directed to client bundles or support. Deletion wording across the site was rewritten to state plainly what happens. Deleting an account permanently erases your calculation history and every stored report, and afterward the same email cannot be used on the free tier, though buying season access restores it. Restored access does not bring back deleted history. If you delete by mistake, support can lift that restriction on request.

Custom spreadsheet imports now cover dividends, options, splits, and renames

Parser

Files you map yourself are no longer limited to buys and sells. The importer reads dividends, withholding tax, interest, currency conversions, return of capital, and cash in lieu, so supported custom rows run through the same tax engine as native broker rows. Option rows are recognized from standard contract symbols or from explicit expiry, strike, and put or call columns, with exercise, assignment, and expiry handled as lifecycle events rather than ordinary trades. Stock splits and ticker renames can be declared as rows for files that do not already restate them. The mapping panel gained an editor for teaching it the action words your own file uses, and the starter template now ships as a five-sheet workbook with worked examples.

Superficial losses are now measured correctly across a stock split

Engine

When a split fell between a loss sale and the repurchase that triggered the superficial-loss rule, the three limiters in section 54 were comparing share counts recorded on different scales. A consolidation understated the denied loss and a forward split overstated it. Quantities are now scaled by the cumulative split factor between each trade and the sale, so the denied amount is correct regardless of when the split happened. This changes results for anyone whose loss sale and replacement purchase straddle a split.

Client rosters, batch runs, and workpaper packets for accountants

Report

The Accountant tier now has its own dashboard. Clients are kept as a roster, calculations are assigned to them, and a batch runner works through a queue of client files one after another with retry handling for busy periods. Each client's deliverables download as a single organized bundle, and an entire practice downloads as one archive with a manifest describing what it contains. The workpaper packet adds a transaction-level ACB continuity schedule to the PDF, a methodology letter written for a client file, and the filing summary text file that the engine had always produced but never delivered to anyone.

White-label branding on accountant deliverables

Report

Accountants can upload a firm logo and set a firm name alongside the preparer name. These appear on the PDF, the spreadsheet, the filing summary, and the methodology letter, and file names drop the ActiveACB label so the documents read as the firm's own work product. The methodology letter is now a formatted Word document built from a real business-letter template rather than plain text. Long ticker renames and symbol text inside report tables now wrap properly instead of running past the edge of the page.

Fuller disclosure of processors, data location, and professional use

Security

The privacy policy now names every service that handles your data, including the hosting and network providers that were previously unnamed, and states plainly that processing happens in the United States along with what that means for lawful access. The terms gained a data-processing section for accountants handling client records under PIPEDA, a clause covering material you upload, and wording that makes clear a preparer keeps sole professional responsibility for anything they file.

Capacity and reliability work ahead of tax season

Fix

Calculations now run behind a concurrency limit with a bounded queue, so a burst of simultaneous uploads waits a moment instead of competing for memory. A load test against a separate staging copy of the service confirmed that limit holds well beyond the traffic a filing season is expected to bring. Stored results were slimmed by dropping a section that duplicated data already held elsewhere, health checks report more accurately, and the alerting that watches the service was repaired after it was found to be discarding every message it sent.

Security checklist review

Security

A review of the production security checklist confirmed most controls and found three real defects, all now fixed and covered by tests. One of them meant a check protecting the free calculation had never been enforced since it shipped. No customer calculation or stored result was affected.

Spinoffs, expired options, and multi-year ETF factors

Engine

ActiveACB now recognizes all 270 spinoffs on the CRA's list of approved section 86.1 elections, and applies the allocation automatically for nine of them where the published ratio is known. Expired-option reconciliation is bounded by the period your upload actually covers, so a position that closed outside the file no longer produces a warning about data that was never there. ETF tax factors apply across an entire holding period rather than the reporting year alone, which corrects cost-base adjustments on units held for several years. Edited trades keep their contract multipliers and their broker note codes through a recalculation, and the tax-year selector opens on the most recent completed year.

Multi-file selection and readable sign-in errors

Fix

The file picker accepts several files at once and gives each one its own row. Sign-in, sign-up, and password-reset forms no longer show an empty pair of braces where the error message belongs, which is what appeared whenever the authentication service returned a server error. The published sample report was regenerated so it shows the current report format rather than a version from several releases earlier.

Currency conversions inside registered accounts are no longer taxed

Engine

Foreign-exchange conversions carried out inside a TFSA, RRSP, or other registered account were being pooled together with taxable conversions, which could produce a section 39(2) gain or loss that does not exist. Account information is now carried through the whole currency pipeline and registered conversions are filtered out in one place. Where two conversions genuinely cannot be told apart, the result carries a review note instead of being dropped silently. This changes reported foreign-exchange figures for anyone who converted currency inside a registered account.

Clearer tax reports and consistent wording

Engine

Downloadable reports now show the IBKR wash-sale (LD) and speculative-FX disclosures that previously appeared only in the command-line summary, and the spreadsheet's Superficial Losses sheet lists the replacement purchases. Schedule 3 Line 13200 is shown once with a consistent value throughout the report. The trade editor no longer requires a share quantity on dividend, interest, or cash rows, and site wording now consistently describes the one-time season-access purchase.

Executed FX rates, currency withdrawals, fractional splits, and net withholding tax

Engine

Foreign-exchange conversions are now valued at your executed rates (the actual CAD exchanged) rather than Bank of Canada reference rates. Currency withdrawals are treated as transfers to your own accounts instead of taxable dispositions, with a review note for any that paid third parties. Fractional share positions survive splits when your broker did not pay cash in lieu. Same-day withholding-tax rows now net correctly, so reversed withholding never inflates your foreign tax credit. Superficial-loss window calculations account for short sales, and expired-option handling is more precise.

Questrade DRIP, Wealthsimple return of capital, and overlapping uploads

Engine

Questrade DRIP rows are now recorded as share purchases so reinvested distributions enter your cost base instead of being counted as extra income. Wealthsimple return-of-capital distributions now reduce your cost base under s.53(2)(h) rather than being taxed as dividends. Overlapping date-range exports from any broker are de-duplicated (previously IBKR only), and IBKR Flex files using yyyy-MM-dd dates now parse correctly, including year-end settlement dates.

Consolidated IBKR files, expired options, and incomplete-history detection

Engine

Consolidated IBKR Flex files containing multiple account statements are now parsed in full (previously only the first account was read), with duplicate rows between overlapping statements counted once. Worthless option expiries with no broker closing row no longer fail the calculation and are flagged for superficial-loss verification. Sales that exceed the holdings in your upload are now clearly flagged as probable missing history instead of being treated silently as short sales.

Inline manual trade editor

Engine

Calculation results now include an inline editor for correcting, adding, filtering, or deleting trades without modifying and re-uploading the original broker file. Recalculation preserves non-trade income, registered-account treatment, ETF factors, corporate actions, and FX context while replacing the existing history record.

Automatic ETF tax factor adjustments

Engine

ActiveACB now applies verified return of capital and non-cash distribution factors on each issuer record date using the taxable units held at that time. The workflow supports IBKR, Questrade, and Wealthsimple, prevents covered IBKR estimates from being counted twice, and adds a review step for reconciling results before filing.

Production security and dependency hardening

Security

Private Supabase tables now receive fail-closed startup access checks, sensitive history operations remain owner-scoped, and authentication, upload validation, and rate-limit controls were tightened. Python dependencies are locked and the CI pipeline now runs automated tests and vulnerability auditing on every change.

Delete calculation history

Fix

You can now delete individual calculations from history detail. The deletion flow includes a confirmation modal and preserves the existing authenticated history workflow.

Product analytics and retention controls

Security

Added privacy-bounded product analytics events with documented retention and purge behaviour. This improves product visibility without storing uploaded files or calculation payloads.

MFA step-up protection on sensitive pages

Security

Profile, history, and calculation-detail flows now honour MFA step-up requirements consistently. The UI challenge and auth guards were tightened without changing the public marketing pages.

Multi-year FX rate loading fix

Fix

Resolved failures on multi-year uploads where off-year FX data was not being loaded. This improves reliability for full-history statements that span several tax years.

Warning-panel cleanup and prioritization

Report

Warnings are now grouped and surfaced more cleanly so important action items are easier to spot. This reduces noise when reviewing complex calculations with many edge-case notices.

Superficial-loss window and exchange-rate corrections

Engine

The superficial-loss window was corrected to the full 61 days that section 54 requires, counting the 30 days before a sale, the day of the sale itself, and the 30 days after. Foreign-exchange conversions are valued at the Bank of Canada rate for the settlement date rather than the trade date, following the CRA's published position. Currency gains and losses net against capital losses correctly and carry the same figures into the PDF and the exported data. Mergers where the engine holds fewer shares than the broker's corporate-action row are now prorated instead of overstating the exchange.

Free tier and one-time season access

Fix

Every account gets a free calculation, with downloadable reports and multi-account uploads unlocked by a one-time season purchase rather than a recurring subscription. The upgrade prompt appears at the moment a gated feature is reached and explains what it covers, instead of blocking the calculation itself.

Multi-account upload support

Parser

IBKR and Questrade files from multiple accounts can be uploaded together in a single calculation. The engine merges them chronologically and improves cross-account superficial-loss detection.

Raw Trades re-import workflow

Parser

Added support for re-uploading corrected Raw Trades XLSX files. This gives users a direct path to fix broker-parser misses or manual adjustments without rebuilding a workbook from scratch.

Multi-sheet spreadsheet export

Report

Results download as an Excel workbook covering the filing summary, per-disposition capital gains, open positions, superficial losses, foreign exchange, and the raw trades exactly as the parser read them. The workbook is the audit trail behind the PDF, so every number on the summary can be traced back to the rows that produced it.

CRA-ready PDF filing summary

Report

Added PDF export as a first-class report output. This makes it easier to hand results to an accountant or transfer Schedule 3 figures into tax software.

Rate limiting, structured logging, and storage hardening

Security

Request rate limits run on a shared window per endpoint and per address, so one client cannot crowd out everyone else. Request logging was rebuilt as structured records with an explicit list of permitted fields, which keeps uploaded content and personal detail out of the logs by construction rather than by careful writing.

Cross-account superficial-loss engine coverage

Engine

The engine added stronger affiliated-account logic for TFSA and RRSP replacements, including separation of permanently denied losses from deferred ACB adjustments.

Saved calculation history

Report

Calculations run while signed in are saved to an account history with a list view and a detail page for each one. A past result can be reopened and its reports downloaded again later without re-running the upload.

Accounts, sign-in, and account deletion

Security

Accounts arrived with email and password sign-in, access tokens validated against published signing keys, and an email verification step before a calculation will run. The profile page carries an account deletion path that removes stored calculations along with the account itself.

IBKR and Questrade uploads with export guides

Parser

The calculator accepts Interactive Brokers Flex Query XML and Questrade spreadsheet exports, works out which is which from the file itself, and routes it to the matching parser. Step-by-step export guides for both brokers were published alongside, since getting a complete file out of the broker is the step most people get wrong.

Options exercise and assignment linking

Engine

Implemented the four-way CRA options matrix so premiums flow into the correct ACB or proceeds calculation. This closes a major gap for active options traders.

The engine and the calculator go live

Engine

ActiveACB began as a Canadian adjusted cost base engine covering superficial losses, corporate actions, options, foreign currency, and Schedule 3 output, with 544 tests behind it. A web calculator was built over that engine so a broker file could be turned into filing figures in a browser rather than a spreadsheet maintained by hand.