AutomationFlowsWeb Scraping › Notify on Discord About New Epic Games Free Game Releases

Notify on Discord About New Epic Games Free Game Releases

ByPawel @labm0nkey on n8n.io

Very straightforward workflow. It checks the Epic Games website if the HTML container with free games has changed. If it did then it will send a notification to Discord with a list of embeds containing those games. You will need to install community node

Cron / scheduled trigger★★★★☆ complexity26 nodesDiscordN8N Nodes PuppeteerHTTP Request
Web Scraping Trigger: Cron / scheduled Nodes: 26 Complexity: ★★★★☆ Added:
Notify on Discord About New Epic Games Free Game Releases — n8n workflow card showing Discord, N8N Nodes Puppeteer, HTTP Request integration

This workflow corresponds to n8n.io template #4701 — 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
{
  "id": "nWdRPgjTA0iQLiSE",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "name": "Epic Games New Free Games",
  "tags": [],
  "nodes": [
    {
      "id": "30e06e62-9844-4844-b9ba-08c2759729cf",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -600,
        75
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 19
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "896f4f15-0317-4db2-984c-01bcc0402f3e",
      "name": "Extract offers",
      "type": "n8n-nodes-base.html",
      "position": [
        60,
        0
      ],
      "parameters": {
        "options": {},
        "operation": "extractHtmlContent",
        "dataPropertyName": "body",
        "extractionValues": {
          "values": [
            {
              "key": "container",
              "cssSelector": "[data-component*=\"OfferCard\"]:not([data-component=\"DiscoverOfferCard\"])",
              "returnArray": true,
              "returnValue": "html"
            }
          ]
        }
      },
      "retryOnFail": false,
      "typeVersion": 1.2
    },
    {
      "id": "3969b8a5-24d9-49cd-9c0a-a8ad3d49cbd6",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        500,
        -100
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "container"
      },
      "typeVersion": 1
    },
    {
      "id": "3cccc820-230b-48b3-ba3e-b5d7c1620959",
      "name": "Extract label",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        0
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "c46e46d9-2e32-434b-bec1-53e7cff18f8c",
              "name": "label",
              "type": "string",
              "value": "={{ $json.container.includes(\"Free Now\") ? \"Free Now\" : $json.container.includes(\"Coming Soon\") ? \"Coming Soon\" : $json.container.includes(\"Mystery\") ? \"Mystery\" : \"\"}}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ac99f6b6-b43d-49f2-9543-1c83a0abd4e5",
      "name": "Prepare data",
      "type": "n8n-nodes-base.merge",
      "position": [
        940,
        -100
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.1
    },
    {
      "id": "6e134e7b-87e9-416b-96fd-d7c35a896be6",
      "name": "Check if changed",
      "type": "n8n-nodes-base.code",
      "position": [
        1160,
        -25
      ],
      "parameters": {
        "jsCode": "const nodeStaticData = $getWorkflowStaticData('node');\n\nlet lastHash = $input.all().map(item => item.json.title + item.json.label).join(',');\n\nif (nodeStaticData.lastHash == undefined || nodeStaticData.lastHash !== lastHash) {\n  nodeStaticData.lastHash = lastHash;\n  return {json: {value: true, hash: lastHash}};\n}\n\nreturn {json: {value: false}};"
      },
      "typeVersion": 2
    },
    {
      "id": "6e8c112d-4c58-4c92-bc6b-0504ec55340f",
      "name": "Only when changed",
      "type": "n8n-nodes-base.filter",
      "position": [
        1380,
        -25
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "cac341c8-c4ee-4afa-b060-26a334c96826",
              "operator": {
                "type": "boolean",
                "operation": "equals"
              },
              "leftValue": "={{ $json.value }}",
              "rightValue": true
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "513afa47-30ef-41d4-bc4e-1e2338464d89",
      "name": "Success",
      "type": "n8n-nodes-base.merge",
      "position": [
        2260,
        -100
      ],
      "parameters": {
        "mode": "chooseBranch",
        "useDataOfInput": 2
      },
      "typeVersion": 3.1
    },
    {
      "id": "29137c18-edaa-4f85-b693-6a52a15084bb",
      "name": "Save Static Data",
      "type": "n8n-nodes-base.code",
      "position": [
        2480,
        -100
      ],
      "parameters": {
        "jsCode": "const nodeStaticData = $getWorkflowStaticData('node');\n\nnodeStaticData.lastHash = $input.first().json.hash;\n\nreturn {json: {\"status\" : \"success\"}}"
      },
      "typeVersion": 2
    },
    {
      "id": "94960f95-1f2e-44f5-8493-4c4f8a37238e",
      "name": "Set Retries",
      "type": "n8n-nodes-base.set",
      "position": [
        -380,
        75
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "6726de8b-7ecf-4c8d-b34b-6f176e5c8a4e",
              "name": "retries",
              "type": "number",
              "value": "={{ $json.retries || 0 }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "799a04ba-d271-4826-8d69-e3c72eaad802",
      "name": "Wait between requests",
      "type": "n8n-nodes-base.wait",
      "position": [
        500,
        200
      ],
      "parameters": {
        "amount": 10
      },
      "typeVersion": 1.1
    },
    {
      "id": "47b3078c-6ef1-44d9-9814-e633ce4cce20",
      "name": "Update Retries",
      "type": "n8n-nodes-base.set",
      "position": [
        720,
        200
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "01641325-e7ff-4125-9c06-b3b39df38a56",
              "name": "retries",
              "type": "number",
              "value": "={{ $('Set Retries').item.json.retries + 1 }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "d14bbbf8-6120-47c2-bb14-9869a941fa6b",
      "name": "If has Results",
      "type": "n8n-nodes-base.if",
      "position": [
        280,
        0
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "5998baa9-a870-4fab-8fc3-53815165b5c0",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.container }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "f06ae481-bcd8-4886-a47e-f088cb60e03b",
      "name": "Wait for conditions",
      "type": "n8n-nodes-base.merge",
      "position": [
        1600,
        -175
      ],
      "parameters": {
        "mode": "chooseBranch"
      },
      "typeVersion": 3.1
    },
    {
      "id": "0ad18534-0be9-4f48-9b95-3bee8ce05ce2",
      "name": "Notify on error",
      "type": "n8n-nodes-base.discord",
      "position": [
        1160,
        275
      ],
      "parameters": {
        "content": "Failed to check Epic Games for new content",
        "options": {},
        "authentication": "webhook"
      },
      "typeVersion": 2
    },
    {
      "id": "e1c45b2a-064a-4c2e-a381-bf7133377fe8",
      "name": "GET Epic Games Free Games page",
      "type": "n8n-nodes-puppeteer.puppeteer",
      "position": [
        -160,
        0
      ],
      "parameters": {
        "url": "https://store.epicgames.com/en-US/free-games",
        "options": {
          "browserWSEndpoint": "ws://n8n-chrome:3000/?stealth=1&--disable-web-security=true&token=Problem-Crook4-Barstool"
        }
      },
      "retryOnFail": true,
      "typeVersion": 1
    },
    {
      "id": "67b0c1e5-84ac-4554-9464-4db3ac1f9e2e",
      "name": "If Has Retries",
      "type": "n8n-nodes-base.if",
      "position": [
        940,
        275
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e6664c60-c2bb-4007-beba-ce4113a97b0b",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $('Set Retries').item.json.retries }}",
              "rightValue": 5
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "4ff1896d-d301-4b42-a451-ccb53bdfc291",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -240,
        -200
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 360,
        "content": "For some reason sometimes this can return whole page properly but the container with free games is empty. So we repeat few times.\n\nRequires `n8n-nodes-puppeteer` to be installed. Otherwise you get blocked by Cloudflare."
      },
      "typeVersion": 1
    },
    {
      "id": "c101d3d3-496e-45f8-97d1-4a52c6ecc4a8",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2000,
        -240
      ],
      "parameters": {
        "color": 5,
        "width": 180,
        "height": 240,
        "content": "This can sometimes fail so it will repeat few times."
      },
      "typeVersion": 1
    },
    {
      "id": "20c9b254-7f61-4faf-9bfb-b9caca65d128",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        2220,
        -180
      ],
      "parameters": {
        "color": 5,
        "width": 180,
        "height": 240,
        "content": "Save only when we are sure user got notification."
      },
      "typeVersion": 1
    },
    {
      "id": "a399a170-2e5d-45f5-b1ab-49e56c9d0561",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1120,
        -125
      ],
      "parameters": {
        "color": 5,
        "width": 180,
        "height": 260,
        "content": "Keeps a 'hash' of changes so that it knows if anything changed between executions."
      },
      "typeVersion": 1
    },
    {
      "id": "63d94fcd-88ec-4c22-b503-286495bf353f",
      "name": "Extract title and image",
      "type": "n8n-nodes-base.html",
      "position": [
        720,
        -200
      ],
      "parameters": {
        "options": {
          "trimValues": true
        },
        "operation": "extractHtmlContent",
        "dataPropertyName": "container",
        "extractionValues": {
          "values": [
            {
              "key": "title",
              "cssSelector": "h6"
            },
            {
              "key": "image",
              "attribute": "data-image",
              "cssSelector": "img",
              "returnValue": "attribute"
            },
            {
              "key": "url",
              "attribute": "href",
              "cssSelector": "a",
              "returnValue": "attribute"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "69950114-45ea-455b-972d-73018f62cb45",
      "name": "Notify Discord",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        2040,
        -175
      ],
      "parameters": {
        "url": "https://discord.com/api/webhooks/...",
        "method": "POST",
        "options": {},
        "jsonBody": "={{ $json.body }}",
        "sendBody": true,
        "specifyBody": "json"
      },
      "retryOnFail": true,
      "typeVersion": 4.2
    },
    {
      "id": "17676c5a-12dd-4589-a554-1424f343f9f5",
      "name": "Prepare notification",
      "type": "n8n-nodes-base.code",
      "position": [
        1820,
        -175
      ],
      "parameters": {
        "jsCode": "let embeds = [];\n\nfor (const item of $input.all()) {\n  var content = {\n    \"thumbnail\": {\n      \"url\": item.json.image\n    }\n  };\n\n  if (item.json.title.length != 0) {\n    content[\"title\"] = item.json.title;\n    content[\"url\"] = \"https://store.epicgames.com\" + item.json.url,\n    content[\"description\"] = item.json.label;\n  } else {\n    content[\"title\"] = item.json.label;\n  }\n\n  embeds.push(content);\n}\n\nconst payload = {\n  username: \"Epic Games\",\n  content: \"New games detected\",\n  avatar_url: \"https://upload.wikimedia.org/wikipedia/commons/thumb/3/31/Epic_Games_logo.svg/250px-Epic_Games_logo.svg.png\",\n  embeds: embeds\n};\n\nreturn [{json: {body: payload}}];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "aefedb1f-cc94-4db7-a606-5d419e07e9da",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        35,
        -200
      ],
      "parameters": {
        "color": 5,
        "width": 150,
        "height": 360,
        "content": "If the workflow does not work this is most likely the point of failure. It means that they have changed something on their page and css selector has changed."
      },
      "typeVersion": 1
    },
    {
      "id": "9cc64931-29ba-40e7-adf6-43507420c4c3",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1950,
        -615
      ],
      "parameters": {
        "color": 7,
        "width": 280,
        "height": 600,
        "content": "The notification on Discord consists of Embeds. \nThe Template looks like this:\n\n### Epic Games\nNew games detected\n```\n ______________________\n| GAME 1     [ IMAGE ] |\n| Free Now   [       ] |\n|______________________|\n ______________________\n| GAME 2     [ IMAGE ] |\n| Free Now   [       ] |\n|______________________|\n ______________________\n| GAME 3     [ IMAGE ] |\n| Coming Soon[       ] |\n|______________________|\n```"
      },
      "typeVersion": 1
    }
  ],
  "active": true,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "87486a5e-7a16-4d25-ad90-72b2452bc99d",
  "connections": {
    "Success": {
      "main": [
        [
          {
            "node": "Save Static Data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Extract title and image",
            "type": "main",
            "index": 0
          },
          {
            "node": "Extract label",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Retries": {
      "main": [
        [
          {
            "node": "GET Epic Games Free Games page",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare data": {
      "main": [
        [
          {
            "node": "Check if changed",
            "type": "main",
            "index": 0
          },
          {
            "node": "Wait for conditions",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract label": {
      "main": [
        [
          {
            "node": "Prepare data",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Extract offers": {
      "main": [
        [
          {
            "node": "If has Results",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If Has Retries": {
      "main": [
        [
          {
            "node": "Set Retries",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Notify on error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If has Results": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Wait between requests",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify Discord": {
      "main": [
        [
          {
            "node": "Success",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Retries": {
      "main": [
        [
          {
            "node": "If Has Retries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Notify on error": {
      "main": [
        []
      ]
    },
    "Check if changed": {
      "main": [
        [
          {
            "node": "Only when changed",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "Set Retries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Only when changed": {
      "main": [
        [
          {
            "node": "Wait for conditions",
            "type": "main",
            "index": 1
          },
          {
            "node": "Success",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Wait for conditions": {
      "main": [
        [
          {
            "node": "Prepare notification",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Prepare notification": {
      "main": [
        [
          {
            "node": "Notify Discord",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait between requests": {
      "main": [
        [
          {
            "node": "Update Retries",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extract title and image": {
      "main": [
        [
          {
            "node": "Prepare data",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "GET Epic Games Free Games page": {
      "main": [
        [
          {
            "node": "Extract offers",
            "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

Very straightforward workflow. It checks the Epic Games website if the HTML container with free games has changed. If it did then it will send a notification to Discord with a list of embeds containing those games. You will need to install community node

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

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

> Watch the full Youtube Video Tutorial [](https://youtu.be/Y-wUr2-UYZk)

Data Table, HTTP Request, Google Sheets +1
Web Scraping

This workflow automatically scrapes business leads from Google Maps on a daily schedule and ensures only high-quality, unique leads are processed. New businesses are cleaned, validated, and deduplicat

Google Sheets, Gmail, HTTP Request
Web Scraping

Women creators, homemakers-turned-entrepreneurs, and feminine lifestyle brands who want a graceful, low-lift way to keep an eye on competitor content and spark weekly ideas.

HTTP Request, Google Sheets, Email Send +1
Web Scraping

This workflow automatically searches YouTube Data API for videos related to specific keywords, extracts channel data, filters channels based on performance metrics, and saves the results into Google S

Google Sheets, @Apify/N8N Nodes Apify, HTTP Request
Web Scraping

Marketing agencies, sales teams, lead generation specialists, and business development professionals who need to build comprehensive business databases with contact information for outreach campaigns

Google Sheets, HTTP Request