Every morning at 08:00 IST the workflow searches Google News for each competitor, asks Gemini to score every article for relevance, summarise it in two or three lines and categorise it, drops everything that is not worth a PM's attention, and emails what is left as a single grouped digest. Every article it judged — kept or dropped — is written to Google Sheets so trends can be tracked, and the finished digest is archived on this site. On Fridays it also writes a weekly rollup.
The premise is that a PM does not have time to read news sites daily, but also cannot afford a feed that is 90% noise. Most of the engineering here went into the second problem.
| Every morning 8:00 IST | Schedule trigger. n8n's timezone is Asia/Kolkata, so 08:00 is IST natively. |
| Run on demand (webhook) | GET endpoint so the digest can be fired for a demo without waiting. |
| Run now (demo) | Manual trigger for use inside the n8n editor. |
| Settings | One place for the company, the competitor list, the recipient, the relevance threshold and the Sheet ID. |
| One item per competitor | Splits the competitor list so each is searched separately. |
| Serper: Google News | POST per competitor, India, English, last 24 hours, 10 results. |
| Collect and de-duplicate | Flattens the responses and clusters near-duplicate stories. |
| Build the prompt | Assembles the batch prompt from the surviving articles. |
| Gemini: score, summarise, categorise | One call, JSON array back. |
| Keep what matters | Merges the verdicts, ranks non-English down, drops anything below the threshold. |
| Compose the digest | Groups by category and builds the HTML email. |
| Email the digest | Gmail send. |
| Rows for history | Prepares one row per article — kept and dropped. |
| Append to Sheets (history) | Writes them to Google Sheets. |
| Archive on PMnews | POSTs the finished digest to this site. |
| Is it Friday? | Branches on the weekday. |
| Read the week | Reads the last seven days from Sheets. |
| Weekly prompt | Filters to stories that made a digest and builds the rollup prompt. |
| Gemini: weekly rollup | Writes the weekly brief. |
| Email the weekly rollup | Sends it. |
| n8n self-hosted, v2.20.7 | Orchestration: schedule, HTTP calls, branching, email, Sheets. | n8n.syntharaai.org |
| Serper google.serper.dev/news | Live Google News results. 1 credit per competitor per run; 2,500 free credits. | X-API-KEY header, stored as an n8n credential |
| Google Gemini gemini-2.5-flash | Relevance score, 2–3 line summary and category, in one batched call. Free tier. | n8n credential “Google Gemini(PaLM) Api account” |
| Gmail n8n Gmail node | Delivers the digest. OAuth2, send scope only. | n8n credential “Gmail account” |
| Google Sheets n8n Sheets node | History for trend tracking and the Friday rollup. | n8n credential “Google Sheets account” |
| FastAPI + SQLite this site | Archive, 30-day trends and a Run-now button. | pmnews.heronedgeacademy.com |
No keys appear in the exported workflow. To run it yourself you supply four credentials inside n8n:
| Serper | Free key from serper.dev. In n8n: a Header Auth credential with name X-API-KEY. |
| Gemini | Free key from Google AI Studio, as a Google Gemini(PaLM) credential. |
| Gmail | Enable the Gmail API in Google Cloud, create an OAuth client with redirect https://<your-n8n>/rest/oauth2-credential/callback, add yourself as a test user, then connect it in n8n. |
| Google Sheets | A Sheets OAuth credential with access to one spreadsheet, plus its ID in the Settings node. |
The scenario is a Product Manager at Zepto, tracking Blinkit, Swiggy Instamart, BigBasket and Flipkart Minutes. Indian quick commerce was chosen because it produces genuine news almost daily — funding, dark-store launches, partnerships, regulatory action — so the digest has something real to say each morning.
The list lives in the Settings node as a single comma-separated field, so there is one place to change it. The brief allows storing competitors in Google Sheets instead; that is a one-node swap, and the node carries a comment saying so. A fixed list was preferred because it makes the workflow reproducible by a reviewer without sharing a spreadsheet, and because letting the AI discover competitors on the fly introduces drift — the set would quietly change between runs and the trend history would stop being comparable.
You are a research assistant for a Product Manager at {company}, an Indian quick-commerce company.
Below are news articles about competitors. For EACH article, judge it from the PM's point of view.
Return a JSON array with one object per article, in the same order, each with:
"relevance": 1-10. How useful is this to a {company} PM deciding what to build or worry about?
10 = a competitor shipped a feature, raised money, entered a category or changed strategy.
7 = a material operational or regulatory event at a competitor.
5 = general industry or market news that sets context.
3 = a passing mention of the competitor in a story that is really about something else.
1 = irrelevant. Local crime, celebrity gossip, unrelated use of the brand name, pure stock
tips, or an article not really about the competitor at all.
Use the full range. If everything looks like a 10 you are not discriminating: reserve 9 and 10
for news that would genuinely change what a PM does this quarter.
"category": exactly one of ["Product Launch", "Funding", "Partnership", "Expansion", "Leadership",
"Regulation", "Financials", "Marketing", "Other"]
"summary": 2-3 lines, plain English, what happened and why a PM should care. No preamble, no
repeating the headline verbatim.
Judge only what the title and snippet actually say. Do not invent details. If an article is too thin
to tell, give it a low relevance rather than guessing.
Articles:
{articles}
Reply with the JSON array only.
You are briefing a Product Manager at {company} on the competitive week just gone.
Here are the competitor stories collected this week, already summarised:
{articles}
Write a short weekly rollup:
- 3 to 5 bullets on what actually mattered, naming the competitor each time
- one line on any pattern across the week (a category several rivals moved in, a repeated theme)
- one line on what you would watch next week
Be concrete and brief. If the week was quiet, say so rather than padding.
Both run on gemini-2.5-flash at temperature 0.2 (0.3 for the rollup),
with responseMimeType: application/json on the daily call so the reply parses
reliably.
| Google Sheets history | Every article is appended to a spreadsheet with its competitor, category, relevance, summary, source and whether it made the digest. Dropped articles are stored too — they are how you check later whether the relevance threshold is set right. |
| Trend tracking | The front page reads that history and shows, over 30 days, what each competitor has been in the news for and the category mix across all of them. |
| Friday weekly rollup | A weekday branch reads the last seven days from Sheets, filters to stories that made a digest, and asks Gemini for a short brief: what mattered, any pattern across the week, and what to watch next. Emailed the same way. |
| AI relevance scoring | Every article gets 1–10. Below 6 it is stored but kept out of the email. On a normal run this removes roughly half of what was fetched. |
Download the workflow JSON — import into n8n via Workflows → Import from File, attach the four credentials, put your Sheet ID and recipient in the Settings node, and activate.
Live workflow ID KFR0wEDv4BMVEPgc. The file contains no API keys.