{
  "name": "Competitor price monitoring with web scraping,Google Sheets & Telegram",
  "nodes": [
    {
      "id": "780a213c-0e81-4d95-910e-a467f316ebf6",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2460,
        160
      ],
      "parameters": {
        "width": 420,
        "height": 100,
        "content": "**Fires every morning at 8:00 AM server time to kick off the price-check cycle). Then it Reads the “master” Google Sheet tab, pulling each row’s product_url + last_price for processing**"
      }
    },
    {
      "id": "9b9932ec-8cfd-4096-965b-592b13a1fb8e",
      "name": "Daily 8 AM Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -2420,
        290
      ]
    },
    {
      "id": "6427045b-8b73-42f0-9dcc-768cbfac9c4a",
      "name": "Fetch Product List from Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -2200,
        290
      ]
    },
    {
      "id": "0b4a1398-bb29-4f42-9475-eb08ab4dabfc",
      "name": "Process Each Product in Batches of 1",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -1980,
        290
      ]
    },
    {
      "id": "ccf9f9ca-b380-457e-9fc2-c6ffe1636984",
      "name": "Pause Between Requests",
      "type": "n8n-nodes-base.wait",
      "position": [
        -1760,
        40
      ]
    },
    {
      "id": "aa49653b-cf9f-449b-953d-a9a19ac74187",
      "name": "Load Product Page HTML",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1540,
        40
      ]
    },
    {
      "id": "5dbc3d45-96d6-4b71-8d3f-2513f960e265",
      "name": "Extract Current Price from HTML",
      "type": "n8n-nodes-base.html",
      "position": [
        -1320,
        40
      ]
    },
    {
      "id": "76ad9683-bae1-4f95-af09-44598d9448d1",
      "name": "Normalize Price Values",
      "type": "n8n-nodes-base.code",
      "position": [
        -1100,
        40
      ]
    },
    {
      "id": "5feae925-0642-40d1-89be-c220a5a1c8a2",
      "name": "Compute Price Change",
      "type": "n8n-nodes-base.code",
      "position": [
        -880,
        40
      ]
    },
    {
      "id": "5dea2082-d5c5-4c13-8c71-ab7ac498632d",
      "name": "Clean Up Parsed Fields",
      "type": "n8n-nodes-base.code",
      "position": [
        -660,
        40
      ]
    },
    {
      "id": "21c27cb9-c6bc-4cc3-9ad1-3d37fc6fbc3d",
      "name": "Is Price Changed?",
      "type": "n8n-nodes-base.if",
      "position": [
        -440,
        40
      ]
    },
    {
      "id": "50274daa-48c7-4c58-aaf5-264013582f97",
      "name": "Build Telegram Alert Message",
      "type": "n8n-nodes-base.code",
      "position": [
        -220,
        140
      ]
    },
    {
      "id": "f62b1f32-fe79-43c3-ad17-0ff31fcdc489",
      "name": "Log Price History to Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -220,
        -60
      ]
    },
    {
      "id": "d5555b69-d7ee-4ab0-a851-5288de0d39cf",
      "name": "Pause Before Updating Sheet",
      "type": "n8n-nodes-base.wait",
      "position": [
        0,
        -60
      ]
    },
    {
      "id": "ade41bb7-fbe3-4e08-a7fa-6c85291dc9fa",
      "name": "Update Last Price in Master Sheet",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        220,
        -60
      ]
    },
    {
      "id": "9ebdbe49-fda1-42f5-99d9-a5e1e3ab800f",
      "name": "Send Price Alert via Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        0,
        215
      ]
    },
    {
      "id": "dcb4eff8-9d44-4016-a89a-787be943d0e9",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2040,
        440
      ],
      "parameters": {
        "width": null,
        "height": 100,
        "content": "**Iterates through all products in groups (e.g., 1 at a time) so we don’t overwhelm the target site with parallel requests.**"
      }
    },
    {
      "id": "1a306c68-e652-4d63-b11e-96366c4a59ed",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1560,
        -60
      ],
      "parameters": {
        "width": 360,
        "height": 80,
        "content": "**fires an HTTP GET for each product_url, then uses a CSS selector to pull the live price text from the returned HTML.**"
      }
    },
    {
      "id": "81f8701a-219f-43a3-aceb-78f2298273cc",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1120,
        180
      ],
      "parameters": {
        "width": 380,
        "height": 100,
        "content": "**Strips currency symbols/commas to convert strings into numbers; compares last_price vs. current_price to calculate % change and set price_changed=true if different**"
      }
    },
    {
      "id": "7fd2108e-5fcb-4ba6-938b-6c940f8a305f",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -740,
        -100
      ],
      "parameters": {
        "width": 220,
        "height": 120,
        "content": "\n**Removes stray whitespace or malformed keys (e.g., stray tabs) so downstream nodes can read fields consistently**"
      }
    },
    {
      "id": "7a525b63-e871-46b9-b0b0-4e25a6c7f2bb",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -540,
        180
      ],
      "parameters": {
        "width": null,
        "height": 100,
        "content": "**Only products with price_changed=true proceed to alerting and logging; unchanged items exit here.**"
      }
    },
    {
      "id": "a6352172-9fa3-47b7-8bf0-c948fbe03701",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -180,
        420
      ],
      "parameters": {
        "width": 380,
        "height": 80,
        "content": "\n**Formats a human‐readable message (product name/URL, old vs. new price, % change, timestamp) and pushes it to the configured Telegram chat**\n"
      }
    },
    {
      "id": "90b702f6-6e75-452d-9315-3f70c4157aab",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -200,
        -160
      ],
      "parameters": {
        "width": 520,
        "height": 80,
        "content": "\n**Appends a row to Price_History with timestamp, % change, old vs. new price; then waits 1 minute before overwriting last_price in the master sheet with current_price.**\n"
      }
    },
    {
      "id": "3e3a4498-248d-408e-903b-916a035db039",
      "name": "Sticky Note9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1300,
        -520
      ],
      "parameters": {
        "width": 580,
        "height": null,
        "content": "## Detailed Explanations of this automation\n \nYou can see the detailed step-by-step instructions here:\n\n- [Free n8n Web Scraping Competitor Price Tracking](https://www.blog.datahut.co/post/free-n8n-we"
      }
    }
  ],
  "connections": {
    "Is Price Changed?": {
      "main": [
        [
          {
            "node": "Build Telegram Alert Message",
            "type": "main",
            "index": 0
          },
          {
            "node": "Log Price History to Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Daily 8 AM Trigger": {
      "main": [
        [
          {
            "node": "Fetch Product List from Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Compute Price Change": {
      "main": [
        [
          {
            "node": "Clean Up Parsed Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Clean Up Parsed Fields": {
      "main": [
        [
          {
            "node": "Is Price Changed?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Load Product Page HTML": {
      "main": [
        [
          {
            "node": "Extract Current Price from HTML",
            "type": "main",
            "index": 0
          },
          {
            "node": "Process Each Product in Batches of 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Normalize Price Values": {
      "main": [
        [
          {
            "node": "Compute Price Change",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pause Between Requests": {
      "main": [
        [
          {
            "node": "Load Product Page HTML",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Log Price History to Sheet": {
      "main": [
        [
          {
            "node": "Pause Before Updating Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Pause Before Updating Sheet": {
      "main": [
        [
          {
            "node": "Update Last Price in Master Sheet",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Build Telegram Alert Message": {
      "main": [
        [
          {
            "node": "Send Price Alert via Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Fetch Product List from Sheet": {
      "main": [
        [
          {
            "node": "Process Each Product in Batches of 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send Price Alert via Telegram": {
      "main": [
        [
          {
            "node": "Process Each Product in Batches of 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract Current Price from HTML": {
      "main": [
        [
          {
            "node": "Normalize Price Values",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Process Each Product in Batches of 1": {
      "main": [
        [],
        [
          {
            "node": "Pause Between Requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}