If you hold assets that make a distribution with a record date in tax year X in a non-registered brokerage account in Canada, you will receive a T3 tax slip from your brokerage breaking down the distribution into its constituent parts (e.g., eligible dividends, capital gains, etc.) so you can be taxed properly.
The deadline by which your brokerage must provide you with your T3 is the end of March in year X + 1—a full month after the deadline for every other type of tax slip you're likely to receive. But funds generally upload the tax breakdown for their distributions to the Canadian Depository for Securities (CDS) much earlier, typically in February (for example, the latest upload date for a fund I've invested in, at time of writing, was February 12).
So why do brokerages take so long to prepare your T3? Well, the legal deadline is the end of March, and there isn't exactly any incentive for brokerages to do it earlier… Of course, there is an incentive for you to have it earlier—no point in giving an interest-free loan (assuming you're getting a refund) to the CRA for any longer than necessary!
Thankfully, it's easy enough to just compute the numbers from the breakdowns posted directly by CDS. And thus, early-t3 was born.
For every asset you held in a brokerage account, early-t3 takes tax breakdown data for the distributions made and data on how many units of the asset you held on the record dates and computes your T3 tax slip using operations such as addition and multiplication.
This is intended for my personal use and shared only because it might be useful to someone else. I am a buy-and-hold ETF investor; this probably won't handle complex cases correctly. The program prints a trace of every calculation it performs and you are encouraged to double-check its work. I've double-checked the results for assets I've personally held (VBAL, XBAL, XGRO, ZMMK).
-
Prepare two folders, one to hold distribution information for a tax year and another to hold information on how many units you held on record dates in a tax year.
-
Populate the distribution folder with distribution
.jsonfiles. You can get the raw data from CDS, but must transcribe it yourself (sorry, I didn't want to write a scraper for their PDFs). The JSON format looks like:{ "name": "VBAL", "distributions": [ { "recordDate": "2025-04-01", "paymentDate": "2025-04-08", "total": 0.18885, "actualAmountOfEligibleDividends": 0.03622, "foreignNonBusinessIncome": 0.11177, "otherIncome": 0.05359, "returnOfCapital": 0.00036, "foreignNonBusinessIncomeTaxPaid": 0.01309 } ] }I have already created these JSON files for assets I personally held—please see the
datadirectory. Feel free to re-use my files, use them as an example for the structure of your own files, and/or submit a pull request with distribution data for additional assets. -
Populate the held asset information folder with
.jsonfiles that look like this:{ "account": "Wealthsimple", "VBAL": [ { "date": "2025-04-01", "ownedShares": 2028.5407 } ] }You should have an entry for every record date. There are some examples of the correct structure in the
src/test/resources/ca/carleton/cmail/samhaskins/early_t3/assetsdirectory. -
Run the program. The first command line argument is the path to the distribution data directory you prepared and the second command line argument is the path to the held asset data directory you prepared. The program will generate your T3(s) and print a trace of all computations performed to standard output.
-
If you found this helpful, star the repository.
Available in the releases section. .exe for Windows, .jar for anywhere.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH
REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,
INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR
OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
PERFORMANCE OF THIS SOFTWARE.
Or, in my own words: I am not an accountant. I am not a tax lawyer. I am definitely not your accountant or your tax lawyer. This program is useful to me and I am making it public because it may be useful to others but I do not warrant in any way that it will compute the correct results for any particular situation (particularly esoteric situations).
