Awesome n8n templates: 280+ free workflows, organised by use case
A curated, continuously updated GitHub collection of free n8n templates spanning marketing, sales, content and operations automation.
The Automation Wing
A daily n8n workflow that reads your chosen ad-platform news feeds, keeps only the items matching a keyword list, and emails a short digest on the mornings when something actually changed.
Platform changes arrive as a scattered stream: a Google Ads liaison post, a Microsoft Advertising blog entry, a Meta for Business bulletin. Miss the one that says a beta is sunsetting and you find out when a campaign quietly stops spending. The honest version of "staying on top of the platforms" is not reading everything every day; it is being told when a handful of words you care about show up.
This workflow does exactly that and nothing more. Once a day it reads the news feeds you point it at, keeps only the items whose title or summary contains one of your keywords, and emails you a plain digest. On a day with no matches it sends nothing, so an empty inbox means there was genuinely nothing to read. It changes nothing anywhere: it reads feeds and sends one email.
Import the JSON below into n8n (Workflows, then Import from File or paste). The feed URLs inside are deliberately placeholders; replace them with the real feeds named above, and attach your own email credential to the send node.
{
"name": "Platform changelog watcher",
"nodes": [
{
"parameters": {
"rule": {
"interval": [
{
"field": "days",
"triggerAtHour": 7
}
]
}
},
"name": "Every morning",
"type": "n8n-nodes-base.scheduleTrigger",
"typeVersion": 1.2,
"position": [220, 300]
},
{
"parameters": {
"url": "https://REPLACE-ME-FEED-1.example.com/rss",
"options": {}
},
"name": "Ad platform feed 1",
"type": "n8n-nodes-base.rssFeedRead",
"typeVersion": 1.1,
"position": [460, 200]
},
{
"parameters": {
"url": "https://REPLACE-ME-FEED-2.example.com/rss",
"options": {}
},
"name": "Ad platform feed 2",
"type": "n8n-nodes-base.rssFeedRead",
"typeVersion": 1.1,
"position": [460, 400]
},
{
"parameters": {
"jsCode": "// Replaceable keyword list. Case-insensitive substring match on title + summary.\nconst KEYWORDS = ['Performance Max', 'deprecat', 'sunset', 'rollout', 'beta', 'required'];\n\nconst matches = [];\nfor (const item of $input.all()) {\n const j = item.json;\n const hay = ((j.title || '') + ' ' + (j.contentSnippet || j.content || j.summary || '')).toLowerCase();\n const hit = KEYWORDS.find(k => hay.includes(k.toLowerCase()));\n if (hit) {\n matches.push({ keyword: hit, title: j.title || '(untitled)', link: j.link || '', when: j.isoDate || j.pubDate || '' });\n }\n}\n\nconst digest = matches\n .map(m => `- [${m.keyword}] ${m.title}\\n ${m.link}`)\n .join('\\n');\n\nreturn [{ json: { matchCount: matches.length, digest } }];"
},
"name": "Filter for the keywords",
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [700, 300]
},
{
"parameters": {
"conditions": {
"options": {
"caseSensitive": true,
"typeValidation": "strict"
},
"conditions": [
{
"leftValue": "={{ $json.matchCount }}",
"rightValue": 0,
"operator": {
"type": "number",
"operation": "gt"
}
}
],
"combinator": "and"
}
},
"name": "Only if there are matches",
"type": "n8n-nodes-base.if",
"typeVersion": 2,
"position": [940, 300]
},
{
"parameters": {
"fromEmail": "watcher@example.com",
"toEmail": "you@example.com",
"subject": "=Platform changes today: {{ $json.matchCount }}",
"emailFormat": "text",
"text": "={{ $json.digest }}",
"options": {}
},
"name": "Email the digest",
"type": "n8n-nodes-base.emailSend",
"typeVersion": 2.1,
"position": [1180, 220]
}
],
"connections": {
"Every morning": {
"main": [
[
{ "node": "Ad platform feed 1", "type": "main", "index": 0 },
{ "node": "Ad platform feed 2", "type": "main", "index": 0 }
]
]
},
"Ad platform feed 1": {
"main": [[{ "node": "Filter for the keywords", "type": "main", "index": 0 }]]
},
"Ad platform feed 2": {
"main": [[{ "node": "Filter for the keywords", "type": "main", "index": 0 }]]
},
"Filter for the keywords": {
"main": [[{ "node": "Only if there are matches", "type": "main", "index": 0 }]]
},
"Only if there are matches": {
"main": [[{ "node": "Email the digest", "type": "main", "index": 0 }]]
}
}
}
KEYWORDS array to the terms you actually care about.Each line is one matched item: the keyword that caught it, the headline, and a link. Read the link, not the summary; the point of the digest is to route your attention, not to replace the source. If the digest is noisy, tighten the keyword list; if you suspect you are missing things, loosen it and add a feed.
Two honest limitations. First, this is only as good as your feeds and your keywords: a change announced somewhere you are not watching, or phrased in words you did not list, will not appear, so treat it as a helpful net, not a guarantee of completeness. Second, it compares nothing between runs, so an item that stays near the top of a feed for several days can match on more than one morning; if that annoys you, add a "seen links" store, which is a larger build than this starter is meant to be.
More Like This
A curated, continuously updated GitHub collection of free n8n templates spanning marketing, sales, content and operations automation.
An importable n8n flow that watches your sitemap, spots new or changed URLs and pings IndexNow so Bing and Yandex hear about a page the moment it ships.
An importable n8n flow that reads Meta account insights daily, compares yesterday against the trailing week and posts to Slack when spend swings beyond your threshold.