If you've received tokens through vesting – as a founder, an early investor, an employee, an advisor, or via an airdrop with vesting attached – you have a tax problem most people misunderstand. Each tranche of vesting tokens is its own tax event. Not TGE. Not when you eventually sell. Each individual unlock or claim – depending on your jurisdiction – is a separate income-tax moment, valued in your local currency at that exact moment.
This guide explains how the tax actually works across major jurisdictions (and where they meaningfully differ), what software like Koinly, CoinTracker, and TurboTax need from you, and how Vestream collapses what is normally a 6-hour January spreadsheet into a 60-second download.
Tax rules for vesting tokens vary materially by country and continue to evolve. Use this guide to understand what data you need; verify the specific tax basis (claim-date vs unlock-date) and rates with a local accountant before filing.
The Core Rule (And the Big Caveat)
The general two-step pattern across most major tax authorities looks like this:
- 1At the taxable receipt event: the value of the tokens counts as ordinary income, taxed at your marginal rate. Value = (number of tokens) × (token's market price in your fiat currency at that moment).
- 2At each later sale: the difference between your sale price and the price at the receipt event counts as capital gain or loss. The cost basis for the capital-gains calculation is the same value you reported as income.
The big caveat is what counts as the 'receipt event'. This is where jurisdictions diverge:
| Jurisdiction | Receipt event | Practical consequence |
|---|---|---|
| United States (IRS) | When you claim – i.e. tokens move from the vesting contract into your wallet | If tokens are unlocked but you haven't claimed, no tax event yet (subject to constructive-receipt arguments) |
| United Kingdom (HMRC) | When tokens are beneficially owned – typically the unlock date, even if unclaimed | You can owe tax on tokens you haven't physically received in your wallet yet (similar to RSU treatment) |
| Australia (ATO) | Generally when you have legal ownership and control – often the unlock date | Similar to UK – unlocked-but-unclaimed tokens may be taxable |
| Canada (CRA) | When tokens are received, with employment-context cases nuanced | Closer to US treatment for most cases; talk to an accountant if employment-related |
| Germany | When tokens are received; tax-free after 1-year hold | Closer to US treatment; the holding-period clock starts at receipt |
When you claim 10,000 tokens at $5 each: $50,000 of income (taxed in the year of receipt under your local rules). When you sell them later at $8: $30,000 of capital gain. The $5 cost basis comes from the receipt event – get it wrong, and your eventual capital-gains calculation is wrong too.
This means the value-at-receipt is the most consequential single number in your year-end vesting tax position. Get it right and everything else flows. Get it wrong – by using TGE price, year-end price, or "I'll figure it out later" – and you risk under- or over-paying both income tax now AND capital-gains tax later.
Vestream's Data Model: We Capture Claim Events
Important to understand what Vestream tracks: we index every on-chain claim transaction – the moment tokens leave the vesting contract and arrive in your wallet. For US filers, that's exactly the right tax event. For UK / Australia filers whose receipt event is the unlock date (not the claim), our claim-date data is still useful – but you'll need to map it forward to the unlock dates yourself or with your accountant.
- If you're in the US, Canada, Germany, most EU: Vestream's claim-date data IS the tax event. Use the CSV exports as-is.
- If you're in the UK or Australia: Vestream's claim-date data tells your accountant when you actually received the tokens. Your unlock schedule (also visible per-stream on the dashboard) tells them when those tokens became beneficially owned. They reconcile both for the right tax basis.
- Either way: the on-chain claim record is the canonical source of truth for what landed in your wallet, when, and at what price. That's the foundation every tax basis builds on.
We're scoping unlock-date tax-basis exports for HMRC / ATO users – surfacing both the unlock schedule AND the claim history side-by-side, so the right basis is one click away regardless of jurisdiction. If this matters to you, ping us via the contact form so we know to prioritise it.
What Counts as a 'Claim Event'?
A claim is any on-chain transaction that moves tokens from a vesting contract to your wallet. Different protocols call it different things:
| Protocol | On-chain event name | Notes |
|---|---|---|
| Sablier | Withdraw / withdrawMax | Continuous streaming – claim any time after start |
| Hedgey | PlanRedeemed | Per-plan redemption against an NFT |
| UNCX (V3 + VM) | WithdrawEvent / TokensReleased | Each unlock is a discrete event |
| Unvest | Claim | Per-milestone or pro-rata draws |
| Superfluid | VestingCliffAndFlowExecuted | Cliff payouts are discrete; continuous flow accrues every second |
| PinkSale | LockUnlocked | Cycle-based unlocks |
| Streamflow / Jupiter Lock | Withdraw instruction | Solana – recorded against the program account |
The on-chain claim transaction is what Vestream indexes. Whether the claim is also the tax event depends on your jurisdiction (see the table further up). For US/Canada/Germany filers, the claim is the tax event. For UK/Australia filers, the unlock date can be earlier – your accountant maps Vestream's claim records back against the unlock schedule to assign income to the right tax year.
The Five Pieces of Information You Need Per Claim
For any tax-software import or accountant handover, every claim event needs to carry these five fields:
- 1Date and time (UTC, to the second – block timestamp).
- 2Token symbol and contract address (so software can match cost basis on later sales).
- 3Quantity claimed, in whole token units (not raw on-chain wei).
- 4USD value at claim, computed from the historical price on that exact date.
- 5Transaction hash (proof, and the unique key that prevents double-counting).
Tax software groups by token symbol + chain to track cost basis lots over time. If you skip the contract address, two tokens with the same symbol on different chains get merged. If you skip the tx hash, re-imports double-count. If you skip the historical price, the software guesses – usually wrong.
How to Compute Historical Prices (And Why You Probably Shouldn't)
The historical-price lookup is where most people lose hours of tax-prep time. CoinGecko and CoinMarketCap both offer a free API that returns historical daily price data; Etherscan and BscScan offer historical price for the chain's native token but not arbitrary ERC-20s.
If you wanted to build the lookup yourself, the procedure is roughly:
- 1For each claim event, take the block timestamp and convert to a UTC date.
- 2Hit CoinGecko's
/coins/{id}/history?date=DD-MM-YYYYwith the token's CoinGecko ID for that date. - 3Read
market_data.current_price.usd. - 4Multiply by the token quantity to get USD-at-claim.
- 5Cache the result so you don't re-query for the same (token, date) twice.
- 6Handle missing prices (illiquid tokens, pre-listing dates) with a manual cost basis or by accepting nearest-day.
It's about 200 lines of code per dimension – token resolution, rate-limit-aware fetching, caching, fallback ladder. Vestream does this once, server-side, with a 7-day fallback window and price-confidence flags so you know which numbers are exact-day vs nearest-day vs missing.
What Koinly, CoinTracker, and TurboTax Each Want
Each tax-software platform accepts a slightly different CSV shape. Vestream generates all three formats from the same underlying claim_events table:
| Platform | Import path | Required columns |
|---|---|---|
| Koinly | Settings → Wallets → Add → Custom CSV | Date, Sent Amount + Currency, Received Amount + Currency, Label, TxHash, Description |
| CoinTracker | Add Wallet → Generic CSV upload | Date, Received Quantity + Currency, Sent Quantity + Currency, Fee, Tag, Tx Hash |
| TurboTax | Investments → Crypto → Upload CSV | Symbol, Quantity, Date Acquired, Date Sold, Cost Basis, Proceeds (vesting income goes in via 'other income' – Vestream's TurboTax format flags each row appropriately) |
All three CSVs need the same five fields per claim – date, token, quantity, USD value, tx hash – they just label and order them differently. Vestream's Exports tab generates each format exactly to spec.
The 60-Second Workflow on Vestream
- 1Sign in at vestream.io and add the wallets that received your vesting tokens.
- 2Open the Exports tab and hit Refresh claims. Vestream queries every supported protocol on every supported chain, indexes every withdrawal event since the wallet's first transaction, and computes USD-value-at-claim for each one.
- 3Pick a tax year from the dropdown (e.g. 2025).
- 4Click the format your accountant uses (Vestream generic / Koinly / CoinTracker / TurboTax). The CSV downloads instantly.
- 5Optional: open the Income Statement for a P&L-style summary, then click Year-end PDF to generate a printable report you can email to your accountant directly.
Without Vestream, the equivalent is: open every protocol's UI, scroll back through your claim history, copy each claim into a spreadsheet, look up the historical USD price for each row by hand, paste into the right tax-software CSV format, hope you didn't miss any. We've timed it – about 6 hours for a 50-claim year, with material risk of getting the historical prices wrong.
Edge Cases Worth Knowing
- Continuous streams (Sablier, Superfluid): when you call
withdraw, you receive everything that has accrued since the last withdrawal. That single transaction is one tax event – you don't pro-rate it across the days the tokens were accruing. The block timestamp of the withdraw is the canonical receipt date. - Cliff unlocks: if a 6-month cliff unlocks 25% on day 180, the tax event timing depends on jurisdiction. In the US, the tax event happens when you claim those tokens, valued at the claim-date price. In the UK / Australia, the tax event can be the unlock date itself (day 180) regardless of when you claim. The price you use therefore differs: claim-date price for US, unlock-date price for UK/AU. Vestream surfaces the claim record; your accountant applies the right rule.
- Cancelled vests: if a stream is cancelled by the sender (cancellable vests), tokens already claimed are still income for the year they were claimed – the cancellation doesn't reverse it.
- Re-vesting / topped-up vests: some protocols allow the sender to add tokens to an existing vest. New tokens have their own clock; new claims against them are new tax events, valued at the new claim date.
- Non-EVM chains (Solana): Streamflow and Jupiter Lock store cumulative claimed amounts on-chain rather than per-event logs. Vestream uses a snapshot-diff model – the first refresh after you sign up captures pre-existing history as one baseline event; subsequent refreshes track new claims individually.
Timing, Forms, and When Returns Are Due
Some quick reference on key jurisdictions (verify with a local accountant):
| Jurisdiction | Treatment of vesting income | Filing deadline | Reporting form |
|---|---|---|---|
| United States | Ordinary income at marginal rate | April 15 (year +1) | Schedule 1 / Schedule D for sales |
| United Kingdom | Income tax + NICs at receipt | January 31 (year +1) | SA100 / SA108 |
| Canada | Ordinary income at receipt | April 30 (year +1) | T1 General |
| Australia | Ordinary income at receipt | October 31 (year +1) | Tax return (TR) / Crypto schedule |
| Germany | Other income at receipt; CGT-free after 1y hold | July 31 (year +1) | Anlage SO |
Vestream does not provide tax advice. Use the data we surface to populate forms with your accountant. The CSV exports map cleanly to the import flows of Koinly, CoinTracker, and TurboTax – which themselves map to the right line items on the relevant local return.
FAQ
Frequently Asked Questions
Are vested-but-unclaimed tokens taxable?
Depends on your country. In the US (and most of the EU + Canada + Germany), the answer is no – taxation triggers on the claim transaction, when tokens move into your wallet. In the UK (HMRC) and Australia (ATO), tokens that have unlocked but not yet been claimed CAN already be taxable – the test is beneficial ownership, not physical receipt. If you're a UK/AU filer with unlocked-but-unclaimed tokens at year-end, talk to a local accountant before assuming there's no liability.
What if the token had no liquid market on the claim date?
You'll need a manual cost basis. Vestream flags these as 'missing' price confidence. Common practice is to use the most recent OTC sale price, the project's most recent funding-round valuation, or zero – talk to your accountant before settling on a method.
Can I just enter total annual income at year-end and skip the per-claim detail?
Tax software needs per-event detail to track cost basis lots for capital-gains calculations on later sales. Lumping everything into one annual receipt loses the per-token cost-basis lots you'll need when you eventually sell. Per-claim is the right granularity.
Does Vestream submit my taxes for me?
No. Vestream produces the data your accountant or tax software needs. The actual filing is done in Koinly / CoinTracker / TurboTax / your accountant's tool of choice – Vestream's CSV imports cleanly into all of them.
What if I claimed across multiple wallets in the same year?
Add every receiving wallet to your Vestream dashboard. The Exports tab aggregates across all your tracked wallets, so the year-end report covers your entire vesting income regardless of which wallet received which claim.
Is the price I receive at claim the same as the cost basis for capital-gains later?
Yes – that's the whole point of the income-at-receipt rule. The USD value you report as income at the claim becomes your cost basis for that lot. When you sell, your gain/loss is (sale price − cost basis) per token.
What about staking / yield rewards on vested tokens?
Treated separately. If you stake tokens you've already received, the staking rewards are their own income events with their own dates and cost bases. Vestream tracks vesting receipts; staking rewards need a separate tool or accountant entry.
Get the Spreadsheet
Sign in to <a href="/login">Vestream</a>, add your vesting wallets, and click Refresh in the Tax Reports tab. Every claim across all 11+ supported protocols, valued in USD at receipt, ready for Koinly / CoinTracker / TurboTax – in about 60 seconds.