A transfer recorded twice can distort a portfolio report. Build a traceable ledger from original exports, then check closing balances before calculating returns.
A portfolio total tells you what your accounts hold. It does not tell you which deposit came from your own wallet, what a transfer cost, or how much of an asset you actually sold. Organising crypto transaction records starts with reconciling movements before calculating returns.
Keep three layers: untouched exports, a working ledger with consistent fields, and evidence for transactions that need explanation. The aim is to reproduce each account’s closing balance and identify unresolved entries. Choosing a tax-lot method or preparing a national tax return is a separate task.
Identify gaps before combining files
List every exchange account, subaccount and wallet address you used. Record the network for each address: identical address strings can appear on different networks. Choose an opening and closing time with an explicit time zone. For example, a review from 1 October 2026 at 00:00 UTC to 8 October at 00:00 UTC can include the start and exclude the end, provided every source follows that boundary.
For each export, note its coverage, download date and report type. A simple weekly or monthly coverage grid exposes missing periods. Without a verified opening balance, you can reconcile changes within the period but cannot reconstruct total holdings by assuming the account started at zero.
Coinbase statements offer monthly and filtered exports. Kraken’s comparison of Ledger and Trades histories illustrates why report names matter: balance movements and executions are different records. A fee shown in quote currency in its Trades export may differ from the asset actually deducted; certain app conversions can appear only in Ledger.
For wallets, use the explorer for the relevant network. MetaMask’s Ethereum account-history instructions describe an Etherscan CSV export that excludes internal transactions. Do not assume one download covers every network, token movement or DeFi event. When an entry needs explanation, checking the transaction in a block explorer helps locate the underlying evidence.
Preserve originals and build a separate working ledger
Keep each downloaded CSV unchanged. Give it a descriptive name such as 2026-10_exchange-a_ledger.csv, then work on a copy. Record the old value, replacement and reason when correcting a field. A fresh export can then be compared with your adjustments without relying on memory.
Import CSV files through the spreadsheet’s data-import tool instead of opening them by double-clicking. Microsoft explains that numeric-looking identifiers can lose leading zeros or precision beyond 15 significant digits. Assign identifier columns the text type before conversion. Reformatting an already damaged value will not recover missing digits.
Amounts and fees should remain numeric so that they can be summed. Check decimal and thousands separators on a few sample rows. Store an unambiguous timestamp such as 2026-10-14T09:00:00Z, while retaining the original timestamp and time zone in separate fields. For a US account, do not apply a fixed local offset to a whole year when daylight saving time changes it.
| Field group | What to retain | Error it helps prevent |
|---|---|---|
| Source | Filename, row, account alias, provider record ID | Losing the evidence behind an entry |
| Time | Original timestamp, time zone, normalised UTC time | Matching entries to different days |
| Asset | Network, symbol, token contract if relevant, quantity | Combining distinct assets with the same ticker |
| Event | Purchase, sale, transfer, reward or fee; direction | Treating every incoming balance as profit |
| Fee | Amount, fee asset and net/gross convention | Deducting the same fee twice |
| Matching | Execution/order reference, TXID if present, linked rows, status | Importing the same event again |
Match transfer legs without deleting shared transaction IDs
An ordinary transfer between accounts you own is not a new purchase or sale in a consolidated portfolio ledger. Link the outgoing and incoming entries as one transfer group. Preserve both source rows, then consider them together when calculating portfolio movements. Bridging, wrapping or exchanging assets needs separate treatment rather than being forced into the same simple category.
Use the network, asset, addresses, quantity and timing together. A transaction hash is useful evidence, not a universal row-deletion key. One on-chain transaction can produce several token movements. An exchange order may have multiple fills, while an internal account movement may have no on-chain identifier at all.
To detect duplicate imports, compare the account, report type, provider record or fill ID, and event leg. Where no reliable identifier exists, flag suspected duplicates and inspect the originals. Two genuine transactions can share a timestamp and amount.
Worked example: tracing a 0.5 ETH transfer
The hypothetical example below covers two wallets owned by the same person. Wallet A starts with 2 ETH and wallet B with zero. A sends 0.5 ETH to B, with a 0.001 ETH network fee charged to A in addition to the transferred amount. The fee is an assumption, not a current network quote.
| Entry | Wallet A | Wallet B | Combined |
|---|---|---|---|
| Opening balance | 2 | 0 | 2 |
| Two transfer legs | −0.5 | +0.5 | 0 |
| Network fee | −0.001 | 0 | −0.001 |
| Closing balance | 1.499 | 0.5 | 1.999 |
Wallet A reconciles as 2 − 0.5 − 0.001 = 1.499 ETH. The portfolio has not lost 0.5 ETH; those units changed location. Only the network fee reduced the combined quantity. Including the fee in the outgoing amount and subtracting it again in a fee column would produce the wrong closing balance.
An exchange may show withdrawals net or gross of fees. Check the export’s definition before applying the example to your account. The distinction between execution commission, withdrawal charge and network cost is covered in our exchange-fee comparison.
A reconciled balance does not establish profit
The acquisition cost of an incoming asset is not necessarily its market value when it arrives. If the original purchase record is missing, flag the cost as unresolved instead of entering zero. Quantity reconciliation can be complete while the return calculation remains uncertain.
Provider dashboards can also use their own assumptions. Coinbase’s US beta portfolio-performance feature may treat external transfers as assumed returns. Its “realized return” figure can therefore differ from a sale-based calculation covering all your accounts. A dashboard label should not replace the underlying transaction evidence.
Separate the result on units sold from the changing value of units still held. Our realised and unrealised profit and loss example explains the distinction. Once purchase quantities and costs are verified, an average-cost calculation can provide a cross-check. It cannot supply missing purchase history or select the tax-lot method appropriate to your situation.
Investigate closing-balance differences in order
For each account and asset, calculate opening balance + inflows − outflows − separately recorded fees = closing balance. Do not subtract fees again if the outflow already includes them. Reconcile asset units before looking at the dollar total: market moves can hide a quantity error.
- Check the reporting window and time zone first. A movement near midnight may sit in the adjacent day’s export.
- Look for missing accounts, networks and token records. Keep different contracts separate even when their symbols match.
- Inspect failed on-chain transactions. No asset transfer does not necessarily mean no fee was charged.
- Compare overlapping reports. Appending a second export in full can duplicate part of the first period.
- Leave unexplained differences in an exceptions list with their amount, source and required evidence. Do not invent a balancing “other expense”.
Close the review when coverage is complete, transfer pairs are matched and remaining differences are explained. In KriptoMeta’s approach, the useful test is whether you can trace a number back to its source row. Restrict access to raw exports and remove personal details from copies you share. Recovery phrases and private keys have no place in a transaction spreadsheet.



















