{
  "meta": {
    "templateCredsSetupCompleted": false
  },
  "name": "Monitor websites & RSS feeds for changes \u2192 GPT summary \u2192 Slack alert",
  "nodes": [
    {
      "id": "e0a393ed-8d9f-457b-9767-988526113a69",
      "name": "Run every morning",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        260,
        300
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "1783e79f-28b4-46a7-b468-67393aeab366",
      "name": "Configuration",
      "type": "n8n-nodes-base.set",
      "position": [
        480,
        300
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "034cbe6f-8939-4942-afc8-bb734a464bd5",
              "name": "openai_model",
              "type": "string",
              "value": "gpt-4o-mini"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "7b83a629-4453-43de-bcce-569e466aa6b6",
      "name": "Monitor RSS & pages (Apify)",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        700,
        300
      ],
      "parameters": {
        "actorId": {
          "__rl": true,
          "mode": "list",
          "value": "glueworks~rss-change-monitor",
          "cachedResultUrl": "https://console.apify.com/actors/glueworks~rss-change-monitor/input",
          "cachedResultName": "glueworks/rss-change-monitor"
        },
        "timeout": {},
        "customBody": "={\n  \"sources\": [\n    { \"url\": \"https://news.ycombinator.com/rss\", \"type\": \"rss\", \"keywordFilters\": [\"ai\", \"startup\"] },\n    { \"url\": \"https://example.com/pricing\", \"type\": \"webpage\", \"cssSelector\": \".price\" }\n  ],\n  \"deduplicationWindow\": 30\n}",
        "actorSource": "store",
        "waitForFinish": true
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "11a2bb7d-999e-4699-bb32-8f34c82706a7",
      "name": "Get change events",
      "type": "@apify/n8n-nodes-apify.apify",
      "position": [
        920,
        300
      ],
      "parameters": {
        "limit": {},
        "offset": {},
        "resource": "Datasets",
        "datasetId": "={{ $json.defaultDatasetId }}",
        "operation": "Get items"
      },
      "credentials": {
        "apifyApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9ade8f9e-bd51-43a1-85d2-b7cb8cd3c445",
      "name": "Only real change events",
      "type": "n8n-nodes-base.filter",
      "position": [
        1140,
        300
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "loose"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "4773d949-9a99-4e61-9c06-41548a7e6a78",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              },
              "leftValue": "={{ $json.eventType }}",
              "rightValue": "run_summary"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "id": "50b4f349-bb73-4196-aa97-73f75c5f361d",
      "name": "OpenAI Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        1360,
        480
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Configuration').first().json.openai_model }}"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.3
    },
    {
      "id": "cc098d4a-f714-47b4-9b6a-d125ef3e816d",
      "name": "Summarize change with GPT",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        1360,
        300
      ],
      "parameters": {
        "text": "=Change event (JSON):\n{{ JSON.stringify($json) }}\n\nWrite the one-line summary now.",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are a monitoring assistant. You receive ONE change event detected on a website or RSS feed (fields: eventType, sourceUrl, sourceType, and either an 'item' object with title/link/summary for new_item, or contentPreview for page_changed). Write a single concise Slack-ready line (max 240 chars): what changed, where, and why it may matter. No markdown headers."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.9
    },
    {
      "id": "8bd845d7-b671-485b-95ae-9c373f94ddd8",
      "name": "Post to Slack",
      "type": "n8n-nodes-base.slack",
      "position": [
        1580,
        300
      ],
      "parameters": {
        "text": "=:rotating_light: *Change detected* \u2014 {{ $('Only real change events').item.json.sourceUrl }}\n{{ $json.text }}",
        "select": "channel",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "",
          "cachedResultName": "#alerts"
        },
        "otherOptions": {
          "includeLinkToWorkflow": false
        },
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "017e3b69-c998-4b54-8bbf-bda490abbab5",
      "name": "note-title",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        260,
        -40
      ],
      "parameters": {
        "color": 4,
        "width": 900,
        "height": 300,
        "content": "# Monitor competitor websites & RSS feeds for changes \u2192 GPT summary \u2192 Slack alert\n\nRuns daily, detects new RSS items and page-content changes with the **glueworks/rss-change-monitor** Apify Actor, summarizes each change with GPT, and posts a Slack alert.\n\n**Setup:** add Apify, OpenAI and Slack credentials, edit the `sources` list in the Apify node, pick a Slack channel. That's it."
      },
      "typeVersion": 1
    },
    {
      "id": "66040932-515a-4bcd-8899-9f7691e5d860",
      "name": "note-1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        700,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 440,
        "height": 220,
        "content": "## 1. Schedule & scrape\nRuns every morning. The Apify Actor checks each source in `customBody.sources` and returns only NEW items / changed pages (it keeps its own dedupe state for `deduplicationWindow` days)."
      },
      "typeVersion": 1
    },
    {
      "id": "8bf81221-6e0d-48bf-ae24-69dffd3f7412",
      "name": "note-2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1140,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 200,
        "content": "## 2. Filter\nThe Actor also emits a `run_summary` record \u2014 the Filter drops it so only real change events flow on."
      },
      "typeVersion": 1
    },
    {
      "id": "665a37c5-8471-4093-a315-08d0636b8d08",
      "name": "note-3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        560
      ],
      "parameters": {
        "color": 7,
        "width": 420,
        "height": 200,
        "content": "## 3. Summarize & alert\nGPT turns each raw event into a one-line human summary, then Slack posts it to your channel. Swap Slack for Gmail/Telegram if you prefer."
      },
      "typeVersion": 1
    }
  ],
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "connections": {
    "Configuration": {
      "main": [
        [
          {
            "node": "Monitor RSS & pages (Apify)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get change events": {
      "main": [
        [
          {
            "node": "Only real change events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Summarize change with GPT",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Run every morning": {
      "main": [
        [
          {
            "node": "Configuration",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Only real change events": {
      "main": [
        [
          {
            "node": "Summarize change with GPT",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summarize change with GPT": {
      "main": [
        [
          {
            "node": "Post to Slack",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Monitor RSS & pages (Apify)": {
      "main": [
        [
          {
            "node": "Get change events",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}