← Crypto cost basis calculator
Most exchanges let you download your history as a CSV. The free calculator reads those files directly in your browser, converts them to one plain format, and runs FIFO, LIFO, HIFO, LOFO and a tax-aware rule across all of them together, so a coin bought on one exchange and sold on another is matched correctly. Nothing is uploaded.
The page detects the format from the column headers. Several files can be loaded at once, or use the command-line version: node cli.mjs --method HIFO --year 2024 --form8949 8949.csv coinbase.csv kraken.csv.
A coin-for-coin swap, a staking reward or an airdrop often has no dollar value in the export. The importer leaves the total empty and lists the row so you can fill it in from that day's price. It never writes a silent zero, because a zero would overstate your gain on the next sale. Fees paid in a coin rather than dollars are likewise left at zero with a note when the export carries no dollar value for them.
These readers were written from the column layouts the exchanges publish and have not been checked against every real account, so open the result, compare one or two rows with your exchange, and read the notes the importer prints.
The page offers a column mapper: pick which column is the date, type, asset, quantity, USD total or price and fee, say what each type value means (buy, sell, income, transfer or leave out), and it rewrites the file in the plain format on your device. Rows it cannot read, or that have no dollar value, are listed instead of being zeroed.
If you have a Koinly universal CSV, the calculator reads buys and sales against USD, splits coin-for-coin swaps into a sale and a buy at Koinly's USD value, and treats labelled staking, mining and airdrop receipts as income. Unlabelled transfers, non-USD fiat and non-USD fees are skipped with a note. It lets you re-run the five-method comparison locally, without an account.
No. The files are read and matched in your browser and are not sent anywhere. Anonymous feature counts stay in local storage and can be switched off.
Because the export did not carry a dollar value for it, for example a coin-for-coin swap or a staking reward. Fill it in from that day's price; the importer leaves it empty on purpose rather than writing zero.
Yes. Load every export, optionally turn on per-wallet matching, and record transfers between wallets with a to-wallet column so basis follows the coins.