★ Community Edition ★Price: Free



The Automation Wing

Platform changelog watcher: a daily digest of the ad-platform news that matters

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.

Before you start

  • Decide which feeds to watch. Good starting points are the Google Ads Developer blog (googleadsdeveloper.blogspot.com/feeds/posts/default), the Microsoft Advertising blog (about.ads.microsoft.com/en-us/blog), and Search Engine Land's PPC feed (searchengineland.com/category/ppc/feed). Meta publishes changes through its Business Help and developer changelogs; pick the source you actually trust.
  • Decide your keyword list. Start broad enough to catch the important things and narrow it later: "Performance Max", "deprecat", "sunset", "rollout", "beta", "required".
  • The email step needs an SMTP credential. You attach it after import, so no credentials travel inside the file below.

The workflow

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.

JSON
{
  "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 }]]
    }
  }
}

Set it up

  1. In n8n, import the JSON, then open the workflow.
  2. In each "Ad platform feed" node, replace the placeholder URL with a real feed from the list above. Add a third feed node if you want one, and wire it into "Filter for the keywords" the same way.
  3. Open "Filter for the keywords" and edit the KEYWORDS array to the terms you actually care about.
  4. Open "Email the digest", attach your SMTP credential, and set the from and to addresses.
  5. Set the schedule hour to suit your morning, then run the workflow once by hand to check the output before you activate it.

How to read the digest, and what it will not do

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.

  • Monitoring
  • RSS
  • Alerts