Stocks
Your stock holdings across brokerages and manual entries, with average cost, market value, and unrealized P&L.
The Stocks page is the live view of every share position you currently hold. Each row aggregates a single underlying ticker - combining lots from manual entries and connected brokerage accounts - and shows quantity, weighted average cost, current price, market value, and unrealized P&L.

Assigned short options can create share movements in your account. See Expiration & Assignment.
Summary cards
Above the table, four cards roll up the currently filtered holdings:
- Holdings - count of symbol-and-source groups matching the active filters. A symbol held both manually and at a brokerage, or at two different brokerages, counts as more than one holding.
- Total Cost - sum of cost basis across every visible holding.
- Market Value - current mark-to-market value of all holdings. Shows a dash if live market data is still being fetched.
- Unrealized P&L - total open P&L across visible holdings, with an up/down arrow and green/red color.
A portfolio filter sits in the page header to scope every card and the table to one or more portfolios.
Columns
In the default (Ungrouped) view, columns are:
- Symbol - underlying ticker. Click the row to expand and see the per-account breakdown when a symbol is held in multiple accounts. Rows are grouped by brokerage internally, so the same symbol held both manually and at a brokerage (or at two different brokerages) appears as separate rows - there's no separate "Brokerage" column, but you can filter or sort by source (see Filters below).
- Trade date - date of the earliest contributing lot.
- Quantity - total shares held across all lots for this symbol.
- Avg cost - weighted average cost per share, calculated across every buy/sell that contributed to the current holding.
- Total cost - total dollars invested in this holding (quantity × average cost).
- Fee - total fees across the contributing lots.
- Current - current per-share market price. Shows a dash while market data is still loading. For a holding synced from a brokerage this is your broker's own reported price, refreshed on the brokerage sync cadence, falling back to our market data provider's quote when the broker doesn't report one; manual holdings always use the provider quote. Either way it lags the live market - see Market Data.
- Market value - quantity × current price.
- Unrealized P&L - open P&L for the holding, with the percent return in parentheses. Shows a dash for holdings without market data.
- Adjusted basis (if enabled for your org) - per-share cost after netting the option premium you've realized on the ticker against what the shares cost. The number to weigh against your next covered-call strike, and not a tax figure. Shows a dash for symbols with no option history. See Wheel Cost Basis.
- Portfolio - portfolio assignment, if any (editable inline).
In Group by Portfolio view, rows are grouped under each portfolio with a portfolio-level total row and your unassigned holdings collected under an Unassigned group.
You can show, hide, or reorder columns from the table's column-customization menu.
Filters
Above the table:
- View Mode - Ungrouped or Group by Portfolio.
- All Sources - filter by broker, or pick Manual to show only manually-entered holdings. Hidden when there's only a single source.
- All Accounts - filter by a specific brokerage account. Only shown when a broker is selected with multiple accounts.
- Search - free-text filter on the table (matches the ticker or the brokerage name).
Covered call capacity
A Covered call capacity card above the table answers one question per symbol: how many of your shares are already committed to open short calls, and how many more calls you could write against what's left. It appears on this page and on Positions, and the portfolio filter scopes both.
Each row shows Shares held, Short calls (with any long calls in parentheses), Covered shares, Uncovered shares, a count of the spare 100-share lots left over, and a status badge. A red callout above the table names any symbol with short calls covered by neither shares nor a later-dated long call.
How the numbers are worked out:
- Each contract needs 100 shares.
- Only open, unexpired calls count. Closing a call, letting it expire, or being assigned takes it out of the set - and an assignment that calls shares away shrinks the holding at the same time, so the row follows both events on its own.
- Shares only back calls in the same account. Shares are allocated within each account first, then totaled per symbol, so 300 shares at one broker don't cover a call sold at another.
- A later-dated long call covers a short call. Shares cover short calls first. Any short call left over is covered by a long call in the same account that expires on or after it, one long contract per short contract, so a vertical spread, diagonal or poor man's covered call isn't flagged. A long call that expires before the short doesn't cover it, and long calls never add share capacity. Other hedges (such as long stock in another account) aren't evaluated here.
- The card reads your whole book rather than the filtered table, so a status filter or a search on either page can't hide shares or calls from the count.
Shares that aren't synced from a broker count too once you add them with Add holding. Holdings and calls that have no assigned account are estimated together as their own group, and never cover a call in a connected brokerage account.
The card is a stock-backing estimate, not a margin or buying-power calculation, and not permission to sell a call. Confirm share allocation and trading permission with your broker before you sell.
Bulk actions
Check the box on one or more holdings to select them, then use the actions that appear above the table:
- Assign to Portfolio - move every selected holding to a chosen portfolio in one step.
- Delete - permanently delete the manual stock trades behind the selected holdings, after a confirmation dialog. Brokerage-synced holdings in the selection are skipped rather than deleted, and the toast afterward says how many were skipped. A progress bar tracks the delete, counting trades rather than holdings, since one holding can sit on top of several manual trades. This can't be undone.
The selection bar also carries a Select all button, which extends the action to every holding matching your current filters rather than just the rows on screen. In the Ungrouped view, where the table is paginated on the server, that puts the selection into an all-matching mode and the bar reads "All N holdings selected". Assign to Portfolio is unavailable in that mode - select the holdings individually instead - while Delete resolves the full matching set on the server. Brokerage-synced holdings are still skipped; the selection count is not a promise that every holding can be deleted.
Two 10,000 limits are in play, and they count different things. Select all is disabled above 10,000 matching holdings. Separately, any bulk delete - all-matching or hand-picked - is refused when the holdings it resolves sit on more than 10,000 manual trades. One holding can carry many trades, so a selection that cleared the first limit can still trip the second; nothing is deleted when it does, and an error asks you to narrow down, which is the fix either way.
In Group by Portfolio view, portfolio header rows aren't selectable; select the holdings beneath them. Select-all-matching is not offered in this view, and deleting a selected row removes only that portfolio's portion.
Selection persists between pages. For Assign to Portfolio, manual holdings selected on a previous page may be skipped because their account can no longer be resolved. The warning tells you how many to reselect on their original page. Brokerage-synced holdings can be resolved across pages. See Bulk Actions.
Row actions
Click a row to expand it inline and view a per-account breakdown when the same symbol is held across multiple accounts. Each subrow shows the account name plus the quantity, average cost, total cost, current price, market value, and unrealized P&L for that account's portion.
If the symbol has option history and wheel cost basis is enabled for your organization, the expansion also carries a panel showing where the shares were assigned from, the premium ledger behind the adjusted basis, and how far the current price sits above or below it - see Wheel Cost Basis.
For manually-entered holdings, the row actions menu lets you:
- Edit holding - open the edit modal to adjust quantity, average cost, or trade date.
- Delete holding - remove the holding entirely. Broker-imported holdings cannot be edited or deleted; correct those at your broker and the next sync will reconcile.
Header buttons
- Add holding - open the manual-entry flow for a new stock holding.
Notes on average cost
The Avg cost column is weighted across every buy that contributes to the current holding, with sells reducing the quantity but not the average cost (a FIFO/weighted-average hybrid). If you've sold part of a position, the displayed cost reflects only the remaining shares. Holdings imported from a brokerage use the broker's reported cost basis when available.
That figure describes what you paid for the shares and nothing else. If the shares came from an assigned put and you've been writing calls against them, Wheel Cost Basis is the number that also accounts for the premium.