From your first import to Form 8949: how Sovereign Tax tracks your bitcoin, and how to record every buy, sale and transfer so your cost basis is right.
Updated for version 1.5.2Sovereign Tax runs entirely on your computer. There is no account and no cloud: your data is stored locally and encrypted with a key derived from your PIN. On first launch you accept the Terms of Service and choose a 4–6 digit PIN; after that, the app opens to a lock screen.
Because nothing is stored in the cloud, your backups are the only copy of your data outside this computer. Create one in Settings → Backup & Restore after each work session (see Settings, backups and privacy).
Import a CSV from each exchange or wallet (Import), and add anything missing by hand (Add Transaction). You need every purchase that funds a later sale, including prior years.
For every move between wallets you own, make sure there is a Transfer In on the receiving wallet and assign its source wallet. This is what moves your cost basis. See Transfers between your wallets.
Sales use FIFO by default. To pick lots yourself, or let the app pick the lowest-tax lots, use Lots or Optimize in Transactions. See FIFO, Specific ID and Optimize.
Work through the Review checklist until it's all green, then export Form 8949 (PDF or CSV) or a TurboTax file from Tax Report. Create a backup.
From January 1, 2025, IRS rules require cost basis to be tracked per wallet or account (Treasury Reg. §1.1012-1(j)). When you sell bitcoin, the cost basis has to come from lots held in the wallet you sold from. So every transaction in Sovereign Tax belongs to a wallet, and it has two name fields:
| Field | What it means | Used for |
|---|---|---|
| Wallet | The wallet or account this record's coins are in. On a Transfer Out, that's the wallet the coins left. On a Transfer In, it's the wallet they arrived in. | Cost basis. Holdings, per-wallet lot selection and wallet balances are all keyed by Wallet. |
| Exchange | A label for the platform or account: "Swan", "ColdCard", an LLC's name. | Display and grouping. Cost basis ignores it unless Wallet is blank, in which case it's used as the wallet name. |
Export a CSV from your exchange or wallet software, then open Import. Supported out of the box: Coinbase, Kraken, Gemini, Strike, Cash App, River, Swan, Bisq, and any CSV with date, amount and price (or total) columns.
This field is required, and every row in the file is tagged with this name as its wallet. Wallet or account columns inside the CSV are not used. So import each account's CSV separately, under that account's own name, and reuse exactly the same name for later imports. The name also remembers your column mapping for next time.
Columns are detected automatically. Check the Column Mapping and Data Preview, and fix anything that wasn't recognized. Required: Date, Amount (BTC), and Price or Total. Type, Fee and Notes are optional.
Only bitcoin rows are imported; other assets are skipped. The same file can't be imported twice, and individual duplicate transactions are skipped too.
An exchange export usually shows withdrawals ("Send", "Withdrawal") and imports them as Transfer Out. A wallet export shows deposits ("Receive") and imports them as Transfer In. After importing, assign a source wallet to each Transfer In; see Transfers.
Add Transaction records anything that isn't in a CSV: a Buy, Sell, Transfer In, Transfer Out or Donation.
In Transactions you can search, filter by type and year, sort by any column, use Edit or delete on any row, and select several rows to delete them or change their Exchange together. Export CSV saves your full transaction list.
On rows where Wallet and Exchange were identical, which is the case for every imported row, bulk Change Exchange updates the Wallet too, so those lots move to the new name. That's usually what you want. Check Holdings afterwards.
Moving bitcoin between wallets you own (exchange to hardware wallet, hardware wallet to another exchange) isn't taxable. The cost basis and holding period travel with the coins. Because cost basis is tracked per wallet, the app needs to know which lots moved where, so that when you later sell from the new wallet, the right lots are there.
A Transfer In on the receiving wallet, with its source wallet assigned, is what moves cost basis. A Transfer Out on the sending wallet is optional: it completes your paper trail but doesn't move any lots by itself.
Wallet = the wallet the coins arrived in (e.g. "ColdCard Personal"). Amount = the amount received. Exchange is just a label; use whatever describes it ("ColdCard", or the account's name).
In Transactions, unassigned Transfer Ins show a red Assign button. Click it and choose the wallet the coins came from. The list shows each wallet's balance at the time of the transfer, and a wallet may be marked Suggested when a matching withdrawal was found (see Reconciliation).
Which lots moved? By default the oldest lots move first (FIFO). To choose, tick Choose specific lots to transfer and pick lots. The picker's Optimize button can pick for you. Any amount you don't pick is filled FIFO.
After saving, the row shows ← source and whether the lots were chosen by Specific ID or FIFO. Click it to change the assignment.
Wallet = the wallet the coins left (e.g. "Swan Personal"), with the same date and the amount sent. Exchange-exported withdrawals come in as Transfer Outs automatically. The Reconciliation page pairs it with its Transfer In.
A Transfer In moves only its own amount, and everything else stays in the source wallet. Moving 0.3 of your 1.0 BTC to another wallet is simply a 0.3 BTC Transfer In with its source assigned. Use Choose specific lots to transfer when it matters which lots moved.
| Date | Type | Exchange | Wallet | Source wallet (Assign) | BTC |
|---|---|---|---|---|---|
| Jan 5 | Buy | Swan | Swan Personal | — | 0.6 |
| Jan 20 | Buy | Swan | Swan Personal | — | 0.4 |
| Feb 1 | Transfer Out (optional) | Swan | Swan Personal | — | 1.0 |
| Feb 1 | Transfer In | ColdCard | ColdCard Personal | Swan Personal | 1.0 |
| Mar 1 | Transfer Out (optional) | ColdCard | ColdCard Personal | — | 0.3 |
| Mar 1 | Transfer In | SafeExchange | SafeExchange Personal | ColdCard Personal | 0.3 |
Holdings afterwards: Swan Personal 0, ColdCard Personal 0.7, SafeExchange Personal 0.3, each keeping its original purchase dates and cost basis. The March move is partial: 0.7 BTC stays on the ColdCard.
Setting a Transfer Out's Wallet to the destination. The Transfer Out always belongs to the wallet the coins left. In the March row above, that's ColdCard Personal, not SafeExchange Personal. The Reconciliation page warns you when both sides of a pair are in the same wallet.
| Change | Affects cost basis? |
|---|---|
| Any field on a Transfer Out | No. Transfer Outs don't move lots. |
| An Exchange label, with the Wallet unchanged | No. |
| A Transfer In's Wallet or source wallet | Yes. The lots are re-routed. Later sales whose Specific ID picks used lots that moved show a warning and fall back to FIFO, so re-run Optimize for that year. |
| A Buy's or Sell's Wallet | Yes. It changes which wallet the lots are in or come from. |
| Bulk Change Exchange | Possibly. It also renames the Wallet where Wallet and Exchange were identical, so check Holdings. |
Reconciliation checks your paper trail: it pairs each Transfer Out with its Transfer In and shows a balance for every wallet. Your tax numbers don't depend on this page, because cost basis moves only through the source wallets you assign. Pairs found here do power the Suggested source wallet in Assign.
A Transfer Out and a Transfer In are paired when the amounts agree (the received amount may be slightly lower, for the miner fee) and the deposit arrives 0–7 days later in a different wallet. When several deposits could fit one withdrawal, the app prefers, in order:
If two pairings between different wallets are still equally good, nothing is paired and both are marked Ambiguous.
| Item | Meaning | What to do |
|---|---|---|
| Matched Transfer Pairs | Withdrawal → deposit, with both wallet names. Manual marks pairs you linked yourself. | Check the wallets. Click Unmatch on any pair that's wrong. |
| Flagged for Review | Matched, but the implied miner fee is unusually high (above 0.0005 BTC). | Approve it or Unmatch it. |
| Ambiguous | More than one pairing fits equally well. | Match by hand, or assign the Transfer In's source wallet. |
| ✓ from … | A deposit with its source wallet assigned. It's accounted for even without a Transfer Out. | Nothing. Add a Transfer Out only if you want the full paper trail. |
| Unmatched Out | A withdrawal with no deposit found. | Normal for withdrawals to a wallet you don't track here. Otherwise add the Transfer In. |
| Unmatched In | A deposit with no withdrawal found and no source wallet. | Assign its source wallet (Transactions → Assign). |
| Pair warnings | Both sides are in the same wallet, or the deposit's source wallet differs from the withdrawal's wallet. | Fix the Wallet on the Transfer Out, or the source on the Transfer In, so they agree. |
Computed per wallet, using the same wallets as Holdings, from your records: buys and deposits add; sells, donations and withdrawals subtract. A Transfer In with a source wallet but no Transfer Out counts as leaving the source wallet. When every transfer is recorded consistently, these match your Holdings. A negative balance usually means a missing buy or transfer.
Sovereign Tax supports the two IRS-permitted methods. FIFO (first in, first out) is the default: each sale uses the oldest lots in its wallet. Specific Identification lets you choose exactly which lots each sale or donation uses, but it must be elected before the disposal.
Review is a guided checklist for the selected tax year. Fix these before exporting:
When everything is green, your data is ready for the Tax Report.
Tax Report shows Form 8949 and Schedule D figures for the selected year, split into short-term (held one year or less) and long-term. Sales that span both are split automatically. Specific ID elections from Transactions are applied automatically. Prior-year capital loss carryforwards (short-term and long-term) are entered in Settings → Tax Settings.
Since Form 1099-DA, bitcoin sales go in their own Form 8949 boxes, and the Form 8949 CSV and PDF group your sales by box, with a Schedule D summary by line:
| Box | When |
|---|---|
| G (short-term) / J (long-term) | Sold on an exchange whose Form 1099-DA shows your cost basis. |
| H (short-term) / K (long-term) | Sold on an exchange whose Form 1099-DA doesn't show cost basis — typically coins you moved onto the exchange from another wallet. |
| I (short-term) / L (long-term) | No Form 1099-DA: self-custody wallets, peer-to-peer sales. |
Tell the app which wallets are exchanges in Settings → Wallets or in the Review checklist. By default an exchange is assumed to report basis only for coins bought there on or after January 1, 2026 that never left the account; if your 1099-DA shows basis for every sale (or for none), choose that instead. Wallets you haven't classified are exported as box I/L with a warning. Each lot on the Tax Report shows its box.
For boxes G and J, compare with your Form 1099-DA: column (e) must show the basis the exchange reported. If it differs from the basis Sovereign Tax shows, enter the exchange's figure in (e) and the difference in column (g) with code B.
| Export | Use it for |
|---|---|
| PDF Report | A Form 8949 summary for your records or your preparer. |
| Form 8949 CSV | Entering Form 8949 manually or in other tax software. |
| TurboTax TXF / TurboTax CSV | Importing directly into TurboTax. These files have no field for the Form 8949 box, so check each sale's box in TurboTax against the Form 8949 CSV or PDF. |
| Raw Data CSV | Every sale broken out lot by lot: dates, proceeds, cost basis, fee and term. |
| Form 8283 CSV | Reference data for charitable donations (Form 8283). Donations aren't reported on Form 8949. |
Usually you don't need to: correcting a Transfer Out or an Exchange label doesn't touch your cost basis (see Fixing mistakes). If you do want a clean slate for a year's lot choices:
Settings → Backup & Restore.
In Transactions, select the year. Revert to FIFO removes that year's sale and donation elections. Clear Assignments removes that year's Transfer In source wallets and lot picks.
Click Assign on each Transfer In, choose its source wallet, and pick lots if you want.
Click Optimize for the year's sales, then work through Review.
Work from the oldest year forward, because each year's lot choices affect which lots remain for the next.
Log in to Coinbase and go to Account > Statements (or Reports > Transaction history in the newer layout). Select your date range, click Generate Report, download the CSV, and import it into Sovereign Tax.
Log in to Kraken and go to History > Export. Select "Ledgers" or "Trades" for your date range and download the CSV. Sovereign Tax handles Kraken's separate Received and Sent columns automatically.
Strike: Settings > Transaction History > Export. Cash App: open the Activity tab, tap the download icon, and choose a date range. Swan: History > Download CSV. All three formats are detected automatically.
One or more required columns haven't been mapped. You need Date, Amount, and either Price or Total. Use the dropdown next to each field to pick the matching column from your CSV. Once every required field is mapped, the warning clears and you can import.
Yes. Import each exchange's or account's CSV separately, each under its own Wallet / Exchange Name. Sovereign Tax combines them and tracks cost basis per wallet. A file that was already imported is rejected, and duplicate transactions are skipped.
Under the per-wallet rules that apply from 2025, every transaction has to belong to a specific wallet or account. The name you enter becomes the wallet for every row in that CSV, and it also remembers your column mapping for next time. Use one exact name per account every time you import: names aren't case-sensitive, but "Coinbase" and "Coinbase Pro" are two different wallets. See Wallets and exchanges.
No. Sovereign Tax is Bitcoin-only by design. Rows for other assets (ETH, SOL and so on) are skipped when you import; only BTC and XBT rows are processed.
Moving bitcoin between your own wallets isn't taxable (IRS FAQ 81): the cost basis and holding period stay the same. Under the 2025 per-wallet rules, though, the lots have to move to the receiving wallet so the right lots are there when you sell from it. That happens when you assign a source wallet on the Transfer In. See Recording a transfer, step by step.
A Transfer In records bitcoin arriving in a wallet. Assign tells the app which of your wallets it came from, so it can move those lots. For example, if you withdrew from Swan to your Trezor, click Assign on the Trezor's Transfer In and choose "Swan". The lots move to the Trezor with their original cost basis and purchase dates. Transfer Ins without a source wallet show a red Assign button.
It's what happens when you assign a source wallet: the app takes lots from the source wallet (oldest first, or the lots you pick) and moves them to the receiving wallet. A partial transfer splits a lot. Cost basis per BTC and the original purchase date carry over; only the wallet changes. This is how the app follows the 2025 per-wallet rules (Treasury Reg. §1.1012-1(j)) and IRS FAQ 81.
Yes. When you assign a source wallet, tick Choose specific lots to transfer and pick the lots that moved; the picker's Optimize button can pick for you. Any amount you don't pick is filled oldest-first (FIFO). This is useful when you want to follow a particular lot to cold storage and back to an exchange for a sale.
If you withdrew bitcoin to cold storage but only imported the exchange's CSV (which shows a Transfer Out), add the Transfer In on the receiving side. In Add Transaction, choose Transfer In, enter the date and the amount received, and set Wallet to your cold storage wallet. Then click Assign on that row and choose the exchange as its source wallet. Without it the lots stay on the exchange, and later sales from cold storage show wallet mismatch warnings.
Exchange CSVs don't say where a withdrawal went, and hardware wallets often have no CSV at all, so your records can't prove which of your wallets the coins came from. The Reconciliation page pairs withdrawals with deposits by amount and date, and those pairs mark a wallet as Suggested when you click Assign. The app never assigns a source wallet on its own: you confirm it, because that choice moves your cost basis.
It means Reconciliation paired this deposit with a withdrawal from that wallet: the amounts agree (the deposit can be slightly lower, for the miner fee) and the deposit arrived 0–7 days later. A yellow Possible match badge means a pair was found but flagged, usually because the implied fee is unusually high. Wallets without a badge are there for you to choose manually.
Wallet balances are built from your records: buys and deposits add; sells, donations and withdrawals subtract. A negative balance means your records show more bitcoin leaving that wallet than arriving. That usually points to a missing buy (for example an older CSV you haven't imported) or a transfer recorded against the wrong wallet. See The Reconciliation page.
A wallet mismatch (⚠️) means a sale used lots from another wallet because none were found in the wallet it was sold from. Usually a Transfer In is missing its source wallet. In Transactions, find the Transfer In that brought the coins into the selling wallet, click its red Assign button, choose the wallet the coins came from, and save. Once the lots are in the right wallet, the warning clears. If you use Specific ID, re-run Optimize for that year.
For one sale, click Lots on the sell or donation in Transactions, or choose Specific ID when you add the sale. For a whole year, Optimize (N) assigns the lowest-tax lots to every sale that doesn't have an election yet, and shows the FIFO and optimized totals before you apply anything. Compare Methods shows the difference, and Simulate Sale lets you try a sale first. See FIFO, Specific ID and Optimize.
Yes. In Transactions, click Lots on any sell or donation. You'll see the lots that were available at the time of that sale; select your lots, preview the tax impact, and save. To remove an election, use Revert to FIFO in the same window.
IRS note: under Treas. Reg. §1.1012-1(c) and IRS FAQ 82, Specific ID must be elected at or before the time of sale. Assigning lots afterwards may not satisfy the IRS unless you identified the lots before the sale. For 2025 and 2026 transactions, IRS Notice 2025-07 (extended through 2026 by Notice 2026-20) lets you record the identification for bitcoin held on an exchange in your own records instead of with the exchange — but it still has to be made by the time of the sale. For earlier years, FIFO applies to any sale without a contemporaneous election.
Keep prior years as FIFO. If you filed using FIFO, or never made Specific ID elections at the time of sale, leave those years as FIFO in the app: retroactively assigning lots to past sales is generally not permitted (Treas. Reg. §1.1012-1(c)(1)). You can use Specific ID for current and future sales by making the election at or before the time of sale. For 2025 and 2026 transactions, IRS Notice 2025-07 (extended through 2026 by Notice 2026-20) lets you record the identification for bitcoin held on an exchange in your own records instead of with the exchange — but it still has to be made by the time of the sale. Use the year selector to check each prior year.
FIFO is the default for every sale; Specific ID applies only to the sales where you've chosen lots. Your figures update as soon as you add or remove an election, and Revert to FIFO removes a whole year's elections if you change your mind. Explore freely, but when you file, the IRS expects one method to be applied consistently per wallet within a tax year.
A sale that uses both short-term and long-term lots. For example, selling 1 BTC where 0.6 BTC was held 8 months (short-term) and 0.4 BTC was held 2 years (long-term). Sovereign Tax splits it into separate short-term and long-term lines on Form 8949 automatically.
Yes. In Transactions, click Del on the sell and confirm. The lots it used are restored exactly as they were, because cost basis is recalculated from your remaining transactions. The deletion is recorded in the Audit Log.
If an edit changes which lots exist (a lower amount, a different wallet or a different type), or you delete the Buy, any Specific ID elections that used its lots are removed. Those sales go back to FIFO until you choose lots again with Lots. This keeps stale lot references out of your tax figures.
Under the 2025 per-wallet rules, a sale must use lots from the wallet it's made in, so harvesting opportunities are per wallet. Choose a wallet to see its opportunities; All Wallets gives a portfolio-wide overview, but each actual sale has to come from one wallet.
Review is a checklist for the selected tax year: assign a source wallet on every Transfer In, resolve wallet mismatches, classify the wallets you sold from for Form 8949 (2025 and later), and optionally optimize lot selections. When every check is green it shows Ready to File with a link to the Tax Report. See Review checklist.
For 2025 and later, bitcoin sales use boxes G/H/I (short-term) and J/K/L (long-term). Sales on an exchange whose Form 1099-DA shows basis go in G/J; exchange sales without reported basis (usually coins you moved onto the exchange) go in H/K; self-custody and other sales with no 1099-DA go in I/L. Mark your wallets in Settings → Wallets and the exports group sales by box. See Tax Report and exports.
In Add Transaction, choose Donation and enter the date, the BTC amount and the fair market value per BTC on the donation date. Use FIFO or pick lots with Specific ID, check the preview of which lots are used, and save. Donations appear in the Tax Report with a Form 8283 CSV export; they aren't reported on Form 8949.
Donating bitcoin to a qualified charity isn't a taxable sale: no capital gain or loss is recognized, and you may be able to claim a charitable deduction instead. If you held the bitcoin for more than one year, the deduction is generally its fair market value (limited to 30% of AGI); if you held it one year or less, it's limited to your cost basis. Sovereign Tax records these details and exports them for Form 8283.
FMV is the price the bitcoin would sell for on the open market on the donation date. The IRS uses it to work out your deduction, so enter the FMV per BTC for that date. With Live BTC Price turned on in Settings, the Fetch FMV button fills in the historical price from CoinGecko.
Only on your computer, encrypted with AES-256-GCM using a key derived from your PIN. Your data is never sent to any server: there's no cloud, no account and no telemetry.
The data stored in the app can't be recovered without your PIN. That's by design: there's no back door, no cloud recovery and no "forgot PIN" option, so keep your PIN somewhere safe. Backups are protected by their own backup password, not your PIN, so with a backup file and its password you can restore your data once the app has been reset. If you're locked out, email support for help resetting the app.
Go to Settings → About → Check for Updates. If a new version is available, you'll see what's new and a link to download it from sovereigntax.io.
In Settings, click Clear All Data and type DELETE to confirm. This permanently erases all your transactions, lot elections, mappings and history, so create a backup first. To redo only one year's lot choices, see Starting over for a tax year.
See Support for CSV and installation troubleshooting, or email us.
Describe the issue and include your Invoice ID (from your Strike receipt or Gumroad order) so we can look you up. Please don't send your data file or backup.
support@sovereigntax.io