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.
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.
Upload a document
Drop your documents here
or browse to upload
Free: 10 pages / month · Upgrade for more
Files encrypted in transit · auto-deleted after processing · GDPR compliant
What a basis record actually needs
| Field | Comes from | Without it |
|---|---|---|
| Asset acquired | The document | Nothing to attach anything to |
| Quantity | The document | No way to split a partial disposal |
| Date and time | The document | No ordering, and no rate to apply |
| What was given up | The document | The whole basis is missing |
| Currency of that amount | The document | A number with no meaning |
| Fees, separately | The document | Basis is wrong by the fee, permanently |
| Platform or wallet | You, or the document | Transfers become indistinguishable from trades |
| Source file and page | The read | Nothing 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.
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.
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.
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.
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.
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.
