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:
| Format | What it is | Mapping step? |
|---|---|---|
| Fill CSV | One row per execution/fill — the shape most broker statement exports have | Yes (pre-filled for known brokers) |
| MetaTrader statement | The MT5 Trade History Report (XLSX/HTML) or MT4 Statement (HTML), uploaded as-is — see Supported brokers | No |
| Journal export | One 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 annotations | No |
| JSON backup | A TraderMemos export — restores fills, playbook setups, cash transactions, and account metadata | No |
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:
| Field | Required | Auto-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/2026can 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
/connector the account page's Interactive Brokers · Flex sync card (interval viaTM_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
ct) - API / scripts —
POST /api/v1/executionswith a personal access token; the same dedup applies - CLI —
tradermemos import --account … --file …inside the API container