Daily stock price journal in Google Sheets
Every weekday at 4:30pm ET, capture the closing price, percent change, and volume for every ticker on your watchlist into a clean Google Sheets log.
Build me a deterministic daily stock price logger. This is a pure ETL pipeline with no AI step, no narrative output, just structured data fetched on a schedule and appended to a Google Sheet so I have a clean append-only price journal I can chart and pivot from.
Trigger: cron, every weekday (Monday through Friday) at 4:30pm America/New_York, after the US market close.
Step 1. Use google-sheets Get Values to read my watchlist from a tab named Tickers in the configured spreadsheet. The range covers a header row plus a single column of ticker symbols. Symbols are uppercase US tickers (AAPL, MSFT, NVDA). Drop blank rows and trim whitespace. The spreadsheet ID and the Tickers range should both be workflow inputs so I can point it at any sheet.
Step 2. For each ticker, call stock-data Get Stock Quote to pull the latest price, percent change, and trading volume. Fan these out so the run is not serialized on a slow ticker, but cap concurrency to a sensible number (around 5 to 10) so we are polite to the upstream.
Step 3. For each successful quote, build a row with these columns in this exact order: date (YYYY-MM-DD in America/New_York), ticker (uppercase), close_price (number, 2 decimals), percent_change (number, 2 decimals, signed), volume (integer). Skip rows where the quote call failed or returned no price so a single bad ticker does not break the run. Collect the failures in a list for logging but do not write them to the sheet.
Step 4. Use google-sheets Append Values to append all successful rows in a single batch to a tab named Price Log in the same spreadsheet. Use valueInputOption USER_ENTERED so dates and numbers are stored as native types (not strings), and insertDataOption INSERT_ROWS so the appended rows do not overwrite anything. The Price Log tab range and header row already exist; we are only appending body rows.
Error handling rules. If the Tickers read returns zero symbols, end the run cleanly with a no-op log message. If every quote call fails (network outage, upstream down), do not append a partial batch. If only some quote calls fail, append the successful ones and log the failed tickers. Re-running the same day should append another batch rather than corrupting prior history, so the workflow is idempotent in the sense that no destructive writes ever happen.
Hard constraints. No AI step. No summarization, no narrative, no Slack or email output. The Google Sheet IS the output. The shape of each row is fixed so downstream pivot tables and charts in Google Sheets stay stable as the log grows.
Additional information
What does this prompt do?
- Runs every weekday at 4:30pm ET, right after the US market closes, so each day's prices are locked in before the row is written.
- Reads your watchlist from a Tickers tab in your Google Sheet, so you control which symbols are tracked just by editing the sheet.
- Fetches the latest price, percent change, and volume for every ticker in one pass, then appends a clean dated row per ticker to a Price Log tab.
- Skips tickers that fail to fetch so one bad symbol never breaks the run, leaving you with a tidy append-only history you can chart or pivot.
What do I need to use this?
- A Google account with a spreadsheet that has two tabs: Tickers (where you list the symbols you want to track) and Price Log (where new rows get appended).
- A short list of US ticker symbols in the Tickers tab, written in plain uppercase (for example AAPL, MSFT, NVDA).
- Nothing else. Market data is built in, so there are no extra accounts or paid subscriptions to set up.
How can I customize it?
- Change the schedule: run earlier, run later, only on certain days, or add a second run at the open.
- Track different columns: add market cap, day high or low, 52-week range, or company name alongside price and volume.
- Split the log by industry or watchlist group into separate tabs, or point the workflow at a different spreadsheet for each portfolio.
Frequently asked questions
Do I need a paid market data subscription?
What happens on market holidays when the US exchanges are closed?
What if one ticker on my list is bad or temporarily delisted?
How many tickers can I track at once?
Can I build charts on top of the log?
Stop copy-pasting closing prices into a spreadsheet every night.
Connect Google Sheets once. Geni captures the close, percent change, and volume for every ticker on your watchlist at 4:30pm ET.