Stonqs
How the figures work, and what the app does with them

Inside the app

What broker CSV exports actually contain

6 min read

We read 29 export layouts from 26 brokers without being told which column is which. They agree on almost nothing: nine ways of writing a date, two decimal separators, and an identifier for the instrument in only 13 of them. This is the whole table, and what each disagreement costs.

A broker export is not a format. It is 29 of them.

That is the number of layouts Stonqs recognises on sight, covering 26 brokers and trackers, and the table below is generated from the preset file the app ships. Read down any column and the problem of importing a portfolio becomes concrete: 22 layouts separate fields with a comma and 7 with a semicolon, 24 write decimals with a dot and 5 with a comma, and the date appears in nine different shapes.

The table

Layout Separator Decimal Date as written ISIN Wordings mapped
Avanza semicolon comma 2026-10-09 yes 8
Bitvavo comma dot 2026-10-09 no 1
BUX comma dot 2026-10-09 no 10
Charles Schwab comma dot 10/09/2026 no 24
Coinbase comma dot 2026-10-09 no 4
CoinTracking comma dot 2026-10-09 no 1
Crypto.com comma dot 2026-10-09 no 13
DEGIRO comma dot 09-10-2026 yes 0
Delta comma dot 2026-10-09 no 1
Directa comma dot 09-10-2026 yes 9
Disnat comma comma 2026-10-09 no 14
eToro comma dot 09/10/2026 no 8
Finpension semicolon dot 2026-10-09 yes 6
Freetrade comma dot ISO 8601 with a time yes 2
Interactive Brokers · dividends comma dot 20261009 yes 3
Interactive Brokers · trades comma dot 20261009 yes 0
InvestEngine comma dot 09/10/2026 no 0
Investimental comma dot 2026-10-09 no 0
Parqet semicolon comma 09.10.2026 yes 0
Rabobank semicolon comma 09-10-2026 yes 6
Relai comma dot ISO 8601 with a time no 0
Revolut Crypto comma dot Oct 09, 2026, 1:15:00 PM no 4
Revolut Invest comma dot ISO 8601 with a time no 8
Saxo Bank comma dot 09-Oct-2026 yes 1
Swissquote semicolon dot 09-10-2026 yes 5
Trade Republic comma dot 2026-10-09 no 33
Trade Republic · statement semicolon comma 2026-10-09 yes 4
Trading 212 comma dot 2026-10-09 yes 7
XTB semicolon dot 09.10.2026 no 11

“Wordings mapped” is how many of the broker’s own words for an operation we translate into one of our 15 internal kinds. Trade Republic needs 33 of them, Charles Schwab 24. Six layouts need none at all, because their files are already typed: an Interactive Brokers Flex statement in XML says what each value is, so it lays itself out and the only question left is which account it belongs to.

The date is the easy problem

Nine formats sounds worse than it is. A date is detectable: a column of values that all parse under one pattern and none under another settles itself, and the one case that cannot be settled by looking, 10/09 against 09/10, is exactly what the import screen asks you to confirm before anything is written.

Two columns are harder, and they are the ones that decide whether your returns will be right.

Only 13 of 29 name the instrument

An ISIN identifies an instrument. A ticker identifies a listing, and only on one venue. Of the 29 layouts, 13 carry an ISIN column, 17 carry a symbol, and the overlap is where most of the work goes.

A ticker that already belongs to a different ISIN in your portfolio names a different instrument, because one ticker cannot name two. That row is the single case Stonqs refuses to write until you give it a ticker of its own. Everything else it will write with a warning on top.

20 of 29 state a currency, 8 state an exchange rate

If a row does not say which currency it is in, the account’s currency is the only thing left to assume, and an assumption like that is how a dollar trade on a euro account becomes a total nobody can trace. If a row states neither the rate nor the currency, the position is converted once, at today’s rate, by a tracker that never told you it did that.

The 8 layouts carrying their own FX rate are the ones where a figure can be reconstructed exactly as your broker saw it.

The rows that are not transactions

Brokers print lines that are not operations: statement headers, summaries, corporate actions, option and future trades, cancelled trades. Refusing the whole file because of them is not an answer. They are counted as skipped and named, rather than guessed at and imported as something else.

Three wordings arrive on the skip list for an Interactive Brokers statement already: corporate actions, options and futures, and cancellations. The portfolio has no faithful way to record them yet, and saying so is more honest than inventing a shape for them.

What a transfer between two brokers looks like

Like nothing at all. Each export knows only its own half, so one file shows money leaving and another shows money arriving, and both are read as money crossing the portfolio boundary, which is the very thing a time-weighted return is measured against.

After an import, Stonqs lists payments that match in currency and size within a few days and offers to join them into one move. It never joins them by itself. Two payments of 5,000 EUR three days apart are not proof that one is the other, and joining the wrong pair erases a real deposit and a real withdrawal at the same time.

Importing the same file twice

Every row carries a fingerprint, so a file imported twice adds nothing and a file re-exported with more rows adds only what is new. Editing a stored row changes its fingerprint, which would make the next import see it as missing, so the check also compares what an edit cannot change: the day, the account, the instrument and the quantity.

The four warnings worth reading

  • Shares that arrived without a price, from a transfer out of another broker. Imported as they stand, the position enters at a cost of zero and reads as pure profit.
  • A row in a currency the account does not hold.
  • A ticker that already belongs to a different instrument. This is the one that holds its row back.
  • A sale larger than what was ever received, which usually means the matching purchase sits in a wording nobody mapped, or in an older file.

Text that arrives inside an imported file, instrument names, operation wordings, account names, is the broker’s text and can contain anything. It is data. Nothing in it is read as an instruction, which matters more now that a chat assistant may read the same rows.

Any other CSV is mapped once by hand and saved as a layout, so next month’s export from the same broker sets itself up too. PDF statements are not supported, and an export that will not import cleanly is worth an issue with five anonymised rows and the header.

Sources