Export Bitcoin transaction history
Assemble a complete export set before importing records into tax software.
Enter your email to receive the free PDF checklist.
Read our Privacy Policy. For subscriber questions or corrections, use the Contact & Corrections page.
Bitcoin Tax Software
If you bought Bitcoin on an exchange and later moved it into self-custody, your records probably live in more than one place. The exchange may have a CSV or account export. Your wallet may have transaction history. The blockchain may show transaction IDs and address movement. Your own notes may explain why the movement happened. Those records can all be accurate and still not match cleanly - and that is exactly the point of this page.
If you bought Bitcoin on an exchange and later moved it into self-custody, your records probably live in more than one place. The exchange may have a CSV or account export. Your wallet may have transaction history. The blockchain may show transaction IDs and address movement. Your own notes may explain why the movement happened. Those records can all be accurate and still not match cleanly - and that is exactly the point of this page.
The core distinction is simple: exchange CSVs and wallet history preserve different slices of facts; they are complementary, not substitutes, and neither decides tax treatment by itself. This page is about reconciling those slices - lining them up so one Bitcoin history becomes reviewable. It is educational only, not tax, legal, or financial advice; rules differ by jurisdiction and change over time. For the scope of the lane, read the Bitcoin tax disclaimer; for the map, start at the hub. (For how to gather a complete export set in the first place, see export Bitcoin transaction history.)
| Source | What it can help preserve | What it does not know or decide |
|---|---|---|
| Exchange CSV / account export | Buys, sells, deposits, withdrawals, recurring purchases, fees, timestamps, reference IDs, source-shown local-currency values | What happened after Bitcoin left the account; whether a receiving wallet is yours; why coins moved; how later wallet activity connects back |
| Wallet history | Incoming/outgoing transactions, transaction IDs, timestamps, amounts, network fees, wallet labels, addresses, your notes | What you originally paid on an exchange; the source-shown value at acquisition; the reason for a movement |
| On-chain data (transaction ID) | That a transaction happened, when it confirmed, which addresses, how much moved, the fee | Purpose; ownership context; cost-basis continuity; tax treatment |
Read across the table and the pattern is clear: each source answers one part of the question. The exchange record may know the acquisition; the wallet record may know the movement; the blockchain confirms it happened; your labels explain why. None of them is the whole picture, and none of them is wrong for being partial - the whole picture only appears when you connect them.
Almost everyone starts by hunting for a single file that will contain everything. It is a reasonable instinct, and for a holder who only ever traded inside one exchange account it can even work. But the moment Bitcoin moves into self-custody, that single file stops existing, because no one system sees the whole life of the coins anymore. The exchange stops seeing them when they leave; the wallet never saw what they cost; the blockchain sees movement but not meaning.
So the goal quietly changes from find the perfect export to reconcile several partial ones. That shift is the entire job of this page, and accepting it early saves a lot of frustration later - you stop waiting for a file that will not arrive and start connecting the files you already have.
Consider one common movement. In February you buy Bitcoin on an exchange. In June you withdraw it to a hardware wallet. Three records now exist: the exchange shows an outgoing withdrawal (amount, fee, timestamp, reference); the wallet shows an incoming receipt (amount, transaction ID, timestamp); the blockchain shows a transaction between addresses.
Unreconciled, these look like three unrelated events - or worse, the wallet receipt looks like coins appearing from nowhere and the withdrawal looks like coins vanishing. That is where software flags missing basis and where a later reviewer loses time.
Reconciled, they become one understandable event: exchange withdrawal (with the February acquisition record attached) → wallet receipt, matched by the transaction ID, fee preserved on both sides, labeled "withdrawal to cold storage - wallet mine." Nothing about the underlying records changed. What changed is that the transaction ID and the label now tie the slices together, so the movement can be read as a whole. This page decides no treatment - it makes the movement reviewable, which is the prerequisite for any later review.
This is the part that surprises people, so it is worth being precise: Bitcoin records can disagree without any of them being wrong. Each source records a different slice of the same event, using its own conventions.
Common, legitimate source differences include:
A difference in any of these is a signal to reconcile, not proof that something went wrong. The practical job is to preserve each useful fact from each source without pretending one source explains everything - the exchange value, the wallet transaction ID, the network fee, and your label all belong in the same reconciled record even though no single export contained them all.
When Bitcoin stays inside one exchange account, more activity may be visible in one place. Once you withdraw to your own wallet, the story splits across the exchange (the purchase, the withdrawal, the fee, the acquisition record), the wallet (the receipt, later movement, labels, transaction IDs), the blockchain (that a transaction happened, addresses, confirmation), and your own notes (whether the receiving wallet was yours and why it moved). No single source owns the whole story - which is normal, not a sign your records are broken. It simply means the records need reconciling: this withdrawal connects to this receipt, this transaction ID supports the movement, this receiving wallet is mine, this earlier acquisition may be relevant. (For the movement boundary itself, see wallet transfer vs taxable event; for the cost-basis input, see Bitcoin cost basis basics.)
Software works from the sources you give it. If exchange history, wallet history, labels, and acquisition records are incomplete or disconnected, it may need more context before the output can be reviewed confidently - for example when an exchange is imported but the wallet is missing, a wallet is imported but the acquisition record is missing, a withdrawal and receipt are unmatched, or a transaction ID exists but the purpose is unclear. Different tools behave differently, so this page makes no claim that software automatically reconciles exchange and wallet history. The durable point: a clean import starts before the import - it starts with reconciled records. (For what a tool can and cannot do, see what tax software can and cannot do; for how it goes wrong, see Bitcoin tax software limitations.)
For each major movement, ask one question: can I connect the exchange record, the wallet record, the on-chain record, and my own context? A reconciled record answers:
If you can answer those, the sources are easy to review later. If you cannot, do not invent the missing context - preserve what you have, mark the gap "uncertain - needs review," and decide whether it needs better records or qualified review. (For when a mismatch stops being routine cleanup, see when to use a tax professional.)
What is the difference between an exchange CSV and wallet history? An exchange CSV is an account-level record (purchases, withdrawals, deposits, fees, source-shown values, timestamps, references). Wallet history is a wallet-level record (incoming/outgoing activity, transaction IDs, amounts, timestamps, fees, addresses, labels). They preserve different slices; neither decides treatment.
Is an exchange CSV enough after I move Bitcoin to self-custody? Usually not. It may show what happened inside the account, including a withdrawal, but not what happened after Bitcoin moved into your wallet. Wallet history and on-chain records may also be needed.
Is wallet history enough without exchange records? It may show later movement but not the original acquisition record from the exchange. Separated from the purchase record, later review has less context.
What does a transaction ID prove? That an on-chain transaction happened, and it can support the time, amount, addresses, and fee. It does not prove purpose, ownership, treatment, or cost-basis continuity.
Why do exchange and wallet records show different timestamps or fees? They may record different parts of the same event - account time versus confirmation time, platform fee versus network fee. A mismatch is a record-source issue to reconcile, not a treatment conclusion.
Why does software flag records when I import both exchange and wallet history? It may need context to see how records connect. If a withdrawal, receipt, transaction ID, label, fee, or acquisition record is missing or disconnected, the output may need review. The durable fix is source completeness and clear labels.
How do I reconcile exchange and wallet records? For each movement, connect the acquisition record, the withdrawal, the receipt, the transaction ID, the fee, the wallet label, and a purpose note - and mark anything you cannot connect as uncertain. This is record organization, not tax interpretation.