FlowParse
Digital assets 11 August 2026 17 min read

Crypto cost basis records

Cost basis is not a difficult calculation. It is subtraction. What makes it hard is that the number you need to subtract was recorded four platforms ago, on an exchange that no longer exists, in a file nobody kept.

FlowParse
flowparse.io

The hard part is not the arithmetic

Ask what makes crypto records difficult and most people say the tax rules. The rules are genuinely complicated, but they are somebody's profession and they are written down.

What actually defeats people is more mundane. To work out what a disposal produced, you need what the holding cost. That figure was created at the moment of acquisition — possibly seven years ago, on a platform you stopped using, in an interface that has been redesigned twice since, for an amount denominated in another crypto asset rather than in money.

Since then the holding has moved. From the exchange to a wallet, from that wallet to another, back to a different exchange, split across two sales. At no point did the acquisition record travel with it.

That is the problem this page is about: not computing basis, but keeping it attached to the thing it belongs to for as long as you hold it.

FlowParse
flowparse.io

What we do not do — stated plainly

This field is full of tools that imply more than they deliver, so the boundaries come first rather than last.

We do not calculate tax

No gains, no income, no liability. What is taxable, when, and at what rate depends on where you are and changes — that is a qualified adviser's work, not a document reader's.

We do not connect to exchanges

There is no API integration and no wallet linking. FlowParse reads files you already have. That is a real limitation and it is better to know it now than after signing up.

We do not read the blockchain

No on-chain lookups, no address tracing, no price oracles. If the information is not in a document you possess, we cannot supply it.

We do not choose a method

Which accounting method to use is a decision with consequences, and it is yours to make with your adviser. We keep the rows so that any method can be applied to them.

We do not value anything

We read the amounts a document states. We do not look up what an asset was worth on a date, and a tool that quietly did would be inventing evidence.

What is left is narrower and genuinely useful: turning a pile of statements, confirmations and screenshots into rows that somebody can actually work with, with every figure traceable to the document it came from.

Why basis goes missing, in five ordinary ways

The platform closed

An exchange shuts, is acquired, or exits your country. Whatever you exported beforehand is now the entire historical record, permanently.

The export window closed

Many platforms only let you export a limited history. The trades from five years ago may simply not be downloadable any more, even though the platform still exists.

The asset was bought with another asset

A trade denominated in another crypto asset has no money amount on the face of it. The basis has to come from somewhere else, and often nobody recorded where.

It moved before anyone thought about records

Coins acquired as a hobby became a material holding years later. The paperwork habits started long after the acquisitions did.

The account was somebody else's

A holding received as a gift, an inheritance, or from a shared account carries a history the current holder never saw.

None of these involve carelessness. Every one of them is the ordinary result of holding something for a long time across systems that were never designed to hand records to each other.

The second is the one worth acting on today. An export you can take this afternoon may not be available next year, and nothing warns you before the window closes.

Read your exports now

Upload exchange statements, trade confirmations or wallet exports and see them come back as rows. Free tier, no registration.

Loading quota…

Upload a document

or import from cloud
Smart Merge — drop many PDFs and combine them into one Excel (up to 5 files)

Free: 10 pages / month · Upgrade for more

Files encrypted in transit · auto-deleted after processing · GDPR compliant

What a basis record actually needs

FieldComes fromWithout it
Asset acquiredThe documentNothing to attach anything to
QuantityThe documentNo way to split a partial disposal
Date and timeThe documentNo ordering, and no rate to apply
What was given upThe documentThe whole basis is missing
Currency of that amountThe documentA number with no meaning
Fees, separatelyThe documentBasis is wrong by the fee, permanently
Platform or walletYou, or the documentTransfers become indistinguishable from trades
Source file and pageThe readNothing is defensible years later

The fifth row is easy to overlook and expensive to get wrong. An amount recorded as “0.4” means nothing without knowing whether that was money or another asset — and exports are frequently ambiguous about it.

The last row is what separates a record from a spreadsheet somebody typed. Years later, the question will not be what your spreadsheet says; it will be what supports what your spreadsheet says.

FlowParse
flowparse.io

Fees are part of the story, and they hide

Every acquisition carries fees, and crypto has more kinds than most: a trading fee on the exchange, a network fee to move the asset, a spread that never appears as a line at all, sometimes a fee charged in a third asset entirely.

Individually they are small. Across years of activity they are not, and their treatment can change the outcome of a disposal materially.

Whether a given fee forms part of basis is a question for your adviser and depends on your jurisdiction. What is not in doubt is the record requirement: the fee has to be visible as its own figure, not silently folded into the trade amount, or neither treatment is possible later.

This is where exports differ most from each other. Some show the fee as a separate line, some deduct it and show a net amount, some show it in the fee asset rather than in money. A record that flattens all three into one column has destroyed information that cannot be recovered.

How the separation works and why it is deliberately not automatic is on asset and fee splitting.

A transfer is not a disposal, and exports rarely say so

Moving an asset from your exchange account to your own wallet is, in most records, indistinguishable from selling it. The exchange sees an outflow. That is all it knows.

So an export shows a withdrawal, and a separate export from the receiving wallet shows a deposit. Nothing links the two, and if you only have one of the two files, the story reads as a disposal.

Whether a transfer between your own holdings is a taxable event is a question for your adviser and the answer varies. What is certain is that the record has to distinguish the two at the time, because reconstructing it from amounts and timestamps years later is guesswork dressed up as analysis.

The practical habit that solves this costs nothing: when you move an asset, note that you moved it and where to. One line, at the moment, while you still know.

Without it, the most common outcome is a double count — the same holding appearing as sold on one platform and acquired on another, with a fabricated gain in between.

FlowParse
flowparse.io

When a platform disappears

This is the failure mode with no workaround, and it deserves stating bluntly because it is the strongest argument for doing anything at all today.

If a platform closes, is acquired, restricts your region, or simply deletes old history, then whatever you exported beforehand is the complete and final record. There is no later route to it. No tool, ours or anyone's, can recover data that no longer exists anywhere.

What makes this worse is the asymmetry of timing. The moment you need the history is the moment you are computing a disposal — which may be years after the platform went away.

The remedy is unglamorous and takes an afternoon: export everything, from every platform you have ever used, now, while the accounts still open. Do not process it, do not tidy it, just get the files off the platforms and into your own storage.

Reading and organising it can happen any time afterwards. Obtaining it cannot.

The method is not ours to choose

When you hold the same asset acquired at several different prices and sell part of it, something has to decide which units were sold. Different methods exist, jurisdictions differ on which are permitted, and the choice changes the result.

We do not make that choice, and any tool that silently applies one is making a decision with tax consequences on your behalf without telling you.

What we do instead is keep the acquisition rows individually — each lot with its own date, quantity, cost and source — so that whichever method you and your adviser settle on can be applied to them afterwards.

This has a practical implication worth understanding: a record that has already been aggregated is a record where the choice has been made for you and cannot be revisited. Averaging holdings together early feels tidy and closes doors.

FlowParse
flowparse.io

When basis is genuinely unknown

Sometimes the answer is that nobody knows what a holding cost. The platform is gone, the export is not available, the acquisition predates any record-keeping.

The temptation at that point is to estimate. Take a price from a historic chart, apply it to the quantity, and produce a number that fills the cell.

We do not do this and we would advise against doing it manually either, for a reason that goes beyond caution. An estimated basis looks exactly like a recorded one. It gets used, it flows into the calculation, and it becomes indistinguishable from evidence — while resting on nothing.

A cell marked unknown, with a note of what was tried to establish it, is uncomfortable to look at and far more defensible. It also stays open as a question, which means it can still be answered if an old file turns up.

What to do about an unknown basis — whether an estimate is acceptable, on what evidence, and with what disclosure — is a question for your adviser. Recording it honestly is the part you control.

Building the record

1 · Export everything

Every platform, every wallet, oldest history first. Before organising anything, get the files out.

2 · Read into rows

Up to 100 files a pass, into one table with the asset, date, amount, fee and source on each row.

3 · Mark the transfers

The pairs that are one movement rather than two events. Only you know which.

4 · Flag the gaps

Acquisitions with no known cost, marked as unknown rather than filled.

5 · Keep the sources

The originals, in your own storage, independent of any platform or tool.

6 · Hand it over

Excel, CSV, JSON or XML to whoever computes the tax.

Step five is the one people skip because it produces nothing visible. It is also the only step that protects you from the failure described above — we delete your uploaded file immediately after reading it, and we are not an archive.

The full sequence, with the ordering that avoids doing work twice, is in how to prepare crypto records for tax.

FlowParse
flowparse.io

When one asset was bought with another

A trade between two crypto assets has no money amount anywhere on its face. You gave up a quantity of one thing and received a quantity of another, and neither side is denominated in a currency.

This is where basis records most often break, because the acquisition cost of the new holding depends on the basis of the old one — which in turn may have been acquired the same way, and so on backwards until the chain reaches an actual purchase.

So a single disposal can depend on a chain of five earlier trades, any one of which may be undocumented. Break the chain anywhere and everything downstream of it becomes unknown.

What the record has to preserve

Both sides of the trade, explicitly: the asset and quantity given up, and the asset and quantity received. A record that keeps only what was acquired has thrown away the link to the earlier holding.

Some platforms show a money equivalent alongside — a notional value at the time. Where they do, keep it as a separate field, clearly marked as the platform's figure rather than a market price you looked up. Whether it can be used is a question for your adviser; whether it survives is a question for the record.

And where the chain is broken, mark the break rather than the symptom. “Basis unknown because the acquiring trade on platform X is not documented” is a far more useful note than an unexplained empty cell, because it tells whoever reads it what would fix the problem.

FlowParse
flowparse.io

Gifts, inheritance and accounts that were not yours

Some holdings arrive with a history you never saw. A gift from a family member, an inheritance, a balance from a shared account after a separation, coins someone sent you years ago for something.

These raise a records question with an unusual answer: the relevant history may belong to someone else entirely, and the only way to obtain it is to ask them.

How the basis of a received holding is determined varies considerably by jurisdiction and by the nature of the transfer — sometimes it carries over, sometimes it resets, sometimes it depends on values at the date of transfer. That is squarely your adviser's territory.

What you can do, and should do early, is establish whether the earlier history is obtainable at all. If the person who acquired the holding is available and has records, ask now rather than later; if they are not, that is a documented gap from the start rather than a surprise at the end.

Record what you know about the transfer itself regardless: the date it reached you, the quantity, who it came from, and the circumstances. Even where the basis question is unresolved, that much is knowable and will not become more knowable with time.

Six traps

Folding fees into the trade amount. Whichever treatment turns out to be right, the information needed for it is gone.

Averaging lots together early. It closes off methods that might have been available, permanently and invisibly.

Treating a wallet transfer as a sale. Produces a fabricated gain and a duplicated holding.

Estimating an unknown basis. The estimate becomes indistinguishable from evidence and rests on nothing.

Assuming exports will still be available later. They frequently are not, and nothing warns you first.

Keeping the spreadsheet but not the source files. The spreadsheet is the claim; the files are the support.

Where to start

Not with the calculation and not with the oldest year. Start by exporting everything you can still export, today, from every platform you have ever held anything on.

That single afternoon protects the entire record against the one failure that has no remedy. Nothing else on this page matters if the files stop being available.

Then read a single platform's history into rows and look at what is actually there: are fees separate, are transfers identifiable, is the acquisition currency clear? That tells you how much work the rest will be, before you commit to any of it.

Staking and airdrop entries need slightly different handling and are covered on staking and airdrop records; if you are doing this for other people rather than yourself, crypto bookkeeping for accountants is the relevant page.

Frequently asked questions

Export everything first

Every platform, while the accounts still open. Then read one platform's history and see what state your records are actually in.

Keep reading