
Notion doesn't have built-in stock tracking. But with the right database structure and an external integration for prices, you can build a portfolio tracker that stays up to date.
This guide covers the database setup, how to record trades, and your options for getting live prices.
Short answer: to track stocks in Notion with live prices, you need (1) a Trades database with Symbol, Quantity, and Price properties, and (2) something external that writes current prices back into Notion. Four options exist: a finished tool like ($29 one-time, covers 100+ exchanges plus crypto), a subscription service like NotionInvest, a Make/Zapier automation pulling from Alpha Vantage / Twelve Data / Financial Modeling Prep, or manual updates if your portfolio is stable.
The Trades database is where you record every investment transaction—buying shares, selling positions, or acquiring crypto. It's separate from your regular income/expense tracking because investments work differently: you're not spending money, you're exchanging it for assets that have fluctuating value.
Every buy or sell is a row. Here's the structure:
| Property | What it does |
|---|---|
Symbol | Ticker symbol (AAPL, MSFT, VTI, BTC) |
Account | Which investment account holds this position |
Category | Stock, ETF, Crypto, or Commodity |
Type | Buy or Sell |
Date | Trade date |
Quantity | Number of shares/units |
Price✨ | Price per unit (can be auto-updated) |
Value✨ | Calculated: Quantity × Price |
Currency✨ | Inherited from the linked Account |
The ✨ properties are formulas or auto-updated fields.
When you buy a stock:
Example:
Symbol: AAPL
Account: Vanguard Brokerage
Category: Stock
Type: Buy
Date: 2026-04-01
Quantity: 10
Price: 223.45
The Value✨ formula automatically shows $2,234.50.
When you sell, create another trade with Type: Sell. The system calculates your holdings by summing buys and subtracting sells.
You're not limited to stocks. Use the Category property to organize different asset types:
| Category | Examples |
|---|---|
| Stock | AAPL, MSFT, GOOGL |
| ETF | VTI, VOO, QQQ |
| Crypto | BTC, ETH, SOL |
| Commodity | Gold, Silver |
All four work with automatic price updates.
Notion is a database tool, not a financial data provider. It can't pull stock prices from the market on its own—there's no built-in connection to financial APIs.
This means if you just create a Trades database and add your holdings, the prices will stay frozen at whatever you entered. Your portfolio value won't update as markets move.
To get live prices, you need something external that:
Here are your options:
The app updates prices automatically in the background. You don't configure anything—prices refresh periodically for all your holdings.
Works with stocks (US, EU, Asia exchanges), ETFs, crypto, and commodities. One-time purchase ($29), no subscription.
A third-party service that syncs prices to a Notion database. You create a "Prices" database, add your tickers, and it updates every 30 minutes.
Pricing: €2.90/month or €27.90/year (subscription).
Setup:
Symbol and Price propertiesThen use a relation + rollup to pull prices into your Trades database.
For full control, use an automation tool with a financial API:
This requires more setup but gives you control over update frequency and data sources.
If your portfolio doesn't change often, you can update prices manually. Create a "Last Updated" date property to track freshness.
Not ideal for active tracking, but works for quarterly check-ins.
Once prices update, your portfolio value calculates automatically:
Portfolio Value = Sum of (Quantity × Price) for all holdings
Create a Notion view that:
Value✨If you're tracking net worth, your investment accounts should be part of the picture.
The key is linking trades to accounts:
Account relation)This way, when stock prices update, your net worth updates too. For the full setup:
Create these saved views in your Trades database:
| View | Filter/Group | Purpose |
|---|---|---|
| All Holdings | Group by Symbol, filter to net quantity > 0 | See current positions |
| By Account | Group by Account | See holdings per brokerage |
| By Category | Group by Category | Stocks vs ETFs vs Crypto |
| Recent Trades | Sort by Date descending | Review recent activity |
| Performance | Add gain/loss calculation | See winners and losers |
If you receive dividends, record them as income transactions linked to the investment account:
This keeps your account balance accurate and tracks income separately from capital gains.
Be realistic about what you're building:
Notion is good for seeing your portfolio at a glance and tracking against your overall finances. It's not a replacement for a brokerage dashboard.
Not on its own. Notion's databases only display values you enter or calculate. To show live prices, you need a tool or automation that fetches the price from a financial data source and writes it into a Notion property. The four options above cover the main ways to do that.
Yes, two paths. The fully manual route is free but you update prices yourself. A Make or Zapier automation paired with a free-tier API (Alpha Vantage and Financial Modeling Prep both have free tiers) costs nothing for low-volume use, but the setup takes an evening. Finished products like ($29 one-time) save the setup time and cover 100+ exchanges out of the box.
Depends on the method. Manual updates are whenever you do them. Make/Zapier automations can run every 15 minutes on free tiers. Subscription services like NotionInvest update every 30 minutes. refreshes prices in the background every 30 minutes for all your holdings without configuration.
Yes, the same setup works. Use BTC, ETH, SOL, etc. as ticker symbols and pick a price source that supports crypto. Most modern financial APIs (Twelve Data, CoinGecko, Financial Modeling Prep) and the finished tools listed above include crypto alongside stocks.
Yes, but the price source matters. Many free APIs are US-only. For European, Asian, or other exchanges you need a provider that covers global markets — Twelve Data covers 100+ exchanges, Alpha Vantage has limited international coverage, and supports global exchanges by default.