Home / Sources / Koinly

Koinly report vs. 1099-DA: why the totals don't match

Two documents, both about the same client, both claiming to describe the same year — and the proceeds differ by thousands. This page lists the seven causes we check first, in the order they usually turn out to matter.

Short version. The 1099-DA is filed by the broker, per account, on a cash-in-hand basis. The Koinly report is computed across all imported wallets, on a lot-matching basis, from whatever data was imported. They are answering slightly different questions. The gap is almost never one big error — it is several small classification differences that net out into a number nobody can explain.

1. Wallet transfers booked as disposals

Moving an asset between your own accounts is not a taxable event. It becomes one the moment the software fails to pair the outgoing and incoming legs — usually because the deposit arrived with a different asset symbol, a different amount after a fee, or on a date outside the matching window.

The signature: proceeds appear with no corresponding basis, and the same asset shows up twice in the lot pool. This single class accounts for the largest dollar gaps we see.

2. Reward, staking and airdrop lots with zero basis

Income events create new lots. If the fair-market value at receipt was never recorded, the lot enters the pool at zero basis — and every later sale of it looks like pure gain. The 1099-DA reports proceeds; it does not repair the missing basis.

3. Gross proceeds vs. net of fees

Box 1a on the 1099-DA is gross proceeds. Software exports vary: some report proceeds net of the exchange fee, some add the fee to basis, some do both. A 0.1% fee on a high-volume year is enough to produce a five-figure difference on its own.

4. Swap legs priced independently

A trade of one asset for another is one economic event with two legs. If each leg is priced from a different feed, or one leg is priced and the other valued by ratio, the totals drift — and the drift lands entirely in proceeds.

5. Duplicate or partial imports

An API sync plus a CSV for the same account is the most common duplication. The second-most-common is a CSV that covers only part of the year, so half the disposals exist once and half exist twice.

6. Unit precision and price rounding

Quantities to eight decimals, prices to the cent, then a multiplication — the rounding residue is small per trade and material per year. It also breaks lot matching, which compounds the error.

7. Which lot-tracking method, and which wallet

FIFO, LIFO and HIFO produce different realized gains from identical data. Since Rev. Proc. 2024-28 ended universal basis pooling, the account-and-wallet dimension matters too: a report that pools across wallets can be internally consistent and still disagree with a per-account 1099-DA.

What a difference ledger does about it

Instead of a single unexplained number, the ledger lists each unmatched amount with:

That is what makes the difference defensible. Not that it is zero — that every part of it has an owner.

Scope note. This page describes difference patterns observed in exported data. It is not a statement about any vendor's internal logic, and it is not tax advice. BasisDiff reconciles datasets; filing positions stay with the preparer.

Send us one client file

Three free pilot reports. You get the ledger and the summary; we get to see whether our checklist survives contact with your data.

Request the pilot

Related: all supported sources · how the browser-side computation works