TraderMemos
Guides

Importing trades

Bring broker fills into TraderMemos — CSV with column mapping, journal exports, or JSON backups. Duplicates are skipped automatically.

Open Import in the sidebar (hotkey G I). The flow is Upload → Map columns → Result — pick an account, drop a file, confirm the mapping, import. Your file is parsed on your server; nothing goes to third parties.

Not sure how to get the file out of your broker? Find my broker on the Import page (or /connect) opens the broker catalogue — pick yours and the Import page shows that broker's export steps for the account you chose.

Supported formats

Format is auto-detected from the file's headers. Exports from a known broker pre-fill the column mapping and timezone; any other broker's fill export works once its columns are mapped:

FormatWhat it isMapping step?
Fill CSVOne row per execution/fill — the shape most broker statement exports haveYes (pre-filled for known brokers)
MetaTrader statementThe MT5 Trade History Report (XLSX/HTML) or MT4 Statement (HTML), uploaded as-is — see Supported brokersNo
Journal exportOne row per finished trade with entry/exit (Stonk Journal-style: Date, Symbol, Side, Qty, Entry, Exit, …, Tags, Setup, Notes). Each row becomes a round-trip trade plus journal annotationsNo
JSON backupA TraderMemos export — restores fills, playbook setups, cash transactions, and account metadataNo

Sample files are downloadable on the Import page.

Column mapping (fill CSV)

Each canonical field maps to one of your CSV's headers, or (skip). Common header names are suggested automatically:

FieldRequiredAuto-detected from headers like
symbol✔Symbol, Ticker, Instrument
side✔Side, B/S, Action (buy/b/bot, sell/s/sld)
quantity✔Qty, Quantity, Shares, Contracts
price✔Fill Price, Price, Avg Price, Exec Price
executed_at✔Trade Date, Date/Time, Datetime
fees / commission—Fee(s) / Commission, Comm
instrument_type—Market, Asset Type, Sec Type
option_right—Call/Put, Option Type, Right

Timestamps accept ISO 8601 (2026-07-01T15:04:05Z), 2026-07-01 15:04:05, 07/01/2026 15:04:05, and plain dates — all stored as UTC instants.

  • Timezone — times without an offset are read in the file's timezone: the broker preset's zone, or for any other fill CSV the market timezone (Eastern by default — most exports are). Change it in the mapping step if your broker exports in another zone.
  • Date order — slash dates like 05/01/2026 can mean 1 May or 5 January. When a cell proves the order (13/01/2026), the preview just reads it back (Dates read as day/month). When every date fits both, a Date order picker appears with no default, each option spelling out the example date, and import stays blocked until you choose.
  • Sample rows show the import as it will happen: one column per mapped field (with the file column it reads underneath), each time followed by the instant it becomes (→ Oct 1, 6:08:13 AM EDT), and file columns nothing reads dimmed as not imported. Option fills get the call/put right (explicit column or inferred from the symbol) and a ×100 multiplier.

Duplicates & re-importing

A fill's identity is the combination symbol + side + quantity + price + timestamp, scoped to the account. Importing the same statement twice — or overlapping date ranges — just counts the repeats as Skipped (duplicates). Re-importing is always safe.

Identical fills within one file (same symbol, side, quantity, price and second — a broker splitting one order) are all kept: each repeat gets its own occurrence-indexed identity, so re-importing the file still skips every one of them.

How fills become trades

After every import the account is regrouped automatically: fills for the same symbol/instrument are walked in time order — same-direction fills scale in, opposite fills reduce, and the trade closes when the position returns to zero (a crossing fill opens the next trade, and its fees are split by quantity between the two). Journal notes attach to the trade and survive regrouping.

Made a mess? Every import and Flex sync is a batch. Settings → Accounts → Sync & import history lists them (an account's page shows just that account's) — Roll back removes the batch's fills and regroups. Empty scheduled Flex runs stay hidden until Show empty syncs.

Limits

Uploads are capped by TM_IMPORT_MAX_BYTES (default 10 MiB, roughly tens of thousands of rows). Self-hosters can raise it — see Configuration — and should keep the proxy body-size limit above it. Split giant histories by year if needed; dedup makes overlapping files harmless.

Other ways in

  • IBKR Flex sync — schedule automatic imports from an IBKR Flex Query, set up from /connect or the account page's Interactive Brokers · Flex sync card (interval via TM_JOB_FLEX_SYNC_INTERVAL_MIN)
  • Screenshot scan — extract fills from a broker screenshot with an LLM, see AI features
  • Manual entry — the New Trade drawer (hotkey c t)
  • API / scripts — POST /api/v1/executions with a personal access token; the same dedup applies
  • CLI — tradermemos import --account … --file … inside the API container

On this page