{
  "name": "AI-powered price watchdog: competitor monitoring & alerting (Decodo & Gemini)",
  "nodes": [
    {
      "id": "c65eb0e0-66c6-4145-982b-80a71f393411",
      "name": "Start Workflow (Manual Run)",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -800,
        -96
      ]
    },
    {
      "id": "e61dbb92-37f8-4159-be66-ec07314e4ffe",
      "name": "Config: Alert Parameters",
      "type": "n8n-nodes-base.set",
      "position": [
        -432,
        0
      ]
    },
    {
      "id": "fd66e345-e89a-466b-bfb4-d3166c4b174f",
      "name": "Decodo: Fetch Full HTML",
      "type": "@decodo/n8n-nodes-decodo.decodo",
      "position": [
        736,
        16
      ]
    },
    {
      "id": "54e2a208-9cf9-4d09-b8e6-be9a43bfe0b5",
      "name": "Google Gemini Chat Model",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "position": [
        1328,
        256
      ]
    },
    {
      "id": "e410bbcf-7a3e-471d-bb24-64d0cf9dc6cd",
      "name": "Structured Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "position": [
        1520,
        256
      ]
    },
    {
      "id": "46470c28-7e65-46c6-bea8-1583d491617d",
      "name": "Discard Error Item",
      "type": "n8n-nodes-base.noOp",
      "position": [
        2224,
        256
      ]
    },
    {
      "id": "19016499-b7cf-4479-9aaa-c4bef22e49f3",
      "name": "Update row in sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        3744,
        16
      ]
    },
    {
      "id": "0cad87b4-7f0b-42f9-9e44-ab24d964f53c",
      "name": "If: Alerts to Send?",
      "type": "n8n-nodes-base.if",
      "position": [
        2816,
        -160
      ]
    },
    {
      "id": "e87a7f1d-335e-4b2d-be5f-25767afe7d15",
      "name": "Split Alerts for Notification",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        3216,
        -288
      ]
    },
    {
      "id": "307fc036-767d-4700-a9cf-3ce872507f79",
      "name": "Send Competitor Price Alert",
      "type": "n8n-nodes-base.slack",
      "position": [
        3424,
        -288
      ]
    },
    {
      "id": "61c3d905-0441-47a9-9421-54be236100c1",
      "name": "Sheets: Get Competitor List",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        80,
        0
      ]
    },
    {
      "id": "9bc391a1-28bd-462e-b026-cf44d2cde6c0",
      "name": "Code: Filter HTML Noise",
      "type": "n8n-nodes-base.code",
      "position": [
        944,
        16
      ]
    },
    {
      "id": "4b755a28-f4ce-4182-b032-37c1a02a9e9b",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1568,
        -608
      ],
      "parameters": {
        "width": 688,
        "height": 832,
        "content": "# AI-Powered Price Watchdog: Competitor Monitoring & Alerting (Decodo & Gemini)\n\n## How It Works\nThis advanced workflow automates market monitoring by intelligently extracting structured pricing data "
      }
    },
    {
      "id": "f4d8adbd-aed4-4495-b82b-5b731c57bb9f",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -800,
        112
      ]
    },
    {
      "id": "3d9347b2-cf0c-4cb8-bd3e-77ad828a61e0",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        -160
      ],
      "parameters": {
        "width": 464,
        "height": 384,
        "content": "## Full HTML Scraping & Filtering\n**Decodo** scrapes dynamic HTML (JSON). Code then slices the text using universal keywords to isolate the pricing tables."
      }
    },
    {
      "id": "ea48ff7d-e25b-427e-8c89-e4d384958822",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        656,
        -400
      ],
      "parameters": {
        "width": 464,
        "height": 208,
        "content": "## 🎁 Exclusive 80% Discount!\n\nGet **80% OFF** the **23k Advanced Scraping API** plan at Decodo using this workflow.\n\n**Coupon Code:** `ATTAN8N`\n\n👉 [**Click here to Sign Up & Claim**](https://visit.dec"
      }
    },
    {
      "id": "72a4e016-8177-4a16-941a-b38e04a2f31c",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -624,
        -160
      ],
      "parameters": {
        "width": 464,
        "height": 384,
        "content": "## Global Configuration\nThis node centrally defines global parameters, including the **`alert_threshold_percent`**, for the entire monitoring process."
      }
    },
    {
      "id": "6bf5c2b0-8954-4f81-bd9c-d7db8ff6c4c7",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -96,
        -160
      ],
      "parameters": {
        "width": 448,
        "height": 384,
        "content": "## Data Sourcing\nThis node retrieves the **live list of competitor URLs** directly from your **Google Sheet** using the **Get Row(s)** action."
      }
    },
    {
      "id": "060eb55c-fe56-4950-b4df-45d34b4c4265",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1184,
        -160
      ],
      "parameters": {
        "width": 544,
        "height": 624,
        "content": "## AI Extraction & Structuring\nThe AI acts as a **Data Analyst**, structuring cleaned text into a rigid **JSON Schema** of pricing plans and features."
      }
    },
    {
      "id": "313e798f-f7fc-4dbc-b4c3-388aca1d9012",
      "name": "If: Price Parsed Successfully?",
      "type": "n8n-nodes-base.if",
      "position": [
        1936,
        16
      ]
    },
    {
      "id": "cbb1cee9-ee2c-4f5b-be25-2bd69213cf9c",
      "name": "If: History Exists?",
      "type": "n8n-nodes-base.if",
      "position": [
        2176,
        0
      ]
    },
    {
      "id": "bc03be94-860c-490b-93da-1fdb85552986",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1792,
        -176
      ],
      "parameters": {
        "width": 608,
        "height": 400,
        "content": "## Error Guard & History Check\nFinal validation checks if the price is clean, and the history exists to decide between **comparison** or **initial logging**."
      }
    },
    {
      "id": "bf207757-92af-4a27-b995-874c2e34443a",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2464,
        -416
      ],
      "parameters": {
        "width": 576,
        "height": 512,
        "content": "## Comparison & Conditional Alerting\n**Code: Calculate Price Diff** finds changes, handles the **free-to-paid** case, and checks the **alert threshold** before splitting notifications."
      }
    },
    {
      "id": "4c07dbc2-e8bd-4350-bad3-ba401b377761",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        3104,
        -416
      ],
      "parameters": {
        "width": 848,
        "height": 640,
        "content": "## Final Logging & Alert Delivery\nShifts historical price data, logs new prices, and sends urgent Slack alerts for any significant change detected."
      }
    },
    {
      "id": "a1943de4-90c3-4082-b1c9-d167d0199150",
      "name": "Loop Monitor Each Plan",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        448,
        0
      ]
    },
    {
      "id": "6240f365-c365-4894-ba2e-f88abdfb19ba",
      "name": "AI Agent: Extract Plans",
      "type": "@n8n/n8n-nodes-langchain.agent",
      "position": [
        1344,
        16
      ]
    },
    {
      "id": "100c8167-8672-4afa-b25f-d75d52980747",
      "name": "Code: Price Diff & Filter",
      "type": "n8n-nodes-base.code",
      "position": [
        2608,
        -160
      ]
    }
  ],
  "connections": {
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Config: Alert Parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Discard Error Item": {
      "main": [
        [
          {
            "node": "Loop Monitor Each Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If: Alerts to Send?": {
      "main": [
        [
          {
            "node": "Split Alerts for Notification",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If: History Exists?": {
      "main": [
        [
          {
            "node": "Code: Price Diff & Filter",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update row in sheet": {
      "main": [
        [
          {
            "node": "Loop Monitor Each Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop Monitor Each Plan": {
      "main": [
        [],
        [
          {
            "node": "Decodo: Fetch Full HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI Agent: Extract Plans": {
      "main": [
        [
          {
            "node": "If: Price Parsed Successfully?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code: Filter HTML Noise": {
      "main": [
        [
          {
            "node": "AI Agent: Extract Plans",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Decodo: Fetch Full HTML": {
      "main": [
        [
          {
            "node": "Code: Filter HTML Noise",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Config: Alert Parameters": {
      "main": [
        [
          {
            "node": "Sheets: Get Competitor List",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Google Gemini Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "AI Agent: Extract Plans",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Structured Output Parser": {
      "ai_outputParser": [
        [
          {
            "node": "AI Agent: Extract Plans",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "Code: Price Diff & Filter": {
      "main": [
        [
          {
            "node": "If: Alerts to Send?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Competitor Price Alert": {
      "main": [
        [
          {
            "node": "Update row in sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sheets: Get Competitor List": {
      "main": [
        [
          {
            "node": "Loop Monitor Each Plan",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Start Workflow (Manual Run)": {
      "main": [
        [
          {
            "node": "Config: Alert Parameters",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Alerts for Notification": {
      "main": [
        [
          {
            "node": "Send Competitor Price Alert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If: Price Parsed Successfully?": {
      "main": [
        [
          {
            "node": "If: History Exists?",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Discard Error Item",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}