AutomationFlowsSlack & Telegram › Competitor Price Monitoring with Web Scraping, Google Sheets & Discord Alerts

Competitor Price Monitoring with Web Scraping, Google Sheets & Discord Alerts

Bymoosa @moosa on n8n.io

This workflow monitors product prices from BooksToScrape and sends alerts to a Discord channel via webhook when competitor's prices are lower than our prices. Schedule (for daily or required schedule) If nodes (to check if checked or unchecked data exists) HTTP Request (for…

Cron / scheduled trigger★★★★☆ complexity21 nodesDiscordGoogle SheetsHTTP Request
Slack & Telegram Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ Added:

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

This workflow follows the Discord → HTTP Request recipe pattern — see all workflows that pair these two integrations.

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": "646a8d10-7ded-4f80-aa17-86c53bddbc43",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -680,
        140
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "c5199922-2c7e-4752-b016-b9c7715f6ed1",
      "name": "Discord1",
      "type": "n8n-nodes-base.discord",
      "position": [
        560,
        180
      ],
      "parameters": {
        "content": "Price checks complete.",
        "options": {},
        "authentication": "webhook"
      },
      "credentials": {
        "discordWebhookApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "e21bf2ed-e964-479e-9097-3b35d834d9ee",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        780,
        380
      ],
      "parameters": {
        "width": 660,
        "height": 380,
        "content": "## setting checked column to \"0\" for next day checks"
      },
      "typeVersion": 1
    },
    {
      "id": "f5dbaff2-5cdc-474c-8f6e-0ec299730a0f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        500,
        120
      ],
      "parameters": {
        "color": 4,
        "width": 200,
        "height": 200,
        "content": "price checks completed message to discord"
      },
      "typeVersion": 1
    },
    {
      "id": "b5d5c422-af74-408a-b060-3e5bf8c6578d",
      "name": "get unchecked row",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        -300,
        140
      ],
      "parameters": {
        "options": {
          "returnFirstMatch": true
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "0",
              "lookupColumn": "checked"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit?usp=drivesdk",
          "cachedResultName": "price-check-sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6,
      "alwaysOutputData": true
    },
    {
      "id": "cee99b2f-6d63-40dc-bbfc-d98dc6bd3449",
      "name": "HTTP Request to product page",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        420,
        -105
      ],
      "parameters": {
        "url": "={{ $json['Competitor URL'] }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "0b842eec-6f2d-4c62-ab00-403164951e64",
      "name": "price extract from page",
      "type": "n8n-nodes-base.html",
      "position": [
        640,
        -105
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "extractionValues": {
          "values": [
            {
              "key": "price",
              "cssSelector": ".price_color"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cce7d4e7-98a5-4c70-b90f-007ee6402e94",
      "name": "Code to convert price into number",
      "type": "n8n-nodes-base.code",
      "position": [
        860,
        -105
      ],
      "parameters": {
        "jsCode": "const priceStr = $input.first().json.price\nconst priceNumber = parseFloat(priceStr.replace(\"\u00a3\", \"\").trim());\n\nreturn [{ json: { price: priceNumber } }];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "f74511f8-a89b-44ab-be06-74bc6522cec5",
      "name": "price greater than ours?",
      "type": "n8n-nodes-base.if",
      "position": [
        1080,
        -105
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "37f18553-eb25-4f11-9803-73db6f67091c",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $json.price }}",
              "rightValue": "={{ $('get unchecked row').item.json['my Price'] }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "d597ca2e-2e41-45c0-a8da-b1285bde2cd6",
      "name": "Discord price alert",
      "type": "n8n-nodes-base.discord",
      "position": [
        1300,
        -180
      ],
      "parameters": {
        "content": "=competitor has decreased price on product: {{ $('get unchecked row').item.json['Product Name'] }}\n\nour price: {{ $('get unchecked row').item.json['my Price'] }}\ncompetitor's price:{{ $('Code to convert price into number').item.json.price }}",
        "options": {},
        "authentication": "webhook"
      },
      "credentials": {
        "discordWebhookApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2
    },
    {
      "id": "ded0c28b-e4d1-494a-bd6f-e2b88bb12c61",
      "name": "Update status to 1",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1520,
        95
      ],
      "parameters": {
        "columns": {
          "value": {
            "checked": "1",
            "Product Name": "={{ $('get unchecked row').item.json['Product Name'] }}",
            "competitor price": "={{ $('Code to convert price into number').item.json.price }}"
          },
          "schema": [
            {
              "id": "Product Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Product Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "my Price",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "my Price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Competitor URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Competitor URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "competitor price",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "competitor price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "checked",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "checked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Product Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit?usp=drivesdk",
          "cachedResultName": "price-check-sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "6b784dd4-681b-4e80-83ca-80dbe0e1e519",
      "name": "Get status row",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        840,
        520
      ],
      "parameters": {
        "options": {
          "returnFirstMatch": true
        },
        "filtersUI": {
          "values": [
            {
              "lookupValue": "1",
              "lookupColumn": "checked"
            }
          ]
        },
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit?usp=drivesdk",
          "cachedResultName": "price-check-sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6,
      "alwaysOutputData": true
    },
    {
      "id": "af9aea9b-5370-439f-8bf7-84159b3bb1cf",
      "name": "row returned?",
      "type": "n8n-nodes-base.if",
      "position": [
        1060,
        440
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "998fc0d0-8d33-43cb-b6e8-f9516c28b55f",
              "operator": {
                "type": "object",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "af494912-3a5a-4b78-a0c4-57a3f1be5af6",
      "name": "Update status back to 0",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1280,
        520
      ],
      "parameters": {
        "columns": {
          "value": {
            "checked": "0",
            "Product Name": "={{ $json[\"Product Name\"] }}"
          },
          "schema": [
            {
              "id": "Product Name",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Product Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "my Price",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "my Price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Competitor URL",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "Competitor URL",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "competitor price",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "competitor price",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "checked",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "checked",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Product Name"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit#gid=0",
          "cachedResultName": "Sheet1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/16-hEaIl8Tng5SB5jbpu26kT7G-g1cFM5_w2AILwT3Pc/edit?usp=drivesdk",
          "cachedResultName": "price-check-sheet"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "6c1fe1cd-56af-4c51-91b3-d5eaa9ce2948",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -820,
        40
      ],
      "parameters": {
        "width": 300,
        "height": 280,
        "content": "## start at desired schedule\n### daily in this example"
      },
      "typeVersion": 1
    },
    {
      "id": "2a156baa-d3fc-4d73-8241-d6021ddf1514",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        360,
        -220
      ],
      "parameters": {
        "width": 860,
        "height": 300,
        "content": "## get price from competitor's product page and convert into number\n"
      },
      "typeVersion": 1
    },
    {
      "id": "5e3db4b8-4bb7-477e-873c-ac77a5536ce1",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -340,
        -20
      ],
      "parameters": {
        "width": 180,
        "height": 340,
        "content": "## get un checked roe\n- ### extract name, page-url, our price"
      },
      "typeVersion": 1
    },
    {
      "id": "644a8dbc-6f7b-49cb-bc7b-96157db7a4ea",
      "name": "row exist?",
      "type": "n8n-nodes-base.if",
      "position": [
        100,
        140
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "8dd1be30-0d27-4c75-9d0b-c0db05a0fb4f",
              "operator": {
                "type": "object",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json}}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "2bae4c20-dabc-4833-9524-46308c3017b3",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1260,
        -380
      ],
      "parameters": {
        "color": 3,
        "width": 180,
        "height": 380,
        "content": "## discord alert \n- ### our price is greater than competition"
      },
      "typeVersion": 1
    },
    {
      "id": "5e289971-7536-4c4f-a508-eb8af7e63fb9",
      "name": "Sticky Note6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1480,
        -20
      ],
      "parameters": {
        "width": 260,
        "height": 260,
        "content": "## set checked to 1"
      },
      "typeVersion": 1
    },
    {
      "id": "107fdca7-f641-4237-851a-776b63f5949c",
      "name": "Sticky Note7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -100
      ],
      "parameters": {
        "width": 260,
        "height": 360,
        "content": "## if unchecked row exist?\n- ### yes? (then extracts data)\n- ### else sends message checks are done and set checks to 0 for next day checks "
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Discord1": {
      "main": [
        [
          {
            "node": "Get status row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "row exist?": {
      "main": [
        [
          {
            "node": "HTTP Request to product page",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Discord1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "row returned?": {
      "main": [
        [
          {
            "node": "Update status back to 0",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get status row": {
      "main": [
        [
          {
            "node": "row returned?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "get unchecked row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "get unchecked row": {
      "main": [
        [
          {
            "node": "row exist?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update status to 1": {
      "main": [
        [
          {
            "node": "get unchecked row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Discord price alert": {
      "main": [
        [
          {
            "node": "Update status to 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update status back to 0": {
      "main": [
        [
          {
            "node": "Get status row",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "price extract from page": {
      "main": [
        [
          {
            "node": "Code to convert price into number",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "price greater than ours?": {
      "main": [
        [
          {
            "node": "Discord price alert",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Update status to 1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "HTTP Request to product page": {
      "main": [
        [
          {
            "node": "price extract from page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code to convert price into number": {
      "main": [
        [
          {
            "node": "price greater than ours?",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

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

About this workflow

This workflow monitors product prices from BooksToScrape and sends alerts to a Discord channel via webhook when competitor's prices are lower than our prices. Schedule (for daily or required schedule) If nodes (to check if checked or unchecked data exists) HTTP Request (for…

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

More Slack & Telegram workflows → · Browse all categories →

Related workflows

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

Slack & Telegram

This workflow provides an automated, intelligent solution for global weather monitoring. It goes beyond simple data fetching by calculating a custom "Comfort Index" and using AI to provide human-like

OpenWeatherMap, HTTP Request, Discord +1
Slack & Telegram

AmazonLuna-Games-Fetch. Uses httpRequest, scheduleTrigger, googleSheets, stickyNote. Scheduled trigger; 16 nodes.

HTTP Request, Google Sheets, Discord
Slack & Telegram

Automatically fetch, organize, and maintain an updated catalog of Amazon Luna – Included with Prime games.This workflow regularly queries Amazon’s official Luna endpoint, extracts complete metadata, a

HTTP Request, Google Sheets, Discord
Slack & Telegram

AI-Powered Short-Form Video Generator with OpenAI, Flux, Kling, and ElevenLabs and upload to all social networks. Uses httpRequest, openAi, stickyNote, googleDrive. Scheduled trigger; 51 nodes.

HTTP Request, OpenAI, Google Drive +4
Slack & Telegram

AI Automated TikTok/Youtube Shorts/Reels Generator. Uses httpRequest, openAi, stickyNote, googleDrive. Scheduled trigger; 41 nodes.

HTTP Request, OpenAI, Google Drive +2