HomeBlog › Crypto tax reconciliation
Reconciliation

Crypto tax reconciliation: matching on-chain activity to your ledger

Updated July 2026 · CryptoTaxEdge

Two columns of records, the on-chain history and the tax ledger, matched row by row with one flagged gap.

A reconciliation is the moment two records are forced to agree: the transactions a wallet actually made on-chain, and the transactions sitting in a tax ledger. This is how that match works, and where it usually breaks.

Accountants already know reconciliation from bank work. A bank statement lands, and every line gets matched against the general ledger until the two records tie out. Crypto reconciliation does the same job with a different source of truth. The blockchain is the statement, the tax software is the ledger, and the goal is a ledger where every on-chain event that matters for tax appears once, with the right label.

The blockchain is the authoritative record

The most important thing to settle first is which record wins when the two disagree. In crypto, the chain does. A transaction that is confirmed on-chain happened, permanently, whether or not it made it into the ledger. So reconciliation is never about editing the chain to match the ledger. It is about finding every place the ledger fails to match the chain, and fixing the ledger. Tools like Koinly and CoinTracker are excellent at pulling data in and calculating gains once the data is correct, but they can only work from what they successfully ingested. The gap between what a wallet did and what the software captured is exactly what a reconciliation is meant to close.

The two ways a ledger drifts

Almost every reconciliation problem is one of two shapes.

Missing transactions

A wallet interacted with a contract, but the transaction never made it into the ledger. This happens when a chain was never connected, when an exchange export dropped internal transfers, or when a bridge deposit landed on a network the software does not track. Missing rows are the expensive ones. A disposal that is absent from the ledger is a gain or a piece of income that will never be reported, and no amount of correct math on the rows that are present will surface it.

Mislabeled transactions

The transaction is in the ledger, but tagged wrong. A single swap gets recorded as two unrelated transfers. A staking reward gets recorded as a plain deposit. A liquidity withdrawal gets read as ordinary income. The totals still look plausible, which is exactly why tag errors survive far longer than missing rows. Nothing looks broken until someone re-reads the underlying transaction.

How the match actually happens

Reconciliation is a row-by-row comparison, and the join key is the transaction hash. Every on-chain transaction has a unique hash, and that hash is the one value the chain and the ledger share. A clean pass runs in three steps.

  1. Pull the full on-chain history for every address in scope, across every chain the client touched.
  2. Line that history up against the ledger, hash by hash.
  3. Sort the result into three buckets: on-chain but not in the ledger, in the ledger but not on-chain, and present in both but labeled differently.

A worked example makes the buckets concrete. Say a wallet made 412 transactions last year and the export has 398 rows. The 14-row difference is a coverage signal, and reconciliation's first job is to name the specific 14 hashes that are missing, not just report that a gap exists. The second bucket, rows in the ledger with no matching hash on-chain, usually points to a manual entry, a duplicated import, or a transaction pasted from the wrong wallet. The third bucket, matched hashes with conflicting labels, is where most of the real correction work lives.

Why raw transaction counts rarely tie out cleanly

A count comparison is a starting signal, not a verdict, because counts differ for reasons that are not errors. One decentralized-exchange swap is a single hash but often two ledger rows, one for the token that left and one for the token that arrived. A token approval is its own transaction with no asset movement at all, so it may or may not appear in the ledger by design. Spam tokens and dust airdrops inflate the on-chain count while being deliberately excluded from the ledger. Real reconciliation reads what each hash did, then decides whether a difference is noise or a genuine gap.

Multi-year catch-ups follow the same rules

A client who ignored crypto for several years and now wants to file is still one reconciliation problem, just a larger one. The chain holds the complete history regardless of tax year, so the pass pulls everything, buckets every hash, and lets the preparer scope which years they are actually filing. The mechanics do not change with the number of years. Only the row count does.

What a reconciled ledger looks like

When the pass is finished, every hash sits in one of three states. Matched means the chain and the ledger already agree. Corrected means a conflict was resolved, with the reason recorded next to the row. Open means the transaction needs a human, because its treatment depends on facts only the taxpayer or the preparer can supply. The open items are the point of the whole exercise. A reconciliation that quietly guesses at an ambiguous position is worse than one that stops and says so, because a confident wrong answer is the one that ships to a filing unchecked.

The rule that anchors the pass: flag, do not guess. When the on-chain evidence is thin or two readings of a transaction disagree, the row is surfaced for a person with what was found, rather than resolved silently. Honesty about uncertainty is the difference between a review you can hand to a client and a number you are simply hoping is right.

Doing it at scale

For one wallet and a hundred transactions, reconciliation can be done by hand in an afternoon. For a firm carrying dozens of clients, each with several wallets and years of history, hand-matching stops being realistic well before filing season. That is the gap CryptoTaxEdge is built for. It reads a client's exported ledger, re-reads the chain for every hash, and returns the same three buckets as a reviewed file, so a preparer spends their hours on the open decisions instead of the mechanical matching. You can see how the engine labels a single transaction, with its reasoning, in the classification taxonomy.

Not tax advice. CryptoTaxEdge is software, not a licensed tax advisor. This guide is general and informational only. Verify results and consult a qualified tax professional before filing.