Last updated: March 2026
Use the Custom CSV import to add transactions that are not automatically fetched through an exchange integration or wallet import. Common use cases include:
- Transactions from an exchange not yet supported by CryptoTax
- OTC trades (e.g. directly with a counterparty)
- Mining income or airdrops not recorded on-chain
- Migration from another tax tool
You create a CSV file with your transactions and upload it to CryptoTax. Below we explain step by step how it works.
Quick Start
- Download the CSV template via this link.
- Open the file in Excel, Google Sheets or Numbers.
- Fill in your transactions — one row per transaction.
- Save as CSV (UTF-8 encoding).
- Log in to CryptoTax → Add Account → CSV Import → Custom CSV.
- Upload your file.
- Review the results in your transaction overview.
Column Reference
The first row of your CSV file must contain the column names. Column names are case-insensitive.
| Column | Required | Description | Example |
|---|---|---|---|
date | Yes | Timestamp in ISO 8601 format (UTC) | 2024-03-15T14:32:00Z |
type | Yes | Transaction type (see table below) | BUY |
asset | Yes | Cryptocurrency ticker symbol | ETH, BTC, USDC |
amount | Yes | Quantity, always positive | 0.5, 1000.00 |
price_eur | No | EUR price per unit at the time of the transaction. Leave blank for automatic lookup. | 2000.00 |
fee_amount | No | Fee paid (commission) | 5.00 |
fee_asset | No | Ticker of the asset used to pay the fee | EUR, ETH |
exchange | No | Free-text label (e.g. exchange name) | Bitvavo, OTC |
tx_id | No | Unique transaction ID for deduplication. Required for TRADE pairs. | trade-abc |
notes | No | Free-text note (included in the accountant report) | First ETH purchase |
The minimum for a valid CSV file is: date, type, asset, amount.
Type Values & Tax Treatment
| Type | Description | Tax Treatment |
|---|---|---|
BUY | Bought crypto with EUR | Acquisition |
SELL | Sold crypto for EUR | Disposition (taxable event) |
TRADE | Crypto-to-crypto swap | Swap: disposition + acquisition |
DEPOSIT | Received from external source | Internal transfer (no tax) |
WITHDRAWAL | Sent to external destination | Internal transfer (no tax) |
INCOME | Staking, mining, airdrops | Taxable income |
GIFT_IN | Received as gift | Gift (continuity basis) |
GIFT_OUT | Given as gift | Gift (disposition) |
LOST | Lost, stolen or hacked | Loss recognition |
FEE | Standalone fee | Deductible expense |
How to Record a Swap (TRADE Pairing)
A crypto-to-crypto swap consists of two rows with the same tx_id. The first row is the outgoing leg (what you sell), the second is the incoming leg (what you receive).
Example: you swap 1 ETH for 2,500 USDC.
date,type,asset,amount,price_eur,fee_amount,fee_asset,exchange,tx_id,notes
2024-03-10T09:00:00Z,TRADE,ETH,1.0,2300.00,,,Bitvavo,trade-abc,Sold ETH
2024-03-10T09:00:00Z,TRADE,USDC,2500.0,1.00,5.0,USDC,Bitvavo,trade-abc,Received USDC- Both rows have
tx_id = trade-abc— this tells CryptoTax they belong together. - The first row (ETH) is automatically marked as outgoing, the second (USDC) as incoming.
- A TRADE row without a matching partner is flagged as an orphan. Add a second row with the same
tx_id, or change the type toBUYorSELL.
Date Format
CryptoTax accepts the following date formats (ISO 8601):
| Format | Example | Note |
|---|---|---|
| UTC with Z suffix | 2024-03-15T14:32:00Z | Recommended |
| With timezone offset | 2024-03-15T14:32:00+02:00 | |
| Without timezone | 2024-03-15T14:32:00 | UTC assumed |
| Space instead of T | 2024-03-15 14:32:00 | UTC assumed |
Not supported: 15-03-2024, 03/15/2024, March 15, 2024.
Common Errors
| Error | Cause | Fix |
|---|---|---|
Unrecognised header | Column names don't match | Ensure the first row contains at least: date,type,asset,amount |
Invalid amount | Non-numeric or negative value | Use positive numbers only (e.g. 0.5) |
Cannot parse date | Wrong date format | Use yyyy-MM-ddTHH:mm:ssZ |
Unknown type | Unsupported transaction type | Use one of: BUY, SELL, TRADE, DEPOSIT, WITHDRAWAL, INCOME, GIFT_IN, GIFT_OUT, LOST, FEE |
| Orphaned TRADE | Single TRADE row without a matching pair | Add a second TRADE row with the same tx_id, or change the type to BUY/SELL |
FAQ
What if I don't know the EUR price?
Leave the price_eur column blank. CryptoTax automatically looks up the price at the transaction timestamp.
Can I upload multiple CSV files?
Yes. Add multiple Custom CSV accounts, one per file.
How do EUR transactions work?
For BUY and SELL types, the EUR side is calculated from amount × price_eur. You don't need to add a separate EUR row.
Can I re-upload after fixing errors?
Yes. Delete the CSV account and re-upload the corrected file.
Download Template
Download the ready-made template with example transactions: custom-csv-template.csv