Investment Tracking
Budget lets you track investment holdings with individual position-level detail: ticker symbol, share count, cost basis, and current price. This gives you gain/loss and allocation data inside the same app where you budget.
Navigate to Investments in the left sidebar.
Supported Account Types
Any tracking account with one of these classes gets an investment panel:
| Class | Typical use |
|---|---|
| Brokerage | Taxable investment account |
| 401(k) | Employer-sponsored retirement account |
| IRA | Traditional or Roth IRA |
| HSA | Health Savings Account with investment component |
Add these accounts from the Net Worth page → + Add Account.
Adding Holdings
There are three ways to add holdings:
Manual Entry
- Click Add Position in the page header
- Select the account you want to add to
- Fill in Ticker, Shares, Current Price, and Cost Basis (optional)
- Click Save
Ticker auto-fill: When adding a new holding, tab out of the ticker field and Budget will attempt to look up the current market price automatically. If the ticker is recognized (US equities, ETFs), the price field is pre-filled. You can always override it manually.
You can also add positions from within an account section — hover the account header to reveal the + button.
CSV Import
- Click Import CSV in the page header
- Select the account to import into
- Drop or select a CSV file exported from your brokerage
- Map the columns — Budget auto-detects common column names (Symbol, Shares, Price, Cost Basis)
- Review the preview table showing parsed positions with computed values
- Click Import
Existing positions with the same ticker are updated (upserted), not duplicated.
Supported column names (auto-detected):
- Ticker:
ticker,symbol,security,holding,fund,name - Shares:
shares,quantity,qty,units - Price:
price,current price,last price,market price,close - Cost Basis:
cost basis,cost,total cost,basis,purchase,avg cost
Cost Basis is optional — if not mapped, gain/loss tracking won't be available for those positions.
Editing and Deleting Holdings
Hover any holding row to reveal Edit (pencil) and Delete (trash) icons.
Edit lets you update any field — most commonly the current price to keep the value current, though live pricing handles this automatically for recognized tickers.
Delete removes the holding permanently. The account's total value in the balance sheet updates immediately.
Live Price Feed
Budget automatically fetches current market prices when you load the Investments page. This uses the Finnhub (opens in a new tab) market data API.
How It Works
- On every page load, Budget checks which tickers need a price refresh
- Prices are cached for 5 minutes — subsequent loads within that window use the cache
- Each holding shows a badge indicating its price source:
| Badge | Meaning |
|---|---|
| Live (green) | Price fetched from Finnhub within the last 15 minutes |
| Stale (amber) | Live price is older than 15 minutes |
| Manual (gray) | No live price available — using your manually entered price |
What Gets Live Prices
Finnhub covers US equities, ETFs, and some crypto/ADRs. This includes tickers like AAPL, VTSAX (as an ETF), SPY, QQQ, TSLA, and BTC.
Tickers that won't get live prices:
- Mutual funds with non-standard symbols
- Employer-specific 401k fund identifiers
- Some international tickers
- Custom or proprietary fund codes
For these, the manually entered price is used — no error is shown, just the gray "Manual" badge.
Daily Change
The Day column shows each holding's daily price change (percentage). Green for gains, red for losses. This column only appears for holdings with live prices.
Refreshing Prices
Click Refresh Prices at the top of the page to force a fresh fetch for all tickers. The button shows a spinner while refreshing. The "Updated X min ago" timestamp shows when prices were last fetched.
Dashboard Layout
The Investments page is a full portfolio dashboard with five sections:
Hero Card
Your total portfolio value displayed prominently, with two change indicators:
- Daily change — dollar and percentage change today (from live prices)
- Total return — cumulative gain/loss since purchase (from cost basis)
A Refresh button lets you force-fetch fresh prices. The "Updated X min ago" timestamp shows when prices were last pulled.
Stat Cards
Three summary cards below the hero:
| Card | What it shows |
|---|---|
| Total Gain/Loss | Cumulative dollar gain/loss with % return on total cost basis invested |
| Today's Change | Aggregate daily dollar change with trend icon |
| Best Performer | Your highest-returning holding by total return % (with trophy icon) |
Day Movers
A split card showing your top daily gainers (green) and top daily losers (red). Each entry shows the ticker, account, percentage change, and dollar change. This section only appears when live prices are available — it's the feature that makes you want to check the page every morning.
Account Allocation + Top Holdings
Two-column layout:
- Account Allocation — donut chart showing how your investments are distributed across accounts (e.g., 401k vs Brokerage vs IRA)
- Top Holdings — your 5 largest positions ranked by value, with color-coded allocation bars and daily change indicators
Holdings by Account
Collapsible per-account sections. Each account header shows the account name, class badge, position count, portfolio allocation %, total value, and account-level gain/loss.
Holdings Table
| Column | What it shows |
|---|---|
| Ticker | Symbol + Live/Manual/Stale badge |
| Shares | Quantity held |
| Price | Current price per share (live or manual) |
| Value | Current value (shares × price) |
| Day | Daily price change % (live prices only) |
| Gain/Loss | Current value − cost basis, with a visualization bar showing the cost basis to current value ratio |
| Alloc | Holding's share of the account total, with a colored allocation bar |
Each account header row shows the total value across all holdings and its percentage of your total investments.
Keeping Prices Current
For holdings with recognized tickers, prices update automatically on every page load — no action required. This is the recommended workflow for most users.
For holdings with unrecognized tickers (employer 401k funds, custom identifiers):
- Click the edit icon on any holding row and change the Current Price field
- Recommended cadence: monthly, when you update other tracking account values
Allocation and Net Worth
Holding values roll up into the balance sheet automatically:
- Each investment account's total = sum of (shares × current price) across all holdings
- This total is what appears in the Balance Sheet and the Net Worth chart
- The Asset Allocation donut on the Net Worth page includes these values in the Investments segment
If you have an investment account with no holdings entered, the account's manually entered tracking value is used instead (the value from the last Update Value entry).
Gain / Loss Tracking
Gain/loss is computed per holding: (shares × current price) − cost basis.
This is an unrealized gain/loss — it reflects paper value, not proceeds from a sale. There is no tax lot tracking or realized gain/loss calculation in the current version.
Accounts That Can't Be Synced
Many 401k plans, HSA investment components, and employer stock programs are not accessible via bank sync APIs. Coverage gaps include:
- Employer-sponsored 401k plans through Empower, Vanguard 401k (employer), Alight, and Principal
- Most HSA brokerage components (Fidelity HSA is an exception)
- ESPP shares held in employer stock plan platforms
- Deferred compensation plans
For these accounts, manual holdings entry is the right approach:
- Add them as a tracking account with the appropriate class (401k, IRA, HSA, etc.)
- Enter your current positions — even rough numbers give you useful allocation data
- Update prices periodically from your provider's website or a brokerage data source
Manual entry is a first-class workflow, not a workaround. This is how the best personal finance apps (Empower, Copilot) handle unsyncable accounts.