Skip to content

1099-DA & Account-by-Account Basis

Starting in 2025, two major IRS regulatory changes affect how cryptocurrency taxes are calculated and reported:

  1. 1099-DA Box Categorization — Exchanges that issue IRS Form 1099-DA classify your transactions differently on Form 8949 and Schedule D, requiring PrivateACB to sort disposals into the correct reporting boxes.
  2. Account-by-Account Basis (T.D. 10000) — IRS Treasury Decision 10000 (Treas. Reg. §1.1012-1(j)) requires brokers to track cost basis on an account-by-account basis starting January 1, 2025, rather than pooling all lots together.

PrivateACB supports both features, allowing you to generate IRS-compliant reports that match how exchanges will report your activity to the IRS.

What you’ll learn:

  • How to configure exchange 1099-DA reporting status
  • What Form 8949 box categories mean and how they work
  • How account-by-account cost basis tracking changes your calculations
  • How to use Create Transfer to resolve missing transfer records
  • How to read the updated reports
  • Troubleshooting common scenarios

Time to read: 15-20 minutes Prerequisites: Familiarity with US Tax Calculation Guide and US Reports User Guide


Form 1099-DA (Digital Asset Proceeds from Broker Transactions) is a new IRS form that cryptocurrency exchanges will issue starting in 2025. Similar to how your stock broker sends you a 1099-B, crypto exchanges will now send you (and the IRS) a 1099-DA reporting your proceeds from digital asset sales.

When an exchange issues a 1099-DA, the IRS already knows about your transactions. This means:

  • Your Form 8949 entries must match what the exchange reported
  • Transactions are sorted into different boxes on Form 8949 depending on whether the exchange reported them
  • Schedule D line items change based on the reporting status

Form 8949 has multiple boxes that classify transactions based on two factors:

  1. Holding period — Short-term (held 1 year or less) or Long-term (held more than 1 year)
  2. 1099-DA reporting status — Whether the exchange reported the transaction to the IRS
BoxHolding Period1099-DA StatusSchedule D Line
GShort-term1099-DA with cost basis reportedLine 1b
HShort-term1099-DA without cost basis reportedLine 2
IShort-termNo 1099-DA receivedLine 3
JLong-term1099-DA with cost basis reportedLine 8b
KLong-term1099-DA without cost basis reportedLine 9
LLong-termNo 1099-DA receivedLine 10

How to read this table:

  • Box G means the exchange sent you a 1099-DA that includes both proceeds and cost basis, and the transaction was short-term. This goes on Schedule D Line 1b.
  • Box I means the exchange did not send a 1099-DA (perhaps it’s a decentralized exchange or foreign exchange), and the transaction was short-term. This goes on Schedule D Line 3.

For 2024 and prior years, 1099-DA did not exist. All transactions use simplified box categories:

BoxHolding PeriodSchedule D Line
CShort-termLine 3
FLong-termLine 10

PrivateACB automatically applies the correct box categorization based on the tax year of your calculation.


To generate correctly categorized reports, you need to tell PrivateACB which of your exchanges have issued (or will issue) a 1099-DA.

Step 1: Open Exchange Form Status Settings

Section titled “Step 1: Open Exchange Form Status Settings”
  1. Navigate to the Settings tab
  2. Find the Exchange Form Status (1099-DA) card and expand it
  3. You will see a table listing exchanges detected from your imported transaction data, with a Tax Year selector at the top

Exchange Form Status Settings

Use the Tax Year dropdown at the top of the section to choose the year you are configuring. Exchange form status is stored per tax year — you can have different settings for 2025 vs 2026.

Note: For tax years 2024 and earlier, a message reminds you that 1099-DA boxes (G–L) apply to 2025+ only — pre-2025 calculations automatically use Box C/F regardless of these settings.

The table has three columns:

ColumnWhat It Does
ExchangeThe exchange name (detected from your imported data)
Received 1099-DACheck this box if the exchange sent you a 1099-DA form
Basis Reported to IRSCheck this box if the 1099-DA includes your cost basis (only available when “Received 1099-DA” is checked)

The two checkboxes combine to produce three effective states:

Received 1099-DABasis ReportedResultForm 8949 Boxes
Exchange did not issue a 1099-DABox I (short-term) / Box L (long-term)
Exchange issued 1099-DA without cost basisBox H (short-term) / Box K (long-term)
Exchange issued 1099-DA with cost basisBox G (short-term) / Box J (long-term)

To configure an exchange:

  1. If the exchange sent you a 1099-DA, check the Received 1099-DA box
  2. If that 1099-DA also included your cost basis, check the Basis Reported to IRS box
  3. Changes save automatically and apply to your next calculation

Tip: Unchecking “Received 1099-DA” automatically unchecks “Basis Reported to IRS” — an exchange can’t report your basis without first issuing the form.

Exchange 1099-DA Checkboxes

After configuring your exchanges:

  • Exchanges with both boxes checked will produce Box G/J transactions (1099-DA with basis)
  • Exchanges with only “Received” checked will produce Box H/K transactions (1099-DA without basis)
  • Unconfigured exchanges will produce Box I/L transactions (no 1099-DA)

Important notes:

  • By default, all exchanges start with both boxes unchecked — transactions will be categorized in Box I (short-term) or Box L (long-term). A note at the bottom of the panel reminds you: “Most self-calculating users did not receive a 1099-DA for 2025. Only check if your exchange issued one.”
  • Hardware wallets (Ledger, Trezor) and self-custody wallets should remain unconfigured (they never issue 1099-DA)
  • You only need to configure exchanges for tax years 2025 and later

After running a calculation for 2025+, your Form 8949 report will organize transactions by box:

Form 8949 Box Categories

Each box section includes:

  • Box letter and description (e.g., “Box G — Short-term, 1099-DA with cost basis reported”)
  • Individual transactions with date acquired, date sold, proceeds, cost basis, and gain/loss
  • Subtotals for each box

Tip: If you see transactions in Box I or L that should be in G/J or H/K, check your exchange 1099-DA configuration in Settings.

Schedule D now shows line-level detail matching the Form 8949 boxes:

Part I — Short-Term Capital Gains and Losses:

LineSourceCorresponding Form 8949 Box
1bTransactions reported on 1099-DA with basisBox G
2Transactions reported on 1099-DA without basisBox H
3Transactions not reported on 1099-DABox I

Part II — Long-Term Capital Gains and Losses:

LineSourceCorresponding Form 8949 Box
8bTransactions reported on 1099-DA with basisBox J
9Transactions reported on 1099-DA without basisBox K
10Transactions not reported on 1099-DABox L

Schedule D Line Breakdown

Key totals:

  • Line 7 = Total short-term (sum of Lines 1b + 2 + 3)
  • Line 15 = Total long-term (sum of Lines 8b + 9 + 10)
  • Line 16 = Combined total (Line 7 + Line 15)

Part 2: Account-by-Account Cost Basis Tracking

Section titled “Part 2: Account-by-Account Cost Basis Tracking”

Traditionally, PrivateACB pools all your tax lots together when calculating cost basis. If you bought 1 BTC on Coinbase and 1 BTC on Kraken, both lots go into the same pool — when you sell on either exchange, FIFO (or your chosen method) picks from the combined pool.

Starting January 1, 2025, IRS Treasury Decision 10000 (Treas. Reg. §1.1012-1(j)) requires brokers to track cost basis on an account-by-account basis. This means:

  • Lots purchased on Coinbase can only be used when selling on Coinbase
  • Lots purchased on Kraken can only be used when selling on Kraken
  • Each account/exchange maintains its own independent pool of tax lots

T.D. 10000 aligns cryptocurrency reporting with how traditional securities have always worked — your Fidelity account tracks its own cost basis separately from your Schwab account. With the introduction of Form 1099-DA, exchanges need to report cost basis, and they can only report basis for lots they hold.

PrivateACB handles the transition automatically within a single calculation:

Transaction DateCost Basis Method
Before January 1, 2025Universal pool (all lots combined)
January 1, 2025 and laterAccount-by-account pools (lots grouped by account/exchange)

This means a single tax calculation can span both rules. For example, if you’re calculating 2024-2025:

  • 2024 sales use the traditional universal FIFO
  • 2025 sales use account-by-account FIFO

Transition Safe Harbor (Rev. Proc. 2024-28)

Section titled “Transition Safe Harbor (Rev. Proc. 2024-28)”

The IRS provides a transition safe harbor under Revenue Procedure 2024-28. This allows taxpayers to allocate their existing lots (acquired before 2025) across accounts using a reasonable method. PrivateACB handles this by assigning each lot to the account where it currently resides based on your transaction history.


  1. Navigate to the ACB Calculator tab
  2. In the Configuration Bar at the top, select:
    • Jurisdiction: United States
    • Tax Year: 2025 (or later)

Config Bar — US 2025

Step 2: Enable Account-by-Account Tracking

Section titled “Step 2: Enable Account-by-Account Tracking”
  1. In the Configuration Bar, locate the “Account-by-Account” toggle (right side)
  2. Click to enable it — the toggle highlights to show the active state

Account-by-Account Toggle Active

Note: The Account-by-Account toggle appears whenever the jurisdiction is set to United States, but it is disabled (grayed out) for tax years 2024 and earlier — hovering shows the tooltip “Account-by-Account Tracking requires tax year 2025+”. Select a 2025+ tax year to enable it.

When you open the ACB Calculator with Account-by-Account enabled, PrivateACB automatically runs a preflight check — a validation-only pass of the calculation engine that detects problems before you commit to a full calculation. This catches issues like missing lots, transfer gaps, and other data problems that would cause a calculation to fail.

IndicatorMeaning
No iconPreflight passed — the asset is ready to calculate
Red X iconPreflight detected one or more issues that will prevent a successful calculation

Preflight Warning

Click the red X icon to see a diagnostic popover with:

  • Issue description — exactly what went wrong (e.g., “No lots found in Kraken”)
  • Resolution guidance — what you can do to fix it
  • Available accounts — which accounts currently hold lots for this asset
  • Create Transfer button — if lots exist on another account, you can move them directly. See Using Create Transfer.

The preflight check runs the actual calculation engine in validation-only mode, so it catches the same errors you’d see during a real calculation — but without persisting any results or modifying your data.

Select the assets you want to calculate and click “Calculate Selected”, or click “Calculate All” to process every asset with transactions. PrivateACB will:

  1. Process pre-2025 transactions using the universal lot pool
  2. Switch to account-by-account lot pools starting January 1, 2025
  3. Group tax lots by their current account/exchange

What to look for in results:

After calculation completes:

  • The Calculation History panel at the bottom shows a “PW” column with a checkmark (✓) for each asset that was calculated with account-by-account tracking enabled
  • All generated reports (Form 8949, Schedule D, Lot Tracking, Wash Sale) display “Tracking: Account-by-Account” in the header, confirming the calculation mode

Understanding Account-by-Account Lot Selection

Section titled “Understanding Account-by-Account Lot Selection”

Example: Universal vs Account-by-Account FIFO

Section titled “Example: Universal vs Account-by-Account FIFO”

Consider this scenario with BTC transactions:

Purchases:

DateAmountPriceExchange
Jan 15, 20231.0 BTC$25,000Coinbase
Mar 10, 20230.5 BTC$27,000Ledger
Jun 1, 20230.8 BTC$30,000Kraken
Aug 15, 20240.5 BTC$50,000Coinbase

Sale on Coinbase — Feb 15, 2025: Sell 0.5 BTC at $60,000

Universal FIFO (pre-2025 rules): Uses the oldest lot across ALL accounts:

  • Consumes from Lot 1 (Coinbase, Jan 2023, $25,000) — Long-term gain
  • Cost basis: 0.5 x $25,000 = $12,500
  • Gain: $30,000 - $12,500 = $17,500 long-term

Account-by-Account FIFO (2025 rules): Uses the oldest lot on Coinbase only:

  • Consumes from Lot 1 (Coinbase, Jan 2023, $25,000) — same result here because the oldest Coinbase lot is the overall oldest
  • Cost basis: 0.5 x $25,000 = $12,500
  • Gain: $30,000 - $12,500 = $17,500 long-term

Sale on Kraken — Mar 1, 2025: Sell 0.3 BTC at $62,000

Universal FIFO: Would use the next oldest lot overall:

  • Consumes from Lot 1 remainder (Coinbase, Jan 2023) — Long-term
  • Cost basis: 0.3 x $25,000 = $7,500

Account-by-Account FIFO: Uses the oldest lot on Kraken only:

  • Consumes from Lot 3 (Kraken, Jun 2023, $30,000) — Long-term
  • Cost basis: 0.3 x $30,000 = $9,000

In this case, account-by-account gives a different cost basis ($9,000 vs $7,500) because the oldest Kraken lot has a different cost than the oldest universal lot.


Before running an account-by-account calculation, PrivateACB checks that your data quality is sufficient for accurate account-by-account tracking.

The data quality check examines:

  1. Account assignment coverage — What percentage of your transactions have account/exchange information?
  2. Missing account information — Transactions without an account cannot be properly assigned to a lot pool

PrivateACB requires 95% or higher account coverage for a given tax year to enable account-by-account calculations without warnings. If your data falls below this threshold, you’ll see a warning before calculation proceeds.

If your account coverage is below 95%:

  1. Go to the Data Viewer tab
  2. Look for transactions with missing or blank Exchange/Wallet columns
  3. Edit these transactions to add the correct exchange or account name
  4. Return to the ACB Calculator and re-run the calculation

Common causes of missing account information:

  • Imported CSV files that don’t include an exchange column
  • Manual entries where the exchange field was left blank
  • Transfers between accounts where only one side was recorded

Account-by-Account and Transfers Between Exchanges

Section titled “Account-by-Account and Transfers Between Exchanges”

A common situation: you buy crypto on one exchange, transfer it to another, then sell. For example:

  • Buy 5 ETH on Coinbase
  • Transfer 5 ETH to Kraken (Send from Coinbase, Receive on Kraken)
  • Sell 5 ETH on Kraken

With account-by-account tracking, Kraken has no purchase record for those ETH — the lots were created on Coinbase. For the Kraken sale to succeed, the lots must move from the Coinbase silo to the Kraken silo.

PrivateACB automatically detects and matches transfer pairs in your imported data:

  1. Transfer matching — Before calculation, PrivateACB scans for Send/Withdrawal transactions paired with Receive/Deposit transactions. A match requires the same asset, similar quantity (within 2% to account for network fees), and timestamps within 48 hours.

  2. Lot movement — When a matched transfer is found, the tax lots are moved from the source account to the destination account using FIFO order (as required by §1.1012-1(j)(1)). If only part of your holdings are transferred, the lot is split accordingly.

  3. Audit trail — Each lot retains its Origin (where it was originally purchased) even after being moved. The Lot Tracking report shows both the current Account and the Origin for each lot.

If your imported data is missing the Send/Receive records for a transfer, PrivateACB cannot move the lots to the destination account. In this case, the calculation will fail with a clear error message telling you exactly what happened:

No lots found in “Kraken” — your lots are in: Coinbase. Account-by-Account tracking requires Send/Receive records in your imported data to move lots between accounts. Import the missing transfer transactions, or turn off Account-by-Account Tracking in the config bar.

This strict enforcement ensures your tax calculations comply with T.D. 10000 — silently pulling lots from other accounts would produce incorrect results.

You have three options:

  1. Use Create Transfer in the Dashboard — PrivateACB can detect when an account has sells but no cost basis source (no buys, no deposits). When this happens, a “Create Transfer” button appears in the Transaction Types column. This lets you create the missing transfer records directly from the Dashboard without editing CSV files. See Using Create Transfer below for step-by-step instructions.

  2. Add the missing transfer records to your CSV — Include both the Send (from the source exchange) and Receive (on the destination exchange) transactions, then re-import and recalculate. Most exchanges provide these records in their transaction export.

  3. Turn off Account-by-Account Tracking — If you don’t have transfer records available and don’t remember which account the assets came from, uncheck the Account-by-Account toggle in the Configuration Bar. This uses the traditional universal pool where all lots are combined regardless of account.

When PrivateACB’s preflight check detects that an account has sell transactions but no cost basis source, the asset row shows a red X icon. Clicking it reveals a diagnostic popover with the issue details, and if lots exist on another account, a “Create Transfer” button appears.

Step 1: Click the red X icon on the affected asset row.

Step 2: In the diagnostic popover, review the issue and resolution guidance. If lots exist on another account, click “Create Transfer”.

Create Transfer Dialog

Step 3: Fill out the Create Transfer dialog:

FieldDescription
Source AccountThe account where the lots currently reside (dropdown shows accounts with buys/income)
Destination AccountThe account with sells but no lots (pre-filled, read-only)
QuantityHow much to transfer (pre-filled with the destination’s total sell quantity — adjust if needed)
Network FeeOptional — the blockchain fee deducted during transfer. Receive amount adjusts automatically.
Transfer DateWhen the transfer occurred. Defaults to January 1 of the tax year. Must be before the earliest sell on the destination account.
MemoOptional note for your records

Step 4: Click “Create Transfer”. PrivateACB creates a matching Send and Receive record pair in your database. The asset shows “Needs Calculation” (stale) in the Dashboard.

Step 5: Recalculate. PrivateACB’s transfer matching engine pairs the Send and Receive records, moves the lots from the source to the destination using FIFO order, and the subsequent sell now has lots available.

Important: Create Transfer records real transaction records in your database. Only create transfers that actually happened. If you make a mistake, you can delete the transfer from the Data tab → Delete Import — look for the entry named “Create Transfer: [asset] [source] → [destination]”.

Tip: If the lots are spread across multiple source accounts and no single account has enough, create separate transfers from each source. For example, transfer 0.5 ETH from Coinbase and 0.3 ETH from Ledger to cover a 0.8 ETH sell on Kraken.

  1. Record both sides of transfers — When you transfer crypto between exchanges, make sure both the Send/Withdrawal (from Exchange A) and Receive/Deposit (to Exchange B) are in your imported data
  2. Use Create Transfer for missing records — If your exchange CSV doesn’t include transfer records, use the Create Transfer feature in the Dashboard instead of manually editing CSV files
  3. Verify account names are consistent — “Coinbase” and “coinbase” are treated as the same account, but “Coinbase Pro” would be separate
  4. Check for network fee differences — A Send of 1.0 BTC may result in a Receive of 0.9995 BTC (minus network fee). PrivateACB accounts for this with a 2% quantity tolerance when matching transfers
  5. Review the activity log — After calculation, check for transfer-related error messages to identify missing records
  6. Set the transfer date correctly — The transfer date must be before any sells on the destination account. If the source account’s first purchase is after January 1 of the tax year, set the transfer date after that purchase date.

Lot Tracking Report — Account and Origin Columns

Section titled “Lot Tracking Report — Account and Origin Columns”

When Account-by-Account Tracking is enabled, the Lot Tracking report includes two account-related columns:

ColumnMeaning
AccountThe account/exchange where the lot currently resides (updated by transfers)
OriginThe account/exchange where the lot was originally purchased (never changes)

For example, if you bought BTC on Coinbase, transferred it to Kraken, then sold on Kraken:

  • A lot’s Account would show “Kraken” (current location after the transfer)
  • The same lot’s Origin would show “Coinbase” (where it was originally purchased)

When Account-by-Account Tracking is turned off, these columns are hidden since account assignment is not relevant.

Lot Tracking Report — Account and Origin Columns

Use this report to verify:

  • Lots are assigned to the correct account after transfers
  • Origin information matches your purchase history
  • Remaining quantities per account make sense

All US reports (Form 8949, Schedule D, Lot Tracking, and Wash Sale) display a Tracking indicator in the report header:

  • “Tracking: Account-by-Account” — Calculation used account-by-account lot pools (T.D. 10000 compliant)
  • “Tracking: Universal” — Calculation used the traditional combined lot pool

This makes it easy to confirm which mode was active when the report was generated.


Here’s how 1099-DA box categorization and account-by-account cost basis work together in a typical tax filing workflow:

Before calculating, set up your exchange information:

  1. Settings tab → Exchange Form Status (1099-DA)

    • Check Received 1099-DA for exchanges that issued the form (e.g., Coinbase, Kraken)
    • Check Basis Reported to IRS if the form included your cost basis
    • Leave hardware wallets and DEXs unconfigured
  2. ACB Calculator → Account-by-Account toggle

    • Enable for 2025+ tax years

Select your assets and click “Calculate All” or “Calculate Selected”. PrivateACB will:

  • Use account-by-account FIFO for lot selection (per T.D. 10000)
  • Assign box categories based on which exchange handled each sale (per 1099-DA rules)
  • Determine Schedule D line numbers based on holding period and exchange status

Form 8949 — Check that:

  • Transactions on 1099-DA exchanges appear in boxes G/H/J/K
  • Transactions on non-1099-DA platforms appear in boxes I/L
  • Holding periods (short-term vs long-term) are correct

Schedule D — Verify:

  • Line 1b/2/3 totals match Form 8949 short-term boxes
  • Line 8b/9/10 totals match Form 8949 long-term boxes
  • Lines 7, 15, and 16 show correct combined totals

Lot Tracking — Confirm:

  • Account (current account) and Origin (purchase account) assignments are correct
  • Lots moved by transfers show the expected Account vs Origin
  • Remaining lot quantities are reasonable

All reports — Verify the “Tracking: Account-by-Account” indicator appears in each report header, confirming account-by-account mode was active.

  1. Export Form 8949 and Schedule D as PDF
  2. Attach to your tax return (or provide to your CPA)
  3. Keep Lot Tracking and Wash Sale reports for your records

Q: I don’t know if my exchange issues a 1099-DA. What should I do? A: Check your exchange’s tax documentation or settings page. Major US-based exchanges (Coinbase, Kraken, Gemini) are expected to issue 1099-DA forms starting in 2025. If unsure, leave both checkboxes unchecked — transactions will go to Box I/L (“not reported on 1099-DA”), which is always acceptable. You can always update the settings and re-calculate after confirming.

Q: What happens if I configure an exchange incorrectly? A: The calculation results (gains, losses, cost basis) are not affected — only the box categorization on Form 8949 and Schedule D line placement changes. You can update the exchange status and re-run the calculation at any time.

Q: Do I need to configure 1099-DA for 2024 tax year calculations? A: No. For 2024 and earlier, PrivateACB automatically uses the legacy box categories (C for short-term, F for long-term). The 1099-DA settings are ignored for pre-2025 calculations.

Q: What about decentralized exchanges (Uniswap, SushiSwap)? A: DEXs do not issue 1099-DA forms. Leave them unconfigured (both checkboxes unchecked). Transactions through DEXs will appear in Box I (short-term) or Box L (long-term).

Q: My exchange issued a 1099-DA but didn’t include cost basis. Which setting do I use? A: Check only the “Received 1099-DA” box and leave “Basis Reported to IRS” unchecked. This puts short-term transactions in Box H and long-term in Box K.


Q: Can I run a 2025 calculation without account-by-account enabled? A: Yes. Account-by-account is a toggle you can turn on or off. Without it, calculations use the traditional universal lot pool. However, for IRS compliance, account-by-account is recommended for 2025+ to match how exchanges report your cost basis on 1099-DA.

Q: I transferred crypto between exchanges and the calculation failed with “No lots found.” What do I do? A: This means the destination account has no lots — likely because you transferred crypto from another exchange but the Send/Receive records are missing. You have three options: (1) Use the Create Transfer button in the Transaction Types column to create the missing transfer records directly (easiest), (2) add the missing transfer transactions to your CSV and re-import, or (3) turn off Account-by-Account Tracking to use the universal lot pool instead.

Q: What does Create Transfer do? A: Create Transfer adds a matching pair of Send and Receive records to your database, representing a transfer that actually happened between two accounts. This allows PrivateACB’s transfer matching engine to move tax lots from the source account to the destination account during calculation. It’s equivalent to importing transfer records from a CSV, but done through a dialog in the Dashboard.

Q: Can I undo a Create Transfer? A: Yes. Go to the Data tab → Delete Import panel. Find the entry named “Create Transfer: [asset] [source] → [destination]” and delete it. This removes both the Send and Receive records. You’ll need to recalculate after deletion.

Q: The Create Transfer button doesn’t appear for my asset. Why? A: The Create Transfer button only appears in the preflight diagnostic popover when lots exist on another account. If no other account has lots for this asset, Create Transfer cannot help — you need to find and import the original purchase records instead. The preflight diagnostic will tell you which accounts (if any) currently hold lots.

Q: How does PrivateACB know which Send and Receive transactions are the same transfer? A: PrivateACB automatically matches transfers by looking for the same asset, similar quantity (within 2% to account for network fees), and timestamps within 48 hours. You don’t need to manually link them — just make sure both sides of each transfer are in your imported data.

Q: Does account-by-account affect my wash sale calculations? A: No. Wash sale detection looks at all transactions regardless of account. If you sell BTC at a loss on Coinbase and repurchase on Kraken within 30 days, the wash sale rule still applies.

Q: What if I have lots from before 2025 — how are they handled? A: Under the IRS transition safe harbor (Rev. Proc. 2024-28), existing lots are assigned to the account where they currently reside based on your transaction history. When account-by-account kicks in on January 1, 2025, each account’s pool includes any pre-existing lots attributed to it.

Q: The account-by-account results are different from my previous universal FIFO calculation. Is something wrong? A: No, this is expected. Account-by-account FIFO selects lots from a smaller pool (single account), which often means different lots are consumed compared to universal FIFO. This can change holding periods (short-term vs long-term) and cost basis amounts. Both calculations are correct for their respective rules.

Q: I only use one exchange. Do I need account-by-account tracking? A: If all your transactions occur on a single exchange, account-by-account and universal FIFO will produce identical results (since there’s only one account pool). You can enable it for compliance, but it won’t change your numbers.


Q: Do the box categories change when account-by-account is enabled? A: The box categorization itself doesn’t change — it’s based on the exchange’s 1099-DA status. However, account-by-account may change which lots are used for a sale, which can change the holding period (short-term vs long-term), and therefore change which box a transaction falls into.

Q: My Schedule D shows amounts on Line 1b but not Line 8b. Is that normal? A: Yes. If all your sales on 1099-DA exchanges with reported basis were short-term (held 1 year or less), there would be no long-term transactions for Line 8b. This is especially common in the first year of account-by-account tracking, when lots may be redistributed across accounts.


Cause: No exchanges are configured with 1099-DA status. Fix: Go to Settings → Exchange Form Status (1099-DA) and check the appropriate boxes for your exchanges.

Cause: The tax year is set to 2024 or earlier. Account-by-account tracking is only available for 2025+. Fix: Change the tax year to 2025 or later in the Configuration Bar. If the toggle is not visible at all, ensure the jurisdiction is set to United States.

Data quality warning appears when calculating with account-by-account

Section titled “Data quality warning appears when calculating with account-by-account”

Cause: Less than 95% of your transactions have account/exchange data for the selected tax year. Fix: Review your imported data in the Data Viewer tab and add missing exchange/account information.

Calculation failed with “No lots found in [exchange]”

Section titled “Calculation failed with “No lots found in [exchange]””

Cause: You sold crypto on an exchange where PrivateACB has no lots — likely because you transferred the crypto from another exchange but your imported data is missing the Send/Receive transfer records. Fix: The easiest solution is to use Create Transfer — click the red X icon on the affected asset to open the preflight diagnostic. It shows which accounts currently hold your lots and offers a “Create Transfer” button to move them. Alternatively, add the missing Send and Receive transactions to your CSV and re-import. If you don’t have transfer records available, turn off Account-by-Account Tracking to use the universal lot pool.

Transfer created but calculation still fails

Section titled “Transfer created but calculation still fails”

Cause: The transfer may have been created with an incorrect source account or transfer date. Fix: Check that (1) the source account actually has purchases of that asset, (2) the transfer date is after the earliest purchase on the source account and before the earliest sell on the destination account. If the transfer is wrong, delete it from Data tab → Delete Import and create a new one with the correct settings. PrivateACB validates that the source account has acquisitions before the transfer date — if not, it will show an error explaining the issue.

Schedule D lines don’t match Form 8949 boxes

Section titled “Schedule D lines don’t match Form 8949 boxes”

Cause: This would indicate a bug. Each Form 8949 box maps to exactly one Schedule D line. Fix: Please contact support with your report exports for investigation.

Different results between 2024 and 2025 calculations for the same transactions

Section titled “Different results between 2024 and 2025 calculations for the same transactions”

Cause: Expected behavior. 2024 uses universal FIFO with Box C/F categorization. 2025 uses account-by-account FIFO (if enabled) with Box G-L categorization. Different lot selection methods produce different cost basis and holding period results.


  1. Verify your exchange list — Make sure all exchanges you used during the year appear in your imported data
  2. Configure 1099-DA status — Check each exchange’s tax page to confirm their reporting status
  3. Clean up account data — Ensure transactions have exchange/account fields populated
  4. Record transfers — Add any missing cross-exchange transfers to your data. You can either include them in your CSV imports or use the Create Transfer feature in the Dashboard
  1. Enable account-by-account for 2025+ — Required for IRS compliance
  2. Review the preflight check — Look for red X icons on asset rows that indicate problems detected by the preflight engine. Click to see diagnostics and use Create Transfer to resolve missing transfer records before calculating.
  3. Review the activity log — Check for transfer-related error messages after calculation
  4. Compare with 1099-DA forms — When you receive 1099-DA from exchanges, verify that PrivateACB’s totals match
  1. Keep all reports — Save PDF exports of Form 8949, Schedule D, Lot Tracking, and Wash Sale reports
  2. Save your database — Your PrivateACB database is a complete audit trail
  3. Archive exchange 1099-DA forms — Keep the originals you receive from exchanges for reference

TermDefinition
1099-DAIRS form for reporting digital asset transactions from brokers (effective 2025)
Box G/H/IForm 8949 short-term categories: G = 1099-DA with basis, H = 1099-DA without basis, I = no 1099-DA
Box J/K/LForm 8949 long-term categories: J = 1099-DA with basis, K = 1099-DA without basis, L = no 1099-DA
Box C/FLegacy Form 8949 categories (2024 and earlier): C = short-term, F = long-term
Cost BasisThe original purchase price of an asset, used to calculate gain or loss
Create TransferA Dashboard feature that creates synthetic Send/Receive records to move lots between accounts when original transfer records are missing
FIFOFirst In, First Out — oldest lots are sold first
Holding PeriodHow long you held an asset. Over 1 year = long-term (lower tax rate)
OriginThe account/exchange where a tax lot was originally purchased (never changes, even after transfers)
Preflight CheckAn automatic validation pass that runs the calculation engine without persisting results, detecting issues like missing lots or transfer gaps before you commit to a full calculation
Account-by-AccountCost basis tracked separately for each exchange/account
Schedule DIRS form summarizing total capital gains and losses
Transfer MatchingPrivateACB’s automatic pairing of Send/Receive transactions to move lots between accounts
T.D. 10000IRS Treasury Decision 10000 (Treas. Reg. §1.1012-1(j)) — requires account-by-account cost basis tracking for digital assets starting 2025
Tax LotA record of a specific purchase — quantity, price, date, and account
Universal PoolAll tax lots combined regardless of account (pre-2025 behavior)
Wash SaleA loss that is denied because you repurchased the same asset within 30 days

Last updated: February 2026 Applies to PrivateACB v2.3.0