Wallet reconciliation is a small accounting exercise, not a price forecast. The objective is to explain every unit shown in a wallet, exchange export, and personal record. A useful reconciliation can be repeated: someone else should be able to follow the same addresses, networks, time range, and exchange-rate source and reach the same subtotal. This guide uses Bitcoin UTXOs and Ethereum token balances as examples, while keeping the method general enough for other chains.

Define the reporting boundary

Start by writing the cut-off time in UTC, the networks included, and the wallets or accounts you control. A phone wallet can display Bitcoin and an Ethereum token under one brand while they are unrelated ledgers. Record the public address, derivation account or account label, and whether an exchange balance is custody or an on-chain address. Never put a seed phrase or private key in the spreadsheet. The boundary prevents a common mistake: comparing today’s wallet total with a ledger that stopped last month.

Break Bitcoin into UTXOs

Bitcoin does not store a single balance at an address. A transaction creates outputs, and each unspent output can later become an input. Export the wallet’s UTXO list or inspect the transaction history and record transaction id, output index, amount, confirmation state, and whether the wallet marks it as change. Sum only spendable outputs inside the chosen boundary. A pending incoming output belongs in a separate column. If a wallet hides watch-only or frozen coins, document that filter rather than silently treating the displayed total as complete.

Separate Ethereum native value and tokens

For an Ethereum-style account, native ETH pays network fees while ERC-20 contracts report token balances. Copy the chain id, account address, token contract address, decimals, and block number used for the check. Two tokens can share a ticker but have different contracts. Convert raw integer units with the contract’s decimals and keep the raw value beside the formatted value. A token balance at block 20 million is a historical observation; it is not necessarily the balance shown after later transfers.

Reconcile movements and fees

Match each ledger movement to a transaction hash and status. For Bitcoin, the amount received, amount sent, and fee are represented by input and output differences. For Ethereum, record the transaction value and gas cost separately, then match token Transfer events to the account. Failed Ethereum calls can still consume gas while moving no token. A spreadsheet row should state whether the movement is on-chain, an internal exchange transfer, a bridge event, or an adjustment awaiting evidence.

Use an exchange-rate snapshot carefully

A fiat column requires a source, quote currency, timestamp, and rounding rule. Do not recalculate an old acquisition with today’s market price and call the result cost basis. Store the original quantity and transaction time first; add a valuation view second. When an exchange export uses a local timezone, convert it once and keep the original timestamp so a later reviewer can reproduce the conversion. A rate is an input to a report, not evidence that a trade occurred.

Investigate a mismatch without improvising

When totals differ, compare scope before blaming the chain. Typical causes include a second derivation account, a hidden token contract, an unconfirmed transaction, a bridge escrow, a dust UTXO, or a fee recorded in the wrong currency. Re-run the query at the same block or cut-off, then compare transaction ids. Do not “fix” a mismatch by creating a manual transfer or sending a test payment. Mark the item unresolved and link the official wallet or explorer documentation used.

Preserve an audit packet

Save a read-only export, public addresses, explorer URLs, query timestamps, exchange CSV files, and the calculation version. Encrypt the local archive and remove secrets from screenshots. If another person helps, share only public evidence and a redacted ledger. The packet should explain every formula, including decimal conversion and rounding. A clear unresolved-items list is better than a forced zero difference, because it shows which observation still needs an official account statement or support response.

Worked example: one-day close

Suppose a Bitcoin wallet shows 0.041 BTC, but the ledger shows 0.0405 BTC. First list each confirmed UTXO and the fee column; the missing 0.0005 may be a fee, a pending output, or a second account. For an Ethereum account, reconcile native ETH and each token contract separately, then compare the block numbers used by the wallet and explorer. If a family member supplied the funds, preserve the sender hash and do not infer ownership from the address label. The close is complete only when every difference has a source, calculation, or unresolved flag.

Frequently asked question

What is the most important reconciliation rule?

Keep raw on-chain units, formatted display values, and fiat valuations in separate fields. That separation makes a decimal error visible and stops a changing market quote from rewriting transaction history.