Google Sheets + EODHD: stock signals in one tab
Your watchlist is sitting in a spreadsheet. The market data is somewhere else. The “analysis” is split across tabs, bookmarks, and half-finished notes you’ll never trust again.
Sheets stock signals automation hits hardest when you’re trying to move fast without getting sloppy. A marketing lead managing a founder’s portfolio updates, an agency owner building weekly investor-style briefs, and a small business operator tracking a few long-term positions all run into the same issue: the process doesn’t scale.
This workflow pulls EODHD market data into Google Sheets, calculates indicators, and uses AI to write consistent BUY/WATCH/SELL notes with entry, stop-loss, and take-profit levels. You’ll see how it works, what you need, and where teams usually trip up.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Google Sheets + EODHD: stock signals in one tab
flowchart LR
subgraph sg0["When clicking ‘Execute workflow’ Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "When clicking ‘Execute workf..", pos: "b", h: 48 }
n1@{ icon: "mdi:database", form: "rounded", label: "Get row(s) in sheet", pos: "b", h: 48 }
n2@{ icon: "mdi:swap-vertical", form: "rounded", label: "Loop Over Items", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/merge.svg' width='40' height='40' /></div><br/>Merge"]
n4@{ icon: "mdi:brain", form: "rounded", label: "OpenAI Chat Model", pos: "b", h: 48 }
n5["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Code in JavaScript2"]
n6@{ icon: "mdi:database", form: "rounded", label: "Append row in sheet", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch stock fundamentals (EO.."]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/httprequest.dark.svg' width='40' height='40' /></div><br/>Fetch OHLC price data (EODHD)"]
n9@{ icon: "mdi:robot", form: "rounded", label: "Generate AI stock analysis", pos: "b", h: 48 }
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Compute indicators and growt.."]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Normalize OHLC data"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/code.svg' width='40' height='40' /></div><br/>Prepare data for Google Sheets"]
n3 --> n11
n2 --> n7
n4 -.-> n9
n6 --> n2
n5 --> n12
n1 --> n2
n11 --> n9
n9 --> n5
n8 --> n10
n12 --> n6
n7 --> n8
n7 --> n3
n10 --> n3
n0 --> n1
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n9 ai
class n4 aiModel
class n1,n6 database
class n7,n8 api
class n5,n10,n11,n12 code
classDef customIcon fill:none,stroke:none
class n3,n5,n7,n8,n10,n11,n12 customIcon
The Problem: Stock reviews take too long to trust
Manual stock review sounds simple until you do it consistently. You start by copying tickers from a sheet, then you open a market data site, then you grab fundamentals, then you check price action, then you calculate a few indicators (or you eyeball them, which is worse). After that you try to write a clean “here’s the plan” note, but your wording changes every time, and so does your risk logic. A few stocks are manageable. A real watchlist becomes a weekly time sink, plus a breeding ground for small errors that quietly ruin decisions.
It adds up fast. Here’s where it breaks down in real life.
- You end up re-checking the same numbers on two different sites because you don’t fully trust the first copy-paste.
- Indicator calculations drift over time, which means your “RSI” isn’t the same definition week to week.
- Notes get inconsistent, so “WATCH” can mean “buy next week” or “avoid entirely,” depending on your mood.
- Trade levels live in someone’s head, not in the spreadsheet where the team actually looks.
The Solution: EODHD + Google Sheets signals, generated automatically
This n8n workflow turns a plain Google Sheet of tickers into a repeatable stock analysis pipeline. You keep your list in a column named ticker. When the workflow runs, it reads those rows and processes them one by one, pulling both fundamentals (valuation, growth, profitability) and OHLCV price data from the EODHD APIs. Next, it computes the technical indicators that usually take the most time to calculate correctly: RSI, moving averages (20/50/200), volatility, and simple support and resistance levels. Finally, an AI agent takes the structured fundamentals and indicators and produces consistent outputs you can actually compare across tickers: BUY/WATCH/SELL, entry, stop-loss, take-profit, a thesis, pros and cons, and a 1–10 fundamental quality score. Everything lands back in your Google Sheet in a dedicated Signals tab.
The workflow starts with a manual run in n8n, which is perfect for weekly reviews or “run it now” moments. It then loops through each ticker, merges the data streams, normalizes the price payload, and asks the AI to return structured JSON. After parsing, it maps each field into clean columns and appends a new row to your Signals tab.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you track 25 tickers and do a weekly review. Manually, if you spend about 8 minutes per ticker pulling fundamentals, checking prices, calculating a couple indicators, and writing a quick note, that’s roughly 3+ hours. With this workflow, you update the ticker list in Google Sheets (maybe 2 minutes), run the automation, and let it process in the background; even if it averages about 1 minute per ticker end-to-end, you’re done in around half an hour of total “hands-on” effort. The sheet fills itself, and your Signals tab becomes the place you actually work from.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Google Sheets to store tickers and output signals
- EODHD for fundamentals and OHLCV market data
- OpenAI API key (get it from your OpenAI dashboard)
Skill level: Intermediate. You’ll connect accounts, paste an API token, and be comfortable checking a few mapped fields in the sheet.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A manual run kicks things off. You launch the workflow in n8n when you want a fresh batch of signals, which is great for weekly routines or a pre-market check.
Your watchlist comes from Google Sheets. The workflow reads every row in your input sheet (using a column called ticker) and then iterates through them in batches, so it doesn’t choke on longer lists.
EODHD data is pulled and prepared. It requests fundamentals first, then OHLC price history. After that, it computes indicators and normalizes the price payload so the AI gets consistent inputs instead of messy arrays.
AI writes the signal, then Sheets becomes your dashboard. The AI agent returns structured JSON (signal, trade levels, thesis, pros/cons, and a fundamental score). n8n parses that JSON, maps the fields into your column layout, and appends a new row to the Signals tab.
You can easily modify the AI prompt to match your risk rules based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
This workflow starts manually so you can run stock analysis on demand.
- Add the Manual Launch Trigger node as the workflow trigger.
- Leave all fields at their defaults in Manual Launch Trigger.
Step 2: Connect Google Sheets
Configure the spreadsheet input and output used for tickers and AI results.
- Open Retrieve Sheet Rows and set Document ID to
[YOUR_ID]. - Set Sheet Name to
Sheet1in Retrieve Sheet Rows. - Open Append Sheet Row and set Document ID to
[YOUR_ID]and Sheet Name toSheet1. - Keep Operation set to
appendin Append Sheet Row. - Verify the column mappings use expressions like
{{ $json.ticker }},{{ $json.entry }}, and{{ $json.would_enter }}.
Credential Required: Connect your Google Sheets credentials
[YOUR_ID] is not replaced with a real spreadsheet ID, Retrieve Sheet Rows and Append Sheet Row will fail.Step 3: Set Up Batch Processing and Market Data Fetching
This step iterates tickers and fetches fundamentals and OHLC data in parallel.
- Connect Retrieve Sheet Rows to Iterate Records to process one ticker per batch.
- In Request Fundamentals Data, set URL to
=https://eodhd.com/api/fundamentals/{{ $json.ticker }}.US. - In Request Fundamentals Data, set query parameters: filter =
General,Highlights,Valuation,Technicals, api_token =[CONFIGURE_YOUR_API_KEY], and fmt =json. - In Request OHLC Prices, set URL to
=https://eodhd.com/api/eod/{{ $json.General.Code }}.US. - In Request OHLC Prices, set query parameters: from =
2023-01-01, to =2025-12-30, period =d, fmt =json, and api_token =[CONFIGURE_YOUR_API_KEY]. - Keep the JavaScript in Compute Metrics & Growth and Normalize Price Payload unchanged to calculate technicals and growth scores.
Request Fundamentals Data outputs to both Request OHLC Prices and Combine Data Streams in parallel.
Step 4: Set Up AI Analysis and Parsing
The AI agent generates structured analysis from normalized fundamentals and technical metrics.
- Open Generate AI Analysis and keep Prompt Type as
define. - Set Text in Generate AI Analysis to
=Analyze the following stock data and return the output strictly following the defined JSON schema. INPUT DATA: {{ JSON.stringify($json) }}. - Ensure OpenAI Chat Engine is connected as the language model for Generate AI Analysis and set the Model to
gpt-4.1-nano. - Keep Parse AI JSON to transform the AI response string into JSON.
- Keep Map Sheet Output to reshape AI results into spreadsheet columns.
Credential Required: Connect your OpenAI credentials
OpenAI Chat Engine is connected as the language model for Generate AI Analysis — ensure credentials are added to OpenAI Chat Engine.
Step 5: Configure Output and Looping
The workflow writes results back to the sheet and loops to the next ticker.
- Confirm Map Sheet Output connects to Append Sheet Row to append the analysis data.
- Verify Append Sheet Row maps fields like ENTRY to
{{ $json.entry }}and ENTER(YES/NO) to{{ $json.would_enter }}. - Ensure Append Sheet Row connects back to Iterate Records to process all rows in the input sheet.
Step 6: Test and Activate Your Workflow
Run a full test to validate data fetching, AI output, and spreadsheet writes.
- Click Execute Workflow from Manual Launch Trigger to start a manual run.
- Check Request Fundamentals Data and Request OHLC Prices for valid API responses.
- Confirm Generate AI Analysis outputs a JSON string and Parse AI JSON converts it into structured fields.
- Verify new rows appear in your Google Sheet from Append Sheet Row with populated analysis fields.
- When satisfied, toggle the workflow to Active for production use.
Common Gotchas
- EODHD credentials can expire or need specific permissions. If things break, check your EODHD API token and plan limits in your EODHD account settings first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Default prompts in AI nodes are generic. Add your brand voice early or you’ll be editing outputs forever.
Frequently Asked Questions
About 30 minutes if your APIs are ready.
No. You’ll paste API keys, connect Google Sheets, and confirm your output columns line up.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in OpenAI API costs (often just a few dollars a month at small volumes) and your EODHD plan.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and it’s the first thing I’d tweak, honestly. Update the instructions inside the Generate AI Analysis node so the model weights what you care about (value, momentum, dividend safety, whatever). You can also change the Map Sheet Output step to add new columns like “risk category” or “time horizon.” If you want to swap providers, the OpenAI Chat Engine node can be replaced with another compatible chat model and the rest of the flow stays largely the same.
Most of the time it’s expired Google OAuth or the spreadsheet permissions changed. Reconnect Google Sheets in n8n credentials, then confirm the exact spreadsheet and tab names still match what the nodes reference. Also check that your service account or user has edit access, because the Append Sheet Row node needs write permissions. If it fails only on some rows, look for empty tickers or extra spaces in the ticker column.
Dozens to a few hundred per run is realistic for most setups, as long as you’re not hitting API rate limits.
For this use case, usually yes. You’re combining multiple API calls, doing indicator calculations, merging data streams, and forcing the AI to return structured JSON that you then parse and map. n8n is simply more comfortable with that kind of multi-step logic, and it won’t punish you for branching or batching. Zapier or Make can still work, but you often end up paying more as the workflow grows, and complex transformations get awkward. Talk to an automation expert if you want a quick recommendation based on your volume and tools.
Once this is running, your sheet stops being a static list and becomes a signal engine. Set it up, run it when you need it, and use the time you get back for the decisions that actually matter.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.