What the app says when something goes wrong

Checked against app build 2026-08-26-01-41 on 2026-08-26.

A standing rule from the product’s own roadmap, no silent failures, no generic something-went-wrong. Every failure message in the app names its cause and its next step, and this page collects them so you can look one up rather than wonder. Messages are quoted from the shipped build.

Why did my import fail or refuse rows?

Because the file’s columns matched nothing the parser recognises, or because individual rows were missing something the computation needs. Both cases name themselves.

“Nothing in this reads as transaction data, no date, amount or asset column was recognised, so there is nothing to import from it.” That is a file whose columns match no known export shape, or prose, or a binary, or a header with no rows under it. The message carries its own next step, send us the first few lines and the format gets added. “The file appears to be empty” is the simpler case, an empty paste or a zero-byte file.

Recognised files with unusable rows are never trimmed out of sight. Every refused row is shown with its reason as header-to-value pairs, deleted inside the source app, bank money only, no sent or received amount, with the first rows open by default. Read the reasons, nothing was guessed at. If the count still puzzles you, the import prints the literal equation of rows against tax events, explained in the reconciliation count, and count mismatch covers the five honest reasons a source’s count and ours differ.

“That file is not a gains.tax session” means a session restore was handed something else. Pick the gains-session.json the app downloaded, not a report and not a CSV.

Google Sheets links have their own three. “That does not look like a Google Sheets link” for a malformed URL, “Could not fetch it, Google answered N” for a fetch failure, and “Could not fetch it, the sheet is not shared as Anyone with the link” when Google returns a sign-in page instead of data. That last one is the usual cause and the fix is the sheet’s share setting, not anything in the app. The full list of readable sources is in supported formats.

What do the wallet scanning errors mean?

They separate a bad address from an empty address from a busy explorer, and only the last one is worth retrying.

“That does not look like a Bitcoin address” and “That does not look like an EVM address, expected 0x and 40 hex characters” are shape checks that run before any network call, so a typo never leaves your machine. “No confirmed history found on that address” is a valid address with nothing on chain, usually a typo that still passed the shape check, or the wrong chain selected.

“The chain read failed, mempool.space answered N. Rate limits pass in a minute or two,” or the same sentence naming whichever explorer refused, means the public explorer was unavailable or rate-limiting. Wait and rescan, rows you already hold are skipped automatically. “The read stopped at the page cap, very deep histories need more than one pass” is not a failure at all, it is a disclosed limit, and rescanning continues from where it stopped. More on the whole flow in wallet scanning.

What do the valuation messages mean?

“Valued N of M from daily closes” is the outcome line, and it always appears, whether or not everything priced.

Any remainder opens the fallback drawer naming each token that has no public daily close, offering a unit price you set, marked as set by you, or a one-click quarantine. Nothing about pricing can fail out of sight. “Nothing needs a value” and “Nothing is left without a value” are the empty-state lines, both meaning there is no pricing work outstanding.

Why did my exchange sync fail?

The connection row says “Failed.” and then names the exact cause, either the relay’s answer or the exchange’s own words.

Before a connection saves, “Both the key and the secret are needed” and “The relay address needs to start with https” catch the two setup mistakes. After that, “the relay answered N” means the relay was down or blocked, see the relay for what it is and how to run your own. “Kraken said X” or “Binance said X” is the exchange refusing the key, and wrong permissions or an invalid key are the usual causes. Kraken keys need only Query Funds plus Query Closed Orders and Trades, Binance keys only Enable Reading. Setup is walked through in Kraken sync and Binance sync.

Why will my licence key not activate?

Almost always because it did not copy across whole.

“Paste the key from your licence email first” is an empty activation. “That key does not verify, check it copied across whole” is a signature failure, and truncation in copy-paste is the usual cause, so select the whole key including its last character. Line breaks from email wrapping are fine, they are stripped. “Licensed to {email}, though this workspace is past the key’s cover” is a valid key smaller than your workspace, and the lock card names the cap and where bigger keys live. Nothing about your computation locks in any of these cases, see downloading reports.

They distinguish a link that has ended its life from a link that arrived damaged, and the fixes are different.

“The link has expired or was revoked. Ask the sender for a fresh one” is the designed end of a link’s life, the blob is gone and no amount of retrying brings it back. “the key in this link does not open this envelope” means the link arrived truncated or altered, the decryption key lives in the link fragment so the link must be shared whole, in one piece, not wrapped across two lines of a chat message. “The share did not upload, {cause}” and “The share service answered N” are the service being unreachable or erroring, retry later. “this envelope version is not recognised” means the share was made by a newer build, reload the app page. “the envelope inflates past the safety cap” is a decompression bomb refused by design, and “The envelope opened but does not hold a workspace” should not occur through the real share dialog at all.

What happens if my browser refuses to save, or a screen crashes?

The app tells you once, immediately, and both messages come with your data still in hand.

“This browser is refusing storage, so nothing is being saved. Download your session file from Settings to keep your work.” That is both IndexedDB and localStorage refusing writes, and private browsing modes and full disks are the usual causes. Take the message literally, download the session file, it is the one error on this page worth memorising. The Saved pulse only ever shows when a write actually happened, so it never lies to you about work being safe.

The crash card, “This screen hit an error. Your data is safe and saved,” appears with a session download button and the error text if any screen fails to render. Data is never lost to a paint failure. “Nothing to report yet, bring your history in first” is a report download with no computed data behind it, and “Could not reach the clipboard” variants always name what still worked, the pack still downloads, or copy it from the field.

The small ones, everywhere else

Row editing, help, and exports each have one honest line apiece.

“It needs at least a date and a quantity” appears when saving a transaction row missing both essentials. “Your email app should be opening. No mail handler here, use Copy instead” is the Write to [email protected] button on a browser with no mail handler, followed by “Copied, paste it into any email to [email protected]” or “Could not reach the clipboard, select the text by hand” on the copy path. “Nothing matches this filter, nothing to export” is Export this view with an empty filter result.

If a finding rather than a failure is what you are looking at, the two heaviest are covered in missing acquisitions and per-wallet balancing, and near-duplicate flags in duplicates.

If you meet a failure that does not explain itself, that is a bug by definition, tell [email protected] and it gets fixed to this page’s standard.