Interactive Brokers exports explained: Activity Statement vs Flex Query
Interactive Brokers gives you more export options than any other broker, which is exactly the problem. Two of them matter for portfolio tracking, and this guide covers when to use which, what the files contain, and what to verify before you trust the output.
Two systems, one job
IBKR grew out of the professional brokerage world, and its reporting shows it. Where a consumer broker gives you one export button, IBKR gives you a reporting suite: statements in several flavors, customizable queries, multiple file formats, and settings most retail investors will never touch. The abundance is real, but so is the confusion, and plenty of people give up somewhere in the menus and go back to squinting at the app.
The good news is that for the job at hand — rebuilding your full history so you can compute cost basis, time-weighted return, and dividend income — only two routes matter: the Activity Statement and the Flex Query. Both produce a complete record of trades, dividends, taxes withheld, and cash movements. The difference is convenience and repeatability, not substance. Everything else in the reporting menu is either a subset of these two or aimed at tax accountants.
Activity Statement: the quick route
Performance & Reports → Statements → Activity. Pick a date range, format CSV, run. You get one file with sections stacked on top of each other: Trades, Dividends, Withholding Tax, Deposits & Withdrawals, and a dozen more.
This is the file most portfolio trackers (including BullBenchmark) read directly. The section format looks odd in Excel, but it's complete: trades with commissions, dividends with tax, all cash movements.
One catch: the default range tops out at 365 days. For your full history, run one statement per calendar year and upload them all, or use a Flex Query.
A word on that odd-looking format. The file is really several tables sharing one CSV, each section with its own header row. Opened in a spreadsheet it looks like a filing cabinet fell over, and the temptation is to "clean it up" before doing anything with it. Resist. The section structure is precisely what lets a parser tell a trade from a dividend from a fee, and hand-editing it is the fastest way to break an otherwise perfect file. Download, upload, done.
Flex Query: set up once, reuse forever
Performance & Reports → Flex Queries → create a new Activity Flex Query. Tick the sections you need (Trades, Cash Transactions, Dividends), set the date field format, save. From then on it's two clicks for any period, and the column layout never changes, which means your tracker never breaks on it.
If you plan to upload monthly, spend the five minutes on a Flex Query. Future you says thanks.
The stable column layout is the underrated part. Statement layouts can shift as brokers redesign things; a Flex Query returns exactly the fields you configured, in the order you configured them, every single time. For anyone doing regular bookkeeping — a monthly upload, a quarterly review — that predictability removes a whole category of silent failure. It is the difference between a report someone generates for you and a report you specified yourself.
Which route should you take?
If this is a one-off — you want to see your full history benchmarked once, or you're evaluating a tracker — run Activity Statements per calendar year and be done in ten minutes. If you intend to keep your numbers current, build the Flex Query now. The setup cost is minutes; the payoff is every future export taking two clicks and never surprising you. Either way you end up with the same underlying data: every trade with its commission, every dividend with its withholding, every deposit and withdrawal with its date. Those cash-flow dates are not trivia — they are what a time-weighted return calculation is built from, as explained in time-weighted vs money-weighted return.
The multi-currency thing
IBKR reports each trade in its native currency, and your dividends arrive in whatever the company pays. A US dividend is USD, a European ETF might pay EUR. Your tracker has to convert everything to your base currency at the correct historical rate, not today's rate, or your cost basis quietly drifts. Check that whatever tool you use does this properly. (We do.)
The drift is worth spelling out, because it's invisible until it isn't. Suppose you bought a US stock two years ago and the dollar has weakened since. Convert that old trade at today's rate and your cost basis in euros looks lower than what you actually paid, so your gain looks bigger than it was. The error moves with the exchange rate, so your "return" changes on days you didn't trade. Historical-rate conversion pins every event to its own date and makes the number stop wobbling. There's more on this whole class of problem in multi-currency portfolio tracking.
What about IBKR-based brokers?
Lynx, Mexem and several other European brokers are white-label IBKR. Their exports are the same format with a different logo. If your broker's platform looks suspiciously like Trader Workstation, the IBKR guide above almost certainly applies to you.
This is quietly good news if you hold accounts at more than one of them, or migrated from one to another: the files line up, and a tracker that reads one reads them all. Combining an IBKR-format account with a completely different broker — say, a DeGiro account for your ETFs — is also routine, as long as the tool normalizes currencies and merges histories properly.
What to check after exporting
Whichever route you took, give the file a two-minute audit before relying on anything computed from it.
- Confirm the date coverage: if you ran yearly Activity Statements, check there's no gap between one year's end and the next year's start, and that the earliest file reaches back to your first trade.
- Check that the Trades section's positions, netted out, match what your account shows today.
- Look for the Dividends and Withholding Tax sections and confirm they're populated for periods when you know you were paid.
- Verify Deposits & Withdrawals covers every funding event; a missing deposit makes your return look better than it was, which is flattering and wrong.
Gaps almost always trace back to date ranges or, in a Flex Query, an unticked section. Both are one re-export away from fixed.
Frequently asked questions
Activity Statement or Flex Query — which does a tracker prefer? Most trackers, including BullBenchmark, read the Activity Statement CSV directly. The Flex Query earns its keep through repeatability: same fields, same order, every time you run it.
Why is my history split across multiple files? Because the Activity Statement's default range tops out at 365 days. One statement per calendar year, uploaded together, reconstructs the whole history. A tracker that can't merge multiple files gracefully isn't trying.
Do I need to give a tracker my IBKR login? No, and you shouldn't need to. The export route hands over data without handing over access — the reasoning is laid out in portfolio tracking without broker login.
My dividends arrive in three currencies. Is that a problem? Only for tools that assume one currency. The file records each payment in its native currency; correct handling means converting each at its own payment-date rate, not lumping everything together at today's rate.
I'm at Lynx or Mexem — does any of this apply? All of it. Same engine, same file format, different logo.
The first week of BullBenchmark is free, no card, upload the export you just downloaded and see where you stand.
Related: Multi-currency portfolio tracking · Am I beating the S&P 500?