Every crypto tax tool has a name for the same bad news. Koinly says "missing purchase history". CoinTracker raises review flags on transactions it had to guess about. Others say "missing cost basis," "unmatched transfer," or just paint a row yellow. Different vocabulary, one meaning: the software found coins being sold, spent, or swapped that it never saw you acquire — and it is about to assign them a $0 cost basis, taxing the entire proceeds as gain you may never have made.

Because the defect lives in the data rather than in any app, the repair procedure is the same everywhere. This is that procedure: four passes, in an order that matters, written so it works whether your tool is Koinly, CoinTracker, CoinLedger, or a spreadsheet. If you want the tool-specific button-by-button version, we've written those separately for Koinly and CoinTracker; this guide is the layer underneath — what has to become true in your records for any tool to compute the right number.

This is not tax advice. It's a data-repair procedure, with links to primary sources. For decisions about your own return, talk to a tax professional.

Before you touch anything: a baseline and two rules

First, record where you're starting from. Note three numbers from your current report: how many transactions are flagged, the total reported gain, and the tool's computed balance for each affected asset. Every pass below should move at least one of those numbers in an explainable direction — and if a change moves the gain, you want to know which fix did it and why.

Then two rules that hold for the whole procedure.

Rule 1: repair data, not symptoms. Every tool offers some way to make a warning disappear — dismissing it, accepting a $0 basis, hand-typing a number. All of those treat the symptom. The durable fix is always at the record level: the acquisition either gets imported, linked, or documented. A report that looks clean because its warnings were dismissed is not a clean report.

Rule 2: never delete what you can't explain. Deleting transactions to silence warnings creates a history that matches neither the chain nor the exchange's records — the two things a filed return may eventually be compared against.

Pass 1: Inventory and classify every warning

Work through the tool's warning list once, without fixing anything yet, and sort every flagged transaction into one of four buckets. The bucket determines the repair, and misclassifying is how people spend hours on the wrong fix.

The diagnostic for each flag is the same three questions: where did these coins physically come from, is that place represented in the tool, and does the flagged amount exceed what the source ever recorded? Ten minutes of classification here saves hours of misdirected fixing. The mechanisms that fill these buckets — and how to verify each one in your own records — are laid out in how a $0 cost basis gets into a report.

Pass 2: Import what's missing (Bucket A)

Missing sources get fixed first, because a new import can resolve Bucket B and C flags on its own — and because every fix you make before the data is complete may need to be redone after.

Add the wallet addresses the tool has never seen, including the old ones you stopped using; a wallet that only ever sent you coins still holds the acquisition side of those transfers. Replace lossy API connections with full-history exports where the API has time windows or omits transaction types. Request account statements from exchanges whose export tools are limited — while the exchange still exists to ask.

Then re-run the report and re-take your baseline numbers. Only classify and fix what's still flagged.

Now pair every transfer the tool failed to match. Whatever the feature is called in your tool — merging, linking, marking as transfer — the operation is the same: declare that the withdrawal on one side and the deposit on the other are the same coins moving, so the acquisition history flows through instead of dying at the boundary.

Match on three fields: asset, amount (allowing for the network fee — the received amount is typically slightly smaller), and time (allowing for block confirmation delays). When the pairing is accepted, two things should happen: the deposit's basis warning clears, and the coins keep their original acquisition date. Check both. The date matters as much as the dollars, because a reset date can flip long-term holdings into short-term treatment even after the basis is repaired.

Since 2025 this pass has carried extra weight: under per-wallet cost basis accounting, an unlinked transfer doesn't just blur one big pool — it strands the real basis in the wallet the coins left, while the selling wallet computes from zero.

Pass 4: De-duplicate and tie out balances (Bucket C)

Oversold ledgers are repaired by deletion — of the duplicates, not the warnings. Find them by sorting an account's transactions by date and scanning for identical amount-and-timestamp pairs, or by comparing the tool's row count for an account against the source file's. Remove the extra copies, keeping whichever import (usually the fuller CSV) you've decided is canonical for that period, and delete the redundant connection so the duplication doesn't regenerate on the next sync.

Then run the check that proves you're done: for each repaired asset, compare the tool's computed end balance against the real one — what the wallet actually holds on-chain, or what the exchange account shows today. A ledger that ties out to reality at the end is the strongest available evidence that the history in between is complete. A ledger that doesn't is telling you which asset still has a gap, which is more than any warning count can say.

This is also the pass where an outside reference helps most, because a tool can't use its own import to audit its own import. Run my free scan to get the chain's own version of your Ethereum wallets' history — every event and every self-transfer with its tx-hash, read-only and no sign-up — and compare it line by line against what your tool imported.

When the record genuinely doesn't exist (Bucket D)

What's left after three passes is the honest residue: coins whose acquisition you can't import or link because the record is gone. The path here is reconstruction and documentation, not invention. Rebuild what you can from bank and card records, order-confirmation emails, and the block-explorer trail; enter the documented acquisition at its real date and value; and keep the evidence with your tax records. If you can't document a number, don't type one in — a $0 basis you disclose beats a fabricated basis you can't support, and which way to handle a genuine gap is a question for a tax professional.

The full filing-side procedure — including how corrected basis interacts with broker-reported figures on Form 8949 — is in our pre-filing remediation guide.

The checklist

FAQ

What does "missing purchase history" actually mean in a crypto tax tool?

It means the tool found a disposal — a sale, swap, or spend — that it cannot match to any acquisition in the records it was given, so it doesn't know what you paid or when. Most tools respond by assigning a $0 cost basis, which treats the entire sale as profit. The warning's name varies by tool, but the underlying state, and the repair, are the same everywhere.

Can I just enter the cost basis manually instead of all this?

Manual entry treats one symptom and misses the disease. A basis typed onto one disposal doesn't repair the transfer chain, so the same gap resurfaces on the next sale of that asset — and hand-entered figures need documentation behind them anyway. Most tools also derive basis from acquisition records rather than letting you edit disposals directly. Import and link first; reserve manual entries for documented reconstructions of records that genuinely no longer exist.

Do I have to clear every warning before filing?

The goal isn't zero warnings — it's zero warnings you can't explain. After the four passes, what remains should be genuine gaps you've documented and, ideally, discussed with a tax professional. Filing with an unexplained $0 basis is conservative in the IRS's favor but can misstate holding periods and overtax you significantly; filing with invented numbers is worse. Explainable records are the standard, and the passes above are how you get there.


This is not tax advice, and none of the above is a substitute for a qualified tax professional who can look at your actual records.

If you want the chain's version of events to repair against, Verilot Check reads your Ethereum wallets directly on-chain and shows every transfer between your own addresses that a tax tool would book as a zero-basis sale, with a tx-hash on every line. Free and read-only — no wallet connection, no sign-up, up to 5 wallets and 500 events per scan, on Ethereum mainnet, Base or Arbitrum One (one chain per scan). Run my free scan.