AutomationFlowsGeneral › Automated Blog Content Tracking with RSS Feeds and Time-based Filtering

Automated Blog Content Tracking with RSS Feeds and Time-based Filtering

Byautomedia @automate-social-media on n8n.io

This workflow provides a powerful yet simple foundation for monitoring blogs using RSS feeds. It automatically fetches articles from a list of your favorite blogs and filters them based on their publication date, separating new content from old. It is the perfect starting point…

Event trigger★★★★☆ complexity19 nodesRSS Feed Read
General Trigger: Event Nodes: 19 Complexity: ★★★★☆ Added:

This workflow corresponds to n8n.io template #9596 — we link there as the canonical source.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "nodes": [
    {
      "id": "496331d0-329e-447e-97e6-ad993d98a461",
      "name": "Split RSS Feeds",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        1168,
        992
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "e04394b1-dc73-4dbb-911a-3798f917d5a3",
      "name": "RSS \u2192 Items",
      "type": "n8n-nodes-base.rssFeedRead",
      "onError": "continueRegularOutput",
      "maxTries": 2,
      "position": [
        1760,
        832
      ],
      "parameters": {
        "url": "={{ $json.source_identifier }}",
        "options": {
          "ignoreSSL": false,
          "customFields": ""
        }
      },
      "retryOnFail": true,
      "typeVersion": 1.1
    },
    {
      "id": "3f29990d-0f26-405c-b70c-492718d41e1d",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -64,
        576
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "60dd1b52-bce1-48cc-88a2-f60cad366936",
      "name": "Merge3",
      "type": "n8n-nodes-base.merge",
      "position": [
        2416,
        576
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "57a4231b-6806-4568-8c15-a246c18c2f38",
      "name": "Client ID + Max Content Age + Blogs",
      "type": "n8n-nodes-base.merge",
      "position": [
        1856,
        592
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "typeVersion": 3.2
    },
    {
      "id": "590c89f0-259d-4e8a-9a9b-71d59d51920e",
      "name": "Find Date & Time of Blogs",
      "type": "n8n-nodes-base.dateTime",
      "position": [
        2144,
        400
      ],
      "parameters": {
        "date": "={{ $json.pubDate || $json.isoDate }}\n",
        "format": "yyyy-MM-dd",
        "options": {},
        "operation": "formatDate",
        "outputFieldName": "standardizedPubDate"
      },
      "typeVersion": 2
    },
    {
      "id": "1d320e63-1019-49ac-a51d-c646fae6025f",
      "name": "Filter Out Old Blogs",
      "type": "n8n-nodes-base.if",
      "position": [
        2656,
        576
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "bccea370-70ab-478d-a77a-385af6826ae0",
              "operator": {
                "type": "dateTime",
                "operation": "afterOrEquals"
              },
              "leftValue": "={{ $json.pubDate }}",
              "rightValue": "={{ DateTime.now().minus({ days: $json.max_content_age_days }).toFormat('yyyy-MM-dd') }}"
            }
          ]
        }
      },
      "retryOnFail": false,
      "typeVersion": 2.2
    },
    {
      "id": "b856b591-4b95-4798-9c8a-54d55fbf27ee",
      "name": "max_content_age_days",
      "type": "n8n-nodes-base.set",
      "position": [
        192,
        576
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "41cbc93c-c60a-4fa2-a46c-23a0b887a270",
              "name": "max_content_age_days",
              "type": "number",
              "value": "=60"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "42e3d496-4831-4df4-953c-df5d31dbcb9d",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        816,
        992
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "source_identifier"
      },
      "typeVersion": 1
    },
    {
      "id": "26b2194b-6f73-41d4-bbff-bf96d3936413",
      "name": "blogs to track",
      "type": "n8n-nodes-base.set",
      "position": [
        512,
        992
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "4465ec7e-d770-4b59-a007-51c5b2731d8e",
              "name": "source_identifier",
              "type": "array",
              "value": "={{ ['https://blog.n8n.io/rss', 'https://zapier.com/blog/feeds/latest/'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "6fc7481c-aba4-4526-afe0-3adec1094d35",
      "name": "Rss feed link",
      "type": "n8n-nodes-base.set",
      "position": [
        1568,
        1008
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "1c04a980-ba49-4eda-8c32-eb09dbaa448c",
              "name": "source_identifier",
              "type": "string",
              "value": "={{ $json.source_identifier }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "542dece8-0e23-430e-a48a-cbd56a3a33ff",
      "name": "rss feed links + blogs",
      "type": "n8n-nodes-base.merge",
      "position": [
        1952,
        992
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineAll"
      },
      "retryOnFail": true,
      "typeVersion": 3.2
    },
    {
      "id": "01009054-b0f7-4151-ae00-e24772883993",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -576,
        256
      ],
      "parameters": {
        "width": 432,
        "height": 944,
        "content": "## Welcome My Friend - This is how you download blogs and filter out old ones - all for free and with no api keys\n\nNecessary setup:\n\n1. The node called 'max_content_age_days' is for you to set how recent you want your blogs to be. The default is 60. That means it will save blogs that were published within the last 60 days.\n\n2. The 'blogs to track' node is a list of the blogs you are interested in tracking. The trick is that you must search for the websites' rss feed url. I have started you off with the rss feed url of n8n and zapier. If this workflow gives you a 403 error that means one of your links is wrong. It's best to find the most up to date rss feed url using something like perplexity (most up to date information).\n\n3. The 'filter out old blogs' node is set up to send OLD blogs down the false path, and NEW blogs down the true path.\n\n4. I highly recommend adding a node of your choice to the TRUE path of the 'filter out old blogs' node. Think about where you want to store these newly saved blogs. For example:\n- a loop over items node and a google sheets node. This will send one blog into the google sheet at a time. \n\n\nCheck my page for more templates, I'm posting more variations of this workflow. Send me questions if you need help!\n\nI got you!"
      },
      "typeVersion": 1
    },
    {
      "id": "84d5a479-d8b9-4c7e-893b-800d130f3f44",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        128,
        320
      ],
      "parameters": {
        "color": 4,
        "height": 464,
        "content": "## Choose # of Days \n\nFilter out blogs older than **your number of days** old\n\nThe default is 60, so it won't save blogs posted over 60 days ago.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "693ca94d-11cf-4aa9-a740-79f66e39b2db",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        432,
        672
      ],
      "parameters": {
        "color": 4,
        "width": 256,
        "height": 512,
        "content": "## Find RSS FEED URLS\n\nAdd the rss feed urls of the blogs that you want to track. I highly recommend using an LLM like perplexity to help you find the most up to date rss feeds.\n\nSearch for something like: What is the rss feed url for the n8n blog in [today's date]\n"
      },
      "typeVersion": 1
    },
    {
      "id": "bc443695-d59c-453a-a41d-021a413a7f11",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1088,
        768
      ],
      "parameters": {
        "color": 6,
        "width": 1104,
        "height": 496,
        "content": "## This loops over the websites one at a time to find all blogs."
      },
      "typeVersion": 1
    },
    {
      "id": "ca80d535-8557-480c-b269-fc3a5ea9c6c6",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2064,
        256
      ],
      "parameters": {
        "width": 256,
        "height": 320,
        "content": "## Adds a 'published date' in an easy to read format\n\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5bb7cf78-1942-42ee-a5fb-9660507e6d8d",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2576,
        416
      ],
      "parameters": {
        "width": 256,
        "height": 288,
        "content": "## Filters out blogs that are older than the date you specified\n"
      },
      "typeVersion": 1
    },
    {
      "id": "a87532e0-9928-4020-bd64-3f975f326ea3",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        752,
        768
      ],
      "parameters": {
        "width": 256,
        "height": 368,
        "content": "## Splits all of the websites into their own items so that they go into the loop one at a time\n"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Merge3": {
      "main": [
        [
          {
            "node": "Filter Out Old Blogs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Split RSS Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "RSS \u2192 Items": {
      "main": [
        [
          {
            "node": "rss feed links + blogs",
            "type": "main",
            "index": 0
          }
        ],
        []
      ]
    },
    "Rss feed link": {
      "main": [
        [
          {
            "node": "RSS \u2192 Items",
            "type": "main",
            "index": 0
          },
          {
            "node": "rss feed links + blogs",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "blogs to track": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split RSS Feeds": {
      "main": [
        [
          {
            "node": "Client ID + Max Content Age + Blogs",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "Rss feed link",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter Out Old Blogs": {
      "main": [
        [],
        []
      ]
    },
    "max_content_age_days": {
      "main": [
        [
          {
            "node": "Client ID + Max Content Age + Blogs",
            "type": "main",
            "index": 0
          },
          {
            "node": "blogs to track",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "rss feed links + blogs": {
      "main": [
        [
          {
            "node": "Split RSS Feeds",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Find Date & Time of Blogs": {
      "main": [
        [
          {
            "node": "Merge3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Client ID + Max Content Age + Blogs": {
      "main": [
        [
          {
            "node": "Find Date & Time of Blogs",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge3",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "max_content_age_days",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

This workflow provides a powerful yet simple foundation for monitoring blogs using RSS feeds. It automatically fetches articles from a list of your favorite blogs and filters them based on their publication date, separating new content from old. It is the perfect starting point…

Source: https://n8n.io/workflows/9596/ — original creator credit. Request a take-down →

More General workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

General

Merge Data For Multiple Executions. Uses manualTrigger, rssFeedRead, splitInBatches. Event-driven trigger; 6 nodes.

RSS Feed Read
General

Read Rss Feed From Two Different Sources. Uses rssFeedRead, manualTrigger, splitInBatches. Event-driven trigger; 4 nodes.

RSS Feed Read
General

Read RSS feed from two different sources. Uses rssFeedRead, manualTrigger, splitInBatches. Event-driven trigger; 4 nodes.

RSS Feed Read
General

subflow-tts. Uses rssFeedRead. Event-driven trigger; 6 nodes.

RSS Feed Read
General

Data Transformation Techniques. Uses rssFeedRead. Event-driven trigger; 6 nodes.

RSS Feed Read