This is a record-keeping tool, not tax advice — it computes arithmetic on the numbers you enter (average cost basis, FIFO-ordered lots), and the export is a starting point for your own tax preparation, not a finished tax document. Verify results before filing anything. Each logged buy also shows how many days it's been held and whether it's crossed the one-year mark the IRS uses to draw the line between short-term and long-term capital gains — a real, recurring question for anyone DCAing, computed fresh every time you load this page. When you're ready to sell, log it below: this tool matches each sale against your buys oldest-first (FIFO), highest-cost-first (HIFO), or against exactly the lot(s) you pick yourself — and reports the realized gain or loss, split by holding term.
Type in today's price yourself to see unrealized gain/loss below — this page has no live price feed and never fetches one. Use a finite price greater than zero; blank or invalid prices withhold current-value and unrealized-gain estimates.
Average cost basis over time
running average cost basiseach buy's price
| Date | USD spent | Price | Held | BTC acquired | Cumulative BTC | Cumulative cost |
|---|
No buys logged yet — add one above to get started.
CSV import limit: 1 MiB (1,048,576 bytes) per file. Larger files are rejected before reading to bound memory use. Split larger reports into non-overlapping files with the same header; import buys before sells. Named CSV columns may be reordered; keep each required exported header exactly once. Headerless rows must retain the exported column order. Imports append records, so repeated rows create duplicates.
localStorage. Clearing browser data can erase them. Export both CSV reports for reference, but keep original transaction records and specific-lot allocation details separately: exports preserve stored transaction inputs as decimal numbers, but round derived report totals and omit stable lot IDs, per-lot allocations, method settings and preferences. Do not clear browser data expecting CSV imports to restore everything. Import CSV and Import sells CSV append entries rather than replace or deduplicate them; reimporting can create duplicates and different calculated results.Save a raw data archive
Download the tracker's saved buys, sells, stable IDs, specific-lot allocations, method, price and tax-rate settings as JSON, without CSV rounding. This copies saved browser storage only; unfinished form edits and records that failed to save are not included. There is no JSON restore button yet. Keep browser data and original records; do not treat this as a tested backup-and-restore workflow or import it using the CSV buttons.
The file is unencrypted and contains sensitive financial records. Store it privately; it is generated locally and is not uploaded.
Check a downloaded archive against the data currently saved in this browser. This compares raw storage strings, not transaction correctness or recoverability. It does not restore, merge or change any records, and does not upload the file. Limit: 10 MiB.
Record preflight also checks archived transaction field types, dates, IDs and explicit allocation references, and previews record counts. It does not simulate inventory matching, validate settings or taxes, or prove the archive can be restored.
Separate settings preflight checks the saved matching method, manual price and tax-rate input types/ranges. Missing settings remain unset (the tracker defaults to FIFO); missing tax rates are not zero. Passing these checks does not verify market prices, applicable tax rates, inventory or restoration.
Chronological inventory preflight checks whether archived sales can be matched to available archived buys under the saved method. Same-date buys are eligible; same-date sales use archive order. Explicit allocations take priority; unallocated sales use FIFO unless the saved method is HIFO. This is a read-only simulation, not a restore or a tax-eligibility test. BTC arithmetic uses floating point, not exact satoshi accounting. A passing preview includes approximate acquired, sold and remaining BTC totals for reviewing the archive; these are not wallet balances or proof of ownership.
Replacement impact preview compares saved transaction IDs in this browser with the archive: records that would be added, removed or changed by replacement, not merging. It ignores object-property order, but treats other stored field differences as changes. Retained-ID order compares the relative array order of IDs present in both copies, separately for buys and sells; additions and removals are counted separately. Reordering can affect matching, especially same-date sales and tied buy lots. An unchanged order does not mean matching results or settings are unchanged. It excludes unsaved form edits. This is read-only; JSON restoration remains unavailable.
Realized gains (FIFO)
Log a sell and this tool matches it against your logged buys to compute realized gain or loss. Each match carries the holding period of the specific buy it came from, so a single sale can be part short-term and part long-term if it draws from lots bought more than a year apart. Fill in the fields below and a live preview shows what that sale would realize before you commit it — useful for comparing methods or nudging the date/amount ahead of time.
Enter how much BTC to take from each open lot below — the "BTC sold" amount is set automatically from what you allocate here. Each lot shows its holding status, including how many days remain until a short-term lot would qualify for long-term treatment — useful if waiting a little longer would lower the tax rate on that gain.
| Date | BTC sold | Proceeds | Cost basis | Gain/loss | Term (FIFO) |
|---|
No sells logged yet.
Realized gains by tax year
Most tax filings (e.g. U.S. Schedule D / Form 8949) separate short-term from long-term gains per calendar year — this splits your realized totals above the same way, most recent year first.
Enter both rates from 0 to 100 (enter 0 explicitly for a zero-rate assumption); estimates are withheld when either rate is missing or invalid. Enter your own rates to fill in a rough "Est. tax" column below — a simple rate × net gain multiplication per year. It ignores loss carryover between years, other income, tax brackets, and state tax, so treat it as a ballpark, not a filing figure.
| Year | Short-term gain/loss | Long-term gain/loss | Total | Est. tax |
|---|
Common questions, answered directly
Does this tool send my Bitcoin buys and sells anywhere?
No. Every entry is saved only in this browser's localStorage — there's no account, no server, and no network request carrying your data anywhere. CSV exports preserve stored transaction inputs as decimal numbers but round derived report totals. They are not complete backups: they omit stable lot IDs, specific-lot allocations, the selected method settings and preferences. Keep original transaction records and allocation details separately. Imports append entries and can create duplicates; reimported results may differ.
Should I use FIFO, HIFO, or specific-lot selection?
These controls model lot matching; they do not make a valid tax election or send instructions to your broker. FIFO uses the earliest acquired lots, HIFO uses the highest cost per BTC, and specific-lot mode uses your selections. For U.S. digital assets, specific identification has timing and record requirements. For broker-held units sold after December 31, 2025, identification generally must reach the broker no later than the transaction, using identifiers the broker accepts; adequate records are also required. Selecting a method here after a sale does not satisfy that requirement. Default FIFO applies when valid identification is absent, within the relevant wallet or account. Keep original transaction and broker records and consult a qualified tax professional; this pooled tracker is not a substitute.
Source: IRS digital asset FAQs 82–89, covering identification timing, broker instructions, standing orders and default FIFO.
Is this tool's CSV export enough to file my taxes?
No. These are generic tracker reports, not a Form 8949 export or a verified import format for any tax-software product. The sells report has one row per sale, not one row per matched acquisition lot, and does not include acquisition dates for those matches. A sale can include both short-term and long-term lots. Do not assign the whole sale to one holding term or treat blank basis/gain cells marked INCOMPLETE as zero. Reconcile the underlying lots and original records, check your software's required format, and obtain tax advice before filing. These reports also omit wallet/account identity, income, tax brackets and loss carryovers.
Can I track Bitcoin bought across several exchanges or wallets in one place?
Only as a combined educational overview, not a wallet-by-wallet tax ledger. This tracker pools all entered buys and sells; it does not record wallet or account identity or track transfers between them. U.S. digital-asset basis rules effective January 1, 2025 apply specific identification or FIFO within a single wallet or account, rather than one universal pool. Combining unrelated accounts here can therefore select the wrong lots for tax reporting. Keep wallet-level transaction and transfer records separately and reconcile with a qualified tax professional before filing.
Source: IRS Revenue Procedure 2024-28, section 2 (PDF), explaining the transition from universal pooling to single-wallet or account rules. This tracker does not implement that transition.
What happens to my data if I clear my browser or switch devices?
It's gone from that browser — localStorage doesn't survive a data clear, a different browser, or private/incognito mode, and nothing is backed up anywhere else. Export both CSV reports for reference, but do not clear browser data on the assumption that they can restore everything: derived totals are rounded and specific-lot allocations, stable IDs, method settings and preferences are omitted. Keep independent original records. Imports append rather than replace or deduplicate entries, and recalculated results can differ.
Building your own tracker? The cost-basis, FIFO-matching, and stacking-plan arithmetic on this page is open source: dca-math on GitHub (MIT licensed, zero dependencies).