AutomationFlowsEmail & Gmail › Monitor Multiple URLs with Downtime Alerts

Monitor Multiple URLs with Downtime Alerts

Original n8n title: Automatic Monitoring of Multiple Urls with Downtime Alerts

ByOriol Seguí @oxsr11 on n8n.io

This n8n workflow allows you to automatically monitor the status of multiple URLs in a simple and efficient way. You just need to enter the URLs you want to scan and run the workflow (either manually or scheduled). For each URL, an availability check is performed. The results…

Cron / scheduled trigger★★★★☆ complexity18 nodesGoogle SheetsGmailHTTP Request
Email & Gmail Trigger: Cron / scheduled Nodes: 18 Complexity: ★★★★☆ Added:

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

This workflow follows the Gmail → Google Sheets 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": "2744df51-ca51-4c01-9a49-b29c5b27f7bf",
      "name": "Schedule Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        0,
        200
      ],
      "parameters": {
        "rule": {
          "interval": [
            {}
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "cae73f18-028e-4cb5-aee2-a18768c5367e",
      "name": "Split Out",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        480,
        100
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "urls"
      },
      "typeVersion": 1
    },
    {
      "id": "398d41cf-c555-44d7-bf08-2732a47a18e7",
      "name": "URLs",
      "type": "n8n-nodes-base.set",
      "position": [
        260,
        100
      ],
      "parameters": {
        "mode": "raw",
        "options": {},
        "jsonOutput": "{\n  \"urls\": {\n    \"URL 2\": \"https://example.com\",\n    \"URL 1\": \"https://google.es\",\n    \"URL 4\": \"https://github.com\",\n    \"URL 3\": \"https://n8n.io\",\n    \"URL 5\": \"https://n8niouou.io\",\n    \"URL 6\": \"https://n8niopuou.io\"\n  }\n}"
      },
      "typeVersion": 3.4
    },
    {
      "id": "876e4ca3-c607-4443-a4ec-cb83fe84e6c3",
      "name": "Success",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1220,
        260
      ],
      "parameters": {
        "columns": {
          "value": {
            "Caida": "=",
            "Funcional": "=Funciona: {{ $('Split Out').item.json.urls }}"
          },
          "schema": [
            {
              "id": "Funcional",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Funcional",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Caida",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Caida",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920/edit#gid=0",
          "cachedResultName": "Hoja 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920/edit?usp=drivesdk",
          "cachedResultName": "Prova2"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "c99e1ec7-0b11-4278-8f97-d6b9cef798cd",
      "name": "Error",
      "type": "n8n-nodes-base.googleSheets",
      "position": [
        1220,
        460
      ],
      "parameters": {
        "columns": {
          "value": {
            "Caida": "=Caida: {{ $json.urls }}"
          },
          "schema": [
            {
              "id": "Funcional",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Funcional",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Caida",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "Caida",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920/edit#gid=0",
          "cachedResultName": "Hoja 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/13EHjUGc0wHYbBYZFPqlGuSE1pnttvokU1y3gJCWz920/edit?usp=drivesdk",
          "cachedResultName": "Prova2"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "9aeec8f1-1498-4381-bfab-a76c8e40a862",
      "name": "Total",
      "type": "n8n-nodes-base.summarize",
      "position": [
        960,
        20
      ],
      "parameters": {
        "options": {},
        "fieldsToSummarize": {
          "values": [
            {
              "field": "Caida"
            },
            {
              "field": "Funcional"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "01fd1dbc-ca4c-4a94-abbc-e1d67a7dd775",
      "name": "Bucle URLs",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        700,
        100
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "760cea59-8d84-4abf-b91a-c277ca122420",
      "name": "Run trigger",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        0,
        0
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "1ec7a4ea-e929-4f50-b4b8-4732b9e439ed",
      "name": "Send a message",
      "type": "n8n-nodes-base.gmail",
      "position": [
        1560,
        20
      ],
      "parameters": {
        "sendTo": "user@example.com",
        "message": "=Te informamos que actualmente estos URLs se encuentran ca\u00eddos: \n\n{{ $json.url }}\n\n\nCa\u00eddos: {{ $('Total').item.json.count_Caida }}\n\nFuncionales: {{ $('Total').item.json.count_Funcional }}",
        "options": {},
        "subject": "Webs ca\u00eddas"
      },
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.1
    },
    {
      "id": "e6ca120c-21e0-42c5-b3d0-c8e447e09386",
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        1160,
        20
      ],
      "parameters": {
        "jsCode": "// 1) Traemos TODOS los \u00edtems que gener\u00f3 el nodo \"Bucle URLs\"\nconst items = $items('Bucle URLs');   // respeta exactamente el nombre del nodo\n\n// 2) Extraemos la propiedad Caida y descartamos vac\u00edos\nconst caidaUrls = items\n  .map(it => it.json.Caida)               \n  .filter(url => typeof url === 'string' && url.trim().length);\n\nif (caidaUrls.length === 0) {\n  throw new Error('No se encontraron URLs en la propiedad \"Caida\".');\n}\n\nreturn caidaUrls.map(url => ({ json: { url } }));\n\n/*  Si prefieres un \u00daNICO item con el array completo, comenta la l\u00ednea anterior\n    y descomenta esto:\nreturn [\n  { json: { caidaUrls } },     // { \"caidaUrls\": [\"https://n8niouou.io\", \"https://n8niopuou.io\"] }\n];\n*/\n"
      },
      "typeVersion": 2
    },
    {
      "id": "d5fb83e9-689f-44f3-a02a-32ff511c9ee0",
      "name": "Split Out2",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        1360,
        20
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "url"
      },
      "typeVersion": 1
    },
    {
      "id": "464a16ea-17f0-4757-b491-1b331395cd14",
      "name": "Request",
      "type": "n8n-nodes-base.httpRequest",
      "onError": "continueErrorOutput",
      "position": [
        960,
        220
      ],
      "parameters": {
        "url": "={{ $json.urls }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "5df0c197-037d-46da-bc4b-fd7ed514bbe5",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        320
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "content": "## How it works (P1)\nBefore the loop, you enter the URLs to scan in the \"URLs\" stream, then start the trigger either manually or scheduled."
      },
      "typeVersion": 1
    },
    {
      "id": "8e2d7f73-8731-4b35-8fb0-10d68978a671",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        500
      ],
      "parameters": {
        "color": 5,
        "width": 260,
        "height": 180,
        "content": "## C\u00f3mo funciona (P1)\n\nAntes del bucle, se introducen las URL que se escanear\u00e1n en el flujo \"URL\" y, a continuaci\u00f3n, se inicia el disparador, ya sea de forma manual o programada."
      },
      "typeVersion": 1
    },
    {
      "id": "4367f7ee-0b74-476b-84b4-202bc3d909e7",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        240
      ],
      "parameters": {
        "width": 260,
        "height": 180,
        "content": "## How it works (P2)\nStart a loop for each URL entered, adding the status to a Google Sheet, then collect the status of each URL, filter out the crashes, and send an email with the crashes."
      },
      "typeVersion": 1
    },
    {
      "id": "466863c5-a256-499c-b457-4651de2bb8fc",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1440,
        460
      ],
      "parameters": {
        "width": 260,
        "height": 180,
        "content": "## C\u00f3mo funciona (P2)\nInicia un bucle por cada URL introducida, agregando el estado en google sheet, luego recoge el estado de cada URL, filtra las ca\u00eddas y env\u00eda un email con las ca\u00eddas."
      },
      "typeVersion": 1
    },
    {
      "id": "4cb90ac4-9808-413a-8fb0-c7ed0db631bb",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        220,
        40
      ],
      "parameters": {
        "color": 5,
        "width": 180,
        "height": 220,
        "content": "### Enter URLs to scan here"
      },
      "typeVersion": 1
    },
    {
      "id": "040739ca-50d8-4d77-bf3a-c7406bd60410",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -40,
        -120
      ],
      "parameters": {
        "color": 5,
        "width": 180,
        "height": 480,
        "content": "### As a trigger you could also implement webhook or MCP"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Split Out2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "URLs": {
      "main": [
        [
          {
            "node": "Split Out",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Error": {
      "main": [
        [
          {
            "node": "Bucle URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Total": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Request": {
      "main": [
        [
          {
            "node": "Success",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Error",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Success": {
      "main": [
        [
          {
            "node": "Bucle URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out": {
      "main": [
        [
          {
            "node": "Bucle URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Bucle URLs": {
      "main": [
        [
          {
            "node": "Total",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Request",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out2": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run trigger": {
      "main": [
        [
          {
            "node": "URLs",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        []
      ]
    },
    "Schedule Trigger": {
      "main": [
        [
          {
            "node": "URLs",
            "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 n8n workflow allows you to automatically monitor the status of multiple URLs in a simple and efficient way. You just need to enter the URLs you want to scan and run the workflow (either manually or scheduled). For each URL, an availability check is performed. The results…

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

More Email & Gmail workflows → · Browse all categories →

Related workflows

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

Email & Gmail

YOUR_ID 4. Uses gmail, googleDrive, googleSheets, httpRequest. Scheduled trigger; 53 nodes.

Gmail, Google Drive, Google Sheets +1
Email & Gmail

Looking for a way to track GitHub bounty issues automatically and get notified in real time? This GitHub Bounty Tracker workflow monitors repositories for issues labeled 💎 Bounty, logs them in Google

Google Sheets, HTTP Request, WhatsApp +1
Email & Gmail

This workflow automatically sends a beautifully designed HTML newsletter every Sunday at 8 AM, featuring products currently on sale from your Algolia-powered e-commerce store.

Google Sheets, HTTP Request, Gmail
Email & Gmail

This n8n template demonstrates how to build a Auto Lead Gen & Outreach System for Local Businesses specifically designed to help businesses that don’t have a website yet.

Google Sheets, HTTP Request, Google Drive +1
Email & Gmail

I created this workflow with care for marketing professionals and agencies who manage multiple Meta Ads (Facebook) accounts and want to track ad account balances automatically — no more logging in eve

HTTP Request, Google Sheets, Gmail