Bitcoin Tax Software

Exchange CSV vs Wallet History: Why Bitcoin Records Do Not Match

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.

  • Records first
  • No tax advice
  • Bitcoin-only
Exchange CSV and wallet history thumbnail showing complementary Bitcoin records across sources.

What each source knows - and does not

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.)

What each source knows - and does not

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.

Why holders look for one perfect export (and why it fails)

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.

A worked reconciliation

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.

Why the sources disagree - and why a mismatch is not an error

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:

  • an account timestamp on the exchange versus an on-chain confirmation time - these can differ, especially near a day boundary
  • an exchange withdrawal record versus the matching wallet receipt - two sides of one movement, recorded separately
  • a platform fee versus a network fee - different fees for different parts of the activity
  • a local-currency value shown by an exchange versus a Bitcoin-only wallet record that shows no value
  • a platform reference ID versus an on-chain transaction ID
  • a wallet label versus an exchange transaction type
  • an acquisition record versus a later movement record

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.

Why self-custody creates records across multiple systems

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.)

Why software may flag unreconciled records

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.)

A simple way to reconcile the sources

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:

  • What source shows the acquisition?
  • What source shows the withdrawal?
  • What source shows the receipt?
  • What transaction ID supports the movement?
  • What wallet label explains the destination?
  • What fee record exists, and from which source?
  • What timestamp does each source show, and do I understand the difference?
  • What amount appears in each source?
  • What note explains the purpose?
  • What part remains unclear?

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.)

FAQ

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.