Trades and CSV import
Every holdings-tracked account is built from its trades: buys, sells, dividends, splits, fees, interest, and cash transfers. Enter them one at a time, or bring a whole broker history in at once.
For the exact file layout, see Trades CSV format. This page is about the two ways in.
Entering one by hand
Add trade appears on an account's trades screen, in the account row's ⋮ menu, and in the empty state of an account with no trades yet.
The form shows you only the fields the trade actually needs. Pick a Side and it reshapes:
- Buy / Sell — account, date, symbol, quantity, price, fees. The amount is computed and shown to you: Amount $X — computed from quantity, price, and fees.
- Dividend — needs an explicit, positive Amount.
- Interest — needs an explicit Amount, and it's signed: negative for margin interest charged, positive for interest earned.
- Fee — just fees; the amount follows.
- Split — quantity only, and it's the shares added, not the new total.
- Transfer — a deposit, a withdrawal, or a journal between accounts. Needs an explicit, signed amount.
For the three cash-only sides — transfer, interest, fee — the symbol label becomes Symbol (optional) and you should normally leave it blank.
A few conveniences worth knowing:
- Typing two or more characters in Symbol searches for the security and offers matches; picking one also fills in the type. It's best-effort — if the lookup is unavailable, whatever you typed is still accepted.
- The search covers coins as well as stocks, ETFs, and funds. Each suggestion is labelled with what it is, which matters more than it sounds: a few tickers name both a coin and a company — BTC is Bitcoin and also a suspended shell company, SOL is Solana and also a delisted holding company — and the two are different holdings with different prices.
- Type is what decides where the price comes from, so a coin has to be typed Crypto. A trade entered into a Crypto account starts there; anywhere else the default is Stock, and picking a suggestion sets it for you. Fractional quantities are fine — 0.42 BTC is an ordinary buy.
- This is an option reveals underlying, expiry, strike, and right. Quantity becomes Contracts and price becomes Price per share; the ×100 multiplier is applied for you.
- Save and add another keeps the dialog open, holding the account and date and clearing everything else — the fast path for a day's worth of activity.
- The save button stays disabled until the trade is valid, rather than letting you submit and bouncing you back.
Editing a trade works the same way, with one restriction: a trade can't move between accounts, so Account is locked. Changing the date, symbol, side, quantity, or price re-keys the trade — behind the scenes it's rewritten under a new identity, which is what keeps duplicate detection honest.
Importing a CSV
Import in the header opens the import dialog. Nothing is written until you confirm.
Trades or balances
The dialog takes two file shapes, and the first row of tabs picks between them: Trades (this page) and Balances, the three-column file that fills in a balance-tracked account's history — see Balances CSV format.
You mostly don't have to think about it. Both formats are identified by their header row, so dropping a balances file on the Trades tab switches the tab for you and says so. The picker matters for the things that come before a file exists: which template you download, which reference the links open, which account names are listed as matchable, and what Export CSV in the footer exports.
Upload a file or paste rows
Upload file takes a .csv by drag-and-drop or from a file picker, and
starts checking it the moment you choose it. This is the better tab: uploaded
files are decoded from their bytes, so UTF-8, UTF-16, and cp1252 all work,
with or without a byte-order mark.
Paste rows takes the same content as text, for when you've got a handful of rows in the clipboard. Because pasted text is already decoded, a paste that got mangled on the way through the clipboard can't be recovered — if a paste is rejected for unreadable characters, upload the file itself instead.
Two links sit below both tabs: CSV format, which opens the column reference for whichever format is selected, and Download template, which gives you a known-good file with that format's header and two example rows.
Which account each row goes to
There is no account picker. Each row names its account in the account column,
matched case-insensitively against your non-archived accounts — so one file can
carry your whole household. A name that doesn't match is a row error, and import
never creates accounts for you. Create the account first, or fix the spelling.
This holds even when you open the dialog from a single account's trades screen: the import is always workspace-wide.
The preview
Every import runs as a dry run first, and shows you what it found:
142 rows · 138 valid · 3 duplicates · 1 errors
Then a table, one line per row, with its line number and one of three statuses:
- Valid — will be written.
- Duplicate — already in your history, and will be skipped.
- Error — with the reason next to it, in plain language.
Long files show the first 200 rows here. A bad row never stops the rest of the file: fix it and re-import, and the rows that already landed come back as duplicates rather than doubling up.
Press Import n trades to commit, or Back to fix something. Afterwards you get three counts — Imported, Skipped as duplicate, Failed — with the failures listed by line.
When the whole file is rejected
Three problems reject a file outright, and each gets an explanation inside the dialog rather than a disappearing toast:
- That file is empty
- That file isn't in the trades CSV format — shown with the header it expected above the header your file actually starts with, so you can see the difference
- That file isn't readable as a CSV — usually a spreadsheet; export it as CSV and try again
Each of these also links straight to the format reference, and Download template is right below.
Re-importing is safe
A trade's identity comes from its account, date, symbol, side, quantity, price, and sequence number — so importing the same file twice does nothing the second time. Every row reports as a duplicate and none are written. Details, and the one case where that doesn't hold, are in Keeping rows distinct.
After an import
Importing trades kicks off a price fetch for every security in them, and a
banner on the dashboard tracks it. If your broker spells a ticker differently
from the price feed — BRKB where the feed says BRK-B — that banner is where
you'll fix it. See
Portfolio and cash.
Exporting
Export CSV appears in two places: in the import dialog, where it exports every account in the household — in whichever format the tabs are on — and on an account's trades screen, where it exports just that account's trades. Both write the same format you import, so an export can be edited and fed straight back in. Viewers can export too.
The trades screen
View trades on any account row opens its full history: date, symbol, side, quantity, price, fees, amount, and note, newest first, 50 rows to a page. Editors get a pencil and a trash can on each row; deleting is permanent and asks first.
For a holdings account, a summary strip above the table shows the account's cash — or its margin debit — and names any gap between what you've stated and what the trades add up to. See Portfolio and cash.
Who can do this
Adding, editing, deleting, and importing trades all require editor or owner access. Viewers can read every trade and export them, but the buttons that write aren't shown.