How to Import Schwab CSV Transactions With AI in MyATMM

The Problem With Years of Schwab Activity

If you've been trading options at Schwab for any length of time, your transaction history is enormous. A few covered calls a week, the occasional roll, a handful of cash-secured puts, dividends rolling in, deposits and withdrawals — over four years that easily turns into thousands of individual rows. Typing all that into a tracker by hand isn't a project; it's a punishment.

That's where MyATMM's AI Import for CSV files comes in. Schwab gives you a CSV export of your transaction history. MyATMM accepts that file directly, parses every row, categorizes options, stocks, dividends, and ledger entries, flags duplicates, and surfaces anything ambiguous so you can decide what to do with it. In the walk-through above, a 4,907-row Schwab CSV is fully ingested in seconds.

This article walks through the whole flow — the export from Schwab, the drag-and-drop import inside MyATMM, the per-ticker drill-down view, the review queue, duplicate handling, and the reconciliation pass that brings your portfolio into agreement with your brokerage balance.

What's Actually in a Schwab CSV

Before exporting, it's worth understanding what you're going to get. Schwab's CSV transaction history isn't options-only; it's a complete chronological dump of activity in your account. A typical four-year export will include:

  • Option trades — buy-to-open, sell-to-open, buy-to-close, sell-to-close, plus assignments and expirations
  • Stock trades — outright share buys and sells, plus transfers from TD Ameritrade for accounts that were migrated over
  • Dividends — every cash dividend payment
  • Ledger entries — deposits, withdrawals, interest, fees, and other cash movements
  • Corporate actions — splits, stock dividends, and similar account-level events

One important constraint up front: Schwab only lets you select a custom date range up to four years in the past. If you've been with Schwab (or with TD Ameritrade before the migration) for longer than that, the CSV will not include anything older. That doesn't make the import less valuable — it just means you should go in expecting to do a reconciliation pass afterward, which we'll cover in detail.

Step 1: Export the CSV From Schwab

Log in to your Schwab account on the website (the mobile app's transaction history view doesn't offer a CSV export). Navigate to the transaction history screen for the account you want to track.

  1. Choose a custom date range — set the start date as far back as Schwab will allow (four years) and the end date to today
  2. Set the file format to CSV
  3. Download the file to your computer — somewhere you can find it again, like your Downloads folder

That's the entire export side of the workflow. Schwab will package up every transaction in your selected range into a single CSV. The file is plain text, so it isn't huge — even a busy four-year history typically lands under a megabyte.

Step 2: Set Up a Portfolio in MyATMM

Inside MyATMM, the cleanest approach for a bulk import is to start with a dedicated portfolio. If you're a returning user and you've been hand-entering trades, you may want a fresh portfolio so the bulk import doesn't collide with your existing data. If you're brand new to the platform, just create your first portfolio and name it something memorable like "Schwab" or "Schwab Main."

Once the portfolio is created and selected, head to the Tools menu and open Import / Export. The AI Import tab is the default. There's a broker auto-detect dropdown at the top of the screen — for CSV imports it isn't strictly necessary because the parser can figure out the format from the file structure itself, but it doesn't hurt to leave it on auto-detect or explicitly pick Schwab.

Tip: If you have multiple Schwab accounts (for example, a taxable account and a Roth), use one MyATMM portfolio per Schwab account. This keeps the cost basis on each ticker isolated to the account where it actually lives.

Step 3: Drag and Drop the CSV

With the AI Import screen open, take the CSV file you downloaded from Schwab and drag it directly onto the upload zone. There's no need to click through a file picker — the drop target handles it.

As soon as the file lands, MyATMM runs a quick pre-parse. This is a lightweight check that confirms the file is a valid CSV and counts the rows. You'll see a row count appear immediately — in the video, the four-year Schwab dump shows 4,907 rows detected. That number is your sanity check: it tells you the file uploaded correctly and the parser can read it.

Nothing has been written into your portfolio yet at this stage. The pre-parse is read-only, so if the row count looks wrong (way too small, or zero) you can drop a different file before doing anything destructive.

Step 4: Click Parse CSV

When the row count looks right, click the Parse CSV button. This is where the actual import happens. MyATMM walks every row, classifies the transaction type, maps the broker-specific columns onto the MyATMM data model, builds out the ticker list, and writes the transactions into the selected portfolio.

For a 4,907-row file, the parse completes in seconds. There is no waiting screen, no spinner that takes a coffee break — it's effectively immediate. The result page comes back with a structured summary of what was imported.

Why this is so fast: The parser uses a curated mapping for Schwab's CSV column layout. It doesn't have to guess where the strike price or expiration date lives in each row, because the mapping already knows. CSVs from supported brokers avoid the slower vision-based path that screenshot imports take.

Step 5: Read the Import Summary

The summary that appears after the parse is your first real look at what just happened. It includes counts and aggregated dollar amounts for each transaction type:

  • Options — how many option transactions were imported, and the aggregate premium amount
  • Stocks — share trade count and aggregate dollar value
  • Dividends — number of dividend payments and their total cash amount
  • Ledger entries — deposit, withdrawal, fee, and interest counts
  • New symbols — how many new ticker symbols were created in your portfolio as a side effect of the import

You'll also see a count of skipped rows. The parser deliberately ignores rows that don't carry useful financial information — a row with a zero dollar amount, for instance, or a row whose type couldn't be confidently classified. These aren't errors; they're rows the parser decided to leave alone rather than guess wrong on. The skipped count appears in the summary so you know exactly how many rows it walked past.

Step 6: Drill Into Import Details by Ticker

The summary page exposes a View Import Details button. Clicking through opens a grouped grid: every ticker in the import is its own row, with a transaction count next to it. In the demo, the Schwab CSV produces over four thousand ticker-level groupings.

Expanding a ticker shows the individual transactions inside that group, ten per page by default (configurable to more if you want a longer view). This is where you can spot-check that a particular ticker has the transaction history you expect — wheel strategy traders, for example, can quickly verify that the buy-to-opens and sell-to-closes on a single underlying line up correctly.

There's also a ticker search field that filters the grouped list in real time. Type TSLA and the grid narrows to only Tesla-related rows; clear the filter and you're back to the full list. For an account with four thousand tickers across four years, that filter is the difference between finding what you need in a few seconds versus scrolling forever.

Step 7: Handle the Review Queue

Some rows in any broker export can't be cleanly classified. Maybe the transaction type column has a value the parser hasn't seen before. Maybe the row is a legacy TD Ameritrade entry that got dragged into the Schwab CSV during the broker migration. Whatever the reason, the parser doesn't silently drop these — it imports them with a "Review" flag attached, so you know they need a human look.

In the import details view there's a Review toggle that filters the grid to show only flagged rows. A single click and you're looking at a tight list of things to sort out, instead of trying to find them inside thousands of clean imports.

Example: An NVAX Transfer From TD Ameritrade

In the walk-through, the only review-flagged row in a four-year Schwab CSV is a 100-share NVAX line at $8.99 that came across as part of the TD Ameritrade migration to Schwab. The transaction type column was a TDA-specific value the parser didn't have a Schwab mapping for, so it punted.

The fix is straightforward: open the flagged transaction, set the type to Stock, the side to Buy to Open (because the shares were arriving into the account), keep the amount at $8.99 and the quantity at 100, leave expiration blank since it's a share trade, and save. The review flag clears, the count decrements, and the row drops off the filtered grid.

Most four-year Schwab CSVs land somewhere between zero and a small handful of review flags. If you're seeing dozens, that usually means there's a broker-specific quirk worth flagging to support so we can extend the mapping for everyone.

Step 8: Probable Duplicate Detection

What happens if you accidentally drop the same CSV twice — or drop a partial CSV that overlaps with a previous import? MyATMM watches for this. After an import, it looks back at the transactions already in your portfolio and flags anything that matches an existing row on the key identifying fields. These get marked as probable duplicates.

The summary page calls out the duplicate count up front. In the video, a seven-row test CSV is dropped after the big four-year import — every single row matches an existing transaction, and the summary reports seven probable duplicates. The detail view splits them so you can see exactly which rows are dupes, including in the ledger entries section if any of the duplicates were cash movements.

The platform then gives you two clean cleanup paths:

  • Bulk delete the duplicates — wipes only the rows flagged as probable duplicates from this specific import, leaving the original transactions in place
  • Delete the entire import batch — removes every row that came from this CSV upload, useful when you realize you imported the wrong file altogether

Both options are scoped to a single import batch, so you can clean up a mistake without touching the rest of your portfolio. The full Import History screen — which we'll cover in a separate video — is the place to manage these batches over time.

Step 9: Dashboard Warnings After a Bulk Import

Once the import is clean, head back to the dashboard. Your portfolio is now populated with thousands of transactions — but there's a good chance the dashboard will surface one or two warning banners along the top. The most common one for a Schwab CSV import is some variation of "stock position issues."

Here's what that means in practice. Suppose you've been trading SOFI for five years. Your four-year Schwab CSV only includes the most recent four years of activity. If your oldest SOFI buy happened five years ago, the original buy-to-open row isn't in the CSV — but the subsequent sell-to-close rows from years two, three, and four are. The dashboard sees a sell with no matching buy and politely points that out.

This isn't a bug — it's reality. No bulk import from a broker with a limited history window can magically know about trades that happened before the window starts. The warning exists precisely so you don't quietly miscount your cost basis going forward.

The dashboard offers a Fix All shortcut that resolves the unmatched rows in one click using sensible defaults. For a quick cleanup that's fine. For a more deliberate pass — especially if you care about tracking the wheel strategy's rolling cost basis across long-running positions — the reconciliation page is the better tool.

Step 10: Reconciliation and the Adjustment Entry

The reconciliation page is where you bring your imported MyATMM portfolio into agreement with what your Schwab account actually shows. The mindset matters here: you're not trying to recreate every transaction since the dawn of your trading career. You're trying to establish a credible reset point from which forward-going tracking will be accurate.

That reset point has two halves:

  1. Position reconciliation — for each ticker where you currently hold shares (or short options), confirm that the imported quantity matches your real Schwab position. Fix any unmatched-side issues from Step 9 here.
  2. Cash reconciliation — once the positions line up, your aggregate cash number in MyATMM should land close to your Schwab cash balance. If there's a residual gap (because of pre-window trades, untracked interest, or anything else the CSV couldn't carry), close it with a single adjustment ledger entry.

The adjustment entry lives in the deposits/withdrawals section. You add a row, set the type to Adjustment, enter the dollar delta (positive or negative) needed to make MyATMM's running cash balance match Schwab's, and save. After that, the summary screen in MyATMM should match the brokerage screen at Schwab — that's the reset point. Going forward, every new trade you log will keep both numbers in lockstep.

It's worth saying this out loud: no four-year CSV import will reproduce every dollar you've ever traded. What it can do is give you a substantial, accurate base of recent history plus a clean adjustment to absorb the pre-window gap, so you have a real cost basis foundation to track against from today onward.

Why Seed-Then-Incremental Beats Pure Hand Entry

The whole reason this workflow exists is that the alternative — typing four years of trades into a tracker manually — isn't realistic for anyone who actually trades actively. Spreadsheets tend to break down not because the formulas are wrong but because the data entry burden makes them impossible to keep current. A single missed roll cascades through everything after it.

Bulk import inverts that problem. You pay the one-time cost of pulling the CSV and running the reconciliation pass, and from that point on you're only adding the handful of trades you actually placed this week. The system stays current because the ongoing maintenance load is tiny — a few trades a day max, not four years of catch-up.

The same AI Import surface handles ThinkOrSwim screenshots, Tastytrade screenshots, and Schwab CSVs, so multi-broker traders can seed each portfolio using whichever path their broker supports best.

How MyATMM Picks Up From Here

Once the import and reconciliation are done, you've turned a generic broker export into something purpose-built: a per-ticker view of your cost basis with option premiums folded in, a portfolio summary that tracks realized and unrealized P&L, and a transaction grid where every new trade you log adjusts the cost basis the way option sellers actually need.

For wheel strategy traders specifically, the post-import state is where the platform starts paying for itself. Schwab's native UI doesn't know that a buy-to-open cash-secured put plus an assignment plus a subsequent covered call are three legs of the same income cycle on the same underlying. MyATMM does. The same is true of rolling: Schwab shows two separate trades; MyATMM treats it as a single position whose cost basis is rolling with you. If you've been managing this in a spreadsheet up to now, the bulk import is the moment you stop maintaining formulas and start running a tool that actually understands the strategy.

Risk Disclaimer

Options trading involves risk and is not suitable for all investors. Past performance does not guarantee future results. This content is for educational purposes only and should not be considered financial advice. Always consult with a qualified financial advisor before making investment decisions.

Related Reading

Start Tracking Your Options Positions Accurately

MyATMM provides purpose-built cost basis tracking for option sellers, with the flexibility to track covered calls, cash-secured puts, and wheel strategy positions.

Track up to 3 tickers completely free forever. No credit card required.

Create Your Free Account Today

Built for covered calls, cash-secured puts, and the wheel strategy

Original Content by MyATMM Research Team | Published: May 24, 2026 | Educational Use Only