Bring complete lot history
For FIFO, include every purchase needed to support the shares sold. For loss sales, include the full 30-day window before and after the sale when wash-sale testing is required.
Import stock trades, match sales to purchase lots using FIFO, separate short- and long-term gains, map ordinary stock transactions to Form 8949 boxes A–F, and keep a lot-level audit trail.
Designed conservatively: the tool does not pretend to solve every wash sale, transfer, option, employee-stock, crypto, or corporate-action edge case. Unsupported facts are surfaced for review.
For FIFO, include every purchase needed to support the shares sold. For loss sales, include the full 30-day window before and after the sale when wash-sale testing is required.
reporting_status describes the disposition's 1099-B treatment. BUY rows do not need it; repeated BUY-row values are ignored.
If you provide fx_rate_to_usd, also provide a 3-letter currency such as EUR, CAD, or JPY. The tool will stop instead of silently assuming USD.
The automatic engine covers supported uploaded accounts and explicit wash groups. Spouse purchases, controlled-corporation purchases, and legal judgments about different but substantially identical securities require manual review.
Upload a brokerage export and map its columns online. Unknown foreign-broker formats do not need to match a fixed template. For non-USD trades, provide or map the USD conversion rate used for each transaction. Do not upload names, SSNs, addresses or full account numbers.
For a filing-ready result, confirm both the asset scope and lot method. For loss sales, coverage must also extend at least 30 days before and after every sale, and the taxpayer-level wash-sale scope must be complete.
CSV, TSV, TXT and XLSX are accepted. First map the source columns to tax-lot fields; then map the broker's transaction type or description values to BUY / SELL / IGNORE / REVIEW. Suggestions are preselected where possible, but calculation does not depend on a broker-specific template.
Required: trade date, security identifier, quantity, a transaction type/description source, and either unit price, gross amount or net amount. Everything else is optional or used for professional reconciliation.
Map every relevant broker value to BUY, SELL, IGNORE, or REVIEW. For free-text descriptions with many unique rows, use the pattern rules below. Unmapped rows are never silently treated as trades.
| Broker value | Rows | Map to |
|---|
| Row | Date | Account | Security | Description | Action | Qty | Price | Fees | Currency |
|---|
If the first imported year starts after you originally bought the shares, enter the open tax lots that existed immediately before the imported history. Broker-to-broker transfers are movements of those same lots—not new purchases or sales—so their acquisition dates, adjusted basis and wash-sale history must carry through.
One row per open tax lot. Preserve original acquisition date and any prior wash-sale holding-period adjustment.
Use the normalized transaction history already loaded below. For a January 1 baseline, include enough prior history to identify every open lot and, for December loss sales, acquisitions through the following 30 days. Reconcile the reconstructed quantities to the broker's prior December 31 holdings before accepting the result.
Required: lot_id, account, symbol, acquired, quantity, adjusted_basis_usd, basis_provenance. For a foreign-currency basis statement, map the original basis currency and the lot-specific FX rate to USD; the tool will not substitute a year-end rate.
One or more rows can allocate a transfer across exact source lots/segments. Basis and holding period move; no sale is created.
For a partial transfer, map transfer_id, date, from_account, to_account, symbol, quantity and source_lot_id. For a confirmed full-account ACATS move, set transfer_all=true and the engine will move every open lot exactly as it exists at that point. Use source_segment_id for partial transfers of wash-adjusted split lots.
You can also paste normalized CSV directly. Minimum columns: trade_id, date, account, symbol, action, quantity, price. For foreign-currency rows, provide both currency and fx_rate_to_usd before calculating. An FX rate without a currency code is rejected rather than silently treated as USD.
Server calculation is stateless. Transaction payloads are not intended for storage.
For A/D rows, column (e) follows broker-reported basis; confirmed corrections use code B / column (g). For B/E rows, the correct taxpayer basis goes directly in column (e), with code B when a displayed broker basis was incorrect. Selling expenses omitted from broker proceeds use code E.
| Box | Description | Acquired | Sold | Proceeds (d) | Basis (e) | Code (f) | Adjustment (g) | Gain/Loss (h) |
|---|
Form 8949 categories are summarized to Schedule D lines 1b, 2, 3, 8b, 9 and 10. Zero categories remain visible for reconciliation.
| 8949 box | Schedule D line | Rows | Proceeds | Basis | Adjustments | Gain/Loss |
|---|
This planner is conservative. It recommends direct Schedule D line 1a/8a treatment only when every current IRS Exception 1 condition is explicitly known. Exception 2 remains an attached-statement workflow; it does not permit “available upon request” in place of transaction detail.
Generate an Exception 2 attached statement with Form 8949 columns (a)-(h). A filing-ready result can also be merged onto the official IRS Form 8949 summary pages when the current IRS template is installed on the server. Name/TIN are used only for the generated PDF request and are not intended for storage.
For U.S. broker sales, compare A/B/D/E Form 8949 column (d) totals by account to the broker's Form 1099-B gross proceeds. This does not replace basis or wash-sale review.
Upload or paste almost any broker 1099-B detail table, map its columns manually, then compare the statement's A/B/D/E proceeds by account with this engine. The mapper never assumes that a displayed basis was reported to the IRS unless you map an explicit covered/basis-reported field.
The planner chooses between IRS Exception 1, Exception 2 attached statements, or row-level import based on the target software and the current result. It does not force TXF when the format cannot preserve required Form 8949 adjustment codes.
Every generated row remains traceable to the purchase lot(s) and sale row used by the engine.
| Sale ID | Buy ID | Account | Symbol | Qty | Actual acquired | Holding-period start | Sold | Term | Net proceeds | Correct basis | Gain/Loss |
|---|
Automatic mode applies same-symbol or explicit wash_group matching share-for-share in acquisition order. Different securities are never declared substantially identical unless you group them.
| Loss sale | Replacement buy | Qty | Disallowed loss | Basis added | Replacement account | Result |
|---|
Transfers preserve the source lot's acquisition date, adjusted basis, holding period and wash-sale state. They are not treated as purchases or dispositions.
| Transfer | Date | Symbol | From | To | Source lot | Source segment | Destination segment | Qty | Basis moved | Acquired | Holding-period start |
|---|
Snapshot as of December 31 of the selected tax year, before next-year transactions that may be included only to complete a wash-sale window.
| Lot ID | Segment | Account | Symbol | Acquired | Holding-period start | Qty remaining | Adjusted basis | Basis source | Wash replacement? |
|---|
This can include January transactions imported solely to close a December wash-sale window. Do not confuse it with the December 31 tax-year-end snapshot.
| Lot ID | Segment | Account | Symbol | Acquired | Holding-period start | Qty remaining | Adjusted basis | Basis source | Wash replacement? |
|---|
U.S. taxpayers may still need to report stock sales from foreign brokers. This workflow is built for trade history that does not arrive in a U.S. 1099-B format.
Use a normalized CSV from a foreign or U.S. broker. The universal mapper accepts CSV/TSV/TXT/XLSX exports and lets you map unknown broker columns and transaction descriptions before the tax engine runs.
For non-USD transactions, provide both the 3-letter transaction currency and the USD conversion rate used for that transaction. A populated FX rate with no currency code is rejected so it cannot be silently treated as USD.
Sales consume the oldest available shares in the same account and symbol when FIFO applies.
Transactions without Form 1099-B are mapped to box C for short-term or F for long-term ordinary stock transactions.
Professional output is designed around source-row traceability, broker-basis reconciliation, holding-period classification and explicit review stops.
For basis-reported transactions, the engine preserves broker basis in Form 8949 column (e) and uses code B / column (g) when a correction is needed.
A single sale spanning both short- and long-term FIFO lots is split for noncovered/no-1099 output. Basis-reported aggregate rows are stopped for review if a single broker basis cannot be safely allocated across terms.
FIFO inventory stays account-specific, while the wash-sale engine can match replacement shares across uploaded taxable, IRA and Roth IRA accounts.
Explicit taxable-to-taxable broker transfers are supported when source lots are identified. Short sales, options, average-basis mutual funds, corporate actions, crypto, automatic employee-stock basis rules, and spouse / controlled-corporation wash-sale relationships remain review items rather than being silently guessed.
Keep each purchase lot separately. When a sale occurs and no adequate specific-share identification applies, match the sale against the oldest available shares first. Purchase fees increase basis; selling fees reduce net proceeds when they are not already reflected elsewhere.
Form 8949 still reports many capital-asset dispositions without a 1099-B. For ordinary stocks, short-term transactions generally fall in box C and long-term transactions in box F when no broker statement applies.
Covered-security basis shown to the IRS must generally remain in Form 8949 column (e). If it is incorrect, Form 8949 uses adjustment codes and column (g) rather than simply replacing the reported amount.
Potentially. A broker's 1099-B may not capture every taxpayer-level replacement purchase. The tool screens same-symbol buys across the uploaded accounts but does not make the final substantially-identical determination.
You can use ordinary lots if you already know the correct tax basis, but this tool does not automatically derive compensation basis from W-2, Form 3922, vesting data or plan documents.
No. Digital assets have separate 2025 Form 8949 boxes and modern account/wallet identification rules. This version intentionally focuses on ordinary stocks and ETFs.
Yes. For 2025 ordinary stock transactions, the PDF export can produce an Exception 2 attached statement with columns (a) through (h), 48 transactions per detail page, broker/account summary rows using code M, and Schedule D destination guidance. Official-form merging is enabled only after the current IRS template is installed and visually verified on the deployment.
Rules reviewed October 6, 2026. Current filing source set uses 2025 Form 8949 / Schedule D guidance.
US Tax Pilot handles specialist international and investment-reporting projects where the source data needs reconstruction before the return can be filed.
We understand the sensitive nature of U.S. tax and securities transaction data. This tool adheres strictly to data minimization and stateless computation principles:
Explore additional zero-storage utilities or connect with licensed tax professionals for international filing support.