AutomationFlowsSlack & Telegram › Send End-of-life Software Alerts Using Nocodb, Endoflife.date, and Slack

Send End-of-life Software Alerts Using Nocodb, Endoflife.date, and Slack

ByŁukasz @lukaszpp on n8n.io

This workflow is an automated system that tracks End-of-Life (EOL) dates for software and technologies used across your projects. It eliminates the need to manually monitor EOL dates in spreadsheets or calendars by automatically fetching the latest EOL information and sending…

Cron / scheduled trigger★★★★★ complexity36 nodesHTTP RequestNoco DbSlack
Slack & Telegram Trigger: Cron / scheduled Nodes: 36 Complexity: ★★★★★ Added:

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

This workflow follows the HTTP Request → Slack 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": "ec0bd9d6-b85a-4cf9-aacc-c539eb1e3bdb",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        1632,
        336
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "aec41046-584c-4883-9ce5-91441cf6b906",
      "name": "Get EOL data from endoflife.date",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        32,
        96
      ],
      "parameters": {
        "url": "=https://endoflife.date/api/{{ $json.Software.toLowerCase() }}.json",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "09353e3b-d132-4a22-96bf-6cec6004fa0d",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        704,
        112
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "joinMode": "enrichInput1",
        "fieldsToMatchString": "key"
      },
      "typeVersion": 3
    },
    {
      "id": "aa429f71-984c-4f8d-92d1-75d9f2b3da13",
      "name": "Rename Keys",
      "type": "n8n-nodes-base.renameKeys",
      "position": [
        480,
        96
      ],
      "parameters": {
        "keys": {
          "key": [
            {
              "newKey": "Version",
              "currentKey": "cycle"
            },
            {
              "newKey": "Latest Subversion",
              "currentKey": "latest"
            },
            {
              "newKey": "Subversion Release",
              "currentKey": "latestReleaseDate"
            },
            {
              "newKey": "End Of Life",
              "currentKey": "eol"
            },
            {
              "newKey": "Long Term Support",
              "currentKey": "lts"
            },
            {
              "newKey": "End Of Support",
              "currentKey": "support"
            }
          ]
        },
        "additionalOptions": {}
      },
      "typeVersion": 1
    },
    {
      "id": "2f33b884-12c0-4d2f-bb3e-7bf5c58d98f7",
      "name": "Get Current Rows",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        32,
        320
      ],
      "parameters": {
        "table": "mmk9jtv13jor4jh",
        "options": {
          "fields": []
        },
        "operation": "getAll",
        "projectId": "pksfpoc943gwhvy",
        "returnAll": true,
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3,
      "alwaysOutputData": true
    },
    {
      "id": "22258dbf-ee9f-49e7-bfbe-be506d0269ce",
      "name": "Each Software Once",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -336,
        176
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "9cb4f585-0334-420e-ac82-67d32b3d6148",
      "name": "Make ID Key",
      "type": "n8n-nodes-base.set",
      "position": [
        480,
        320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "34db845e-cf0b-490f-a21d-77016359f5a5",
              "name": "Id",
              "type": "number",
              "value": "={{ $json.Id }}"
            },
            {
              "id": "d18fcb8b-116f-494a-a98e-a83a9d1eeac2",
              "name": "key",
              "type": "string",
              "value": "={{ $json.key }}"
            },
            {
              "id": "2f0ca0a0-a0d7-461b-98a6-139f78eab6f8",
              "name": "Projects",
              "type": "array",
              "value": "={{ $json[\"_nc_m2m_EOLDates With P_EOLProjects\"] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "f13b028e-6960-45eb-883d-3c8c391456e4",
      "name": "If ID exists",
      "type": "n8n-nodes-base.if",
      "position": [
        1184,
        208
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "45f0bfd2-893b-48da-b1ee-45012c8e408e",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json.Id }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "b6cb8a38-5eb6-46ec-b565-35be14d004f6",
      "name": "Insert New",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        1408,
        336
      ],
      "parameters": {
        "table": "mmk9jtv13jor4jh",
        "operation": "create",
        "projectId": "pksfpoc943gwhvy",
        "dataToSend": "autoMapInputData",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "a908bd4f-1789-436f-abdd-dece51d1dece",
      "name": "Add Key and Software",
      "type": "n8n-nodes-base.set",
      "position": [
        256,
        96
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "79514700-9336-4da8-aa5b-b41a8e75f086",
              "name": "key",
              "type": "string",
              "value": "={{ $(\"Each Software Once\").item.json.Software }}{{ $json.cycle }}"
            },
            {
              "id": "32088a9a-2699-4468-87b8-62ba6f287631",
              "name": "Software",
              "type": "string",
              "value": "={{$(\"Each Software Once\").item.json.Software }}"
            }
          ]
        },
        "includeOtherFields": true
      },
      "typeVersion": 3.4
    },
    {
      "id": "b474cca8-fd77-47b3-9526-28cfac58fdfa",
      "name": "Update Data",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        1408,
        192
      ],
      "parameters": {
        "table": "mmk9jtv13jor4jh",
        "operation": "update",
        "projectId": "pksfpoc943gwhvy",
        "dataToSend": "autoMapInputData",
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "22395c86-ee5d-4199-b3a6-9d34b8509a0b",
      "name": "Convert bool to null",
      "type": "n8n-nodes-base.code",
      "position": [
        960,
        112
      ],
      "parameters": {
        "jsCode": "for (const item of $input.all()) {\n\n  if(typeof item.json['End Of Life'] == 'boolean')\n    item.json['End Of Life'] = null;\n\n  if(typeof item.json['End Of Support'] == 'boolean')\n    item.json['End Of Support'] = null;\n  \n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "8c742698-8f44-45c7-b55b-9455549a600e",
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1152,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 624,
        "height": 528,
        "content": "## Step 4: Update EOL Dates table with newest info\nWe check if given software already has entry in the database, update it if it does, or insert new one if it doesn't. After that we wait to make sure we don't hit rate limits of endoflife.data"
      },
      "typeVersion": 1
    },
    {
      "id": "12c0ad16-2754-49e5-bdfd-1198bf346670",
      "name": "Config",
      "type": "n8n-nodes-base.set",
      "position": [
        -1104,
        176
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "e580b3f2-73ff-4eb0-85f1-3e826523d71f",
              "name": "Days before EOL",
              "type": "number",
              "value": 31
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "bbc944cb-64c3-487a-bc93-9a9383963054",
      "name": "Filter",
      "type": "n8n-nodes-base.filter",
      "position": [
        1424,
        -384
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 3,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "4cfa7ede-2a65-4763-8c9a-79e7c113d4ce",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.Past_EOL }}",
              "rightValue": ""
            },
            {
              "id": "e131b9e0-f29c-43f3-b5c7-16e6020412de",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.EOL_in_x_days }}",
              "rightValue": ""
            },
            {
              "id": "681428d6-52ee-48b4-9bf7-260a6f06b52c",
              "operator": {
                "type": "array",
                "operation": "notEmpty",
                "singleValue": true
              },
              "leftValue": "={{ $json.EOL_Today }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.3
    },
    {
      "id": "dbd64e72-8e0e-434a-9df6-5612b6ea96f2",
      "name": "Send a message",
      "type": "n8n-nodes-base.slack",
      "position": [
        1600,
        -320
      ],
      "parameters": {
        "select": "channel",
        "blocksUi": "={\n\t\"blocks\": [\n\t\t{\n\t\t\t\"type\": \"header\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"EOL Reminder for project {{ $json['Project Name'] }}\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"Warning, project *{{ $json['Project Name'] }}* has incoming EOL issues:\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"divider\"\n\t\t},\n\t\t{{ $if($json.Past_EOL.length > 0, `{\n\t\t\t\"type\": \"header\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"PAST END OF LIFE:\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},`,'') }}\n\t\t{{ $json.Past_EOL.map(i=>`\n{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"*${i.Software} ${i.Version}*\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"fields\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of life:*\\\\n ${i['End Of Life']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of support:*\\\\n ${i['End Of Support']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Subversion release:*\\\\n ${i['Subversion Release']}\"\n\t\t\t\t}\n\t\t\t]\n\t\t\t\n\t\t},\n`).join('') }}\n        {{  $if($json.Past_EOL.length > 0, `\n{\n\t\t\t\"type\": \"divider\"\n\t\t},`,'') }}\n\t\t{{ $if($json.EOL_Today.length > 0, `{\n\t\t\t\"type\": \"header\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"Due today:\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},`,'') }}\n\t\t{{ $json.EOL_Today.map(i=>`\n{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"*${i.Software} ${i.Version}*\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"fields\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of life:*\\\\n ${i['End Of Life']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of support:*\\\\n ${i['End Of Support']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Subversion release:*\\\\n ${i['Subversion Release']}\"\n\t\t\t\t}\n\t\t\t]\n\t\t\t\n\t\t},\n`).join('') }}\n{{  $if($json.EOL_Today.length > 0, `\n{\n\t\t\t\"type\": \"divider\"\n\t\t},`,'')  }}\n\t\t{{  $if($json.EOL_in_x_days.length > 0,`{\n\t\t\t\"type\": \"header\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \"Incoming EOL:\",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t},`,'')  }}\n\t\t{{ $json.EOL_in_x_days.map(i=>`\n{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\"text\": \"*${i.Software} ${i.Version}*\"\n\t\t\t}\n\t\t},\n\t\t{\n\t\t\t\"type\": \"section\",\n\t\t\t\"fields\": [\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of life:*\\\\n ${i['End Of Life']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*End of support:*\\\\n ${i['End Of Support']}\"\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\t\"type\": \"mrkdwn\",\n\t\t\t\t\t\"text\": \"*Subversion release:*\\\\n ${i['Subversion Release']}\"\n\t\t\t\t}\n\t\t\t]\n\t\t},\n`).join('') }}\n        {{  $if($json.EOL_in_x_days.length > 0, `\n{\n                    \"type\": \"divider\"\n                },`,'')\n            }}\n{\n\t\t\t\"type\": \"section\",\n\t\t\t\"text\": {\n\t\t\t\t\"type\": \"plain_text\",\n\t\t\t\t\"text\": \" \",\n\t\t\t\t\"emoji\": true\n\t\t\t}\n\t\t}\n\t]\n}",
        "channelId": {
          "__rl": true,
          "mode": "list",
          "value": "C0AM2GZ70SG",
          "cachedResultName": "eol2"
        },
        "messageType": "block",
        "otherOptions": {},
        "authentication": "oAuth2"
      },
      "credentials": {
        "slackOAuth2Api": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.4
    },
    {
      "id": "f5e7028d-c23c-4f6f-92ff-a0cce04c3d0f",
      "name": "Sticky Note1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 1136,
        "height": 528,
        "content": "## Step 3: Fetch End of life dates from endoflife.date. Merge new data with existing one\nhttps://endoflife.date offers End of life data for over 400 products. We can access this data using their free API. We rename keys to more human readable form, add some metadata and we convert dates from `false` value to `null` using [code block](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.code/). In this step we are using EOLDates Noco Table to check if we already have data regarding software, if so, we update it, if not, we add it to our database"
      },
      "typeVersion": 1
    },
    {
      "id": "56107b49-d1dc-4e9d-a6b3-6e832d90d11c",
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        0,
        -624
      ],
      "parameters": {
        "color": 7,
        "width": 1776,
        "height": 576,
        "content": "## Step 5: Loop over EOLProjects table records, check if any has EOL date comming and notify the user on the Slack channel\nWe use code block to check if we are Past EOL, is it soon or it's today. Code block allows us to do it all at once in more cohesieve and easier way than using multiple other blocks. We filter projects that are not affected (EOL date is too far into future). At the end we send a message including project name with all events properly structured to predefined Slack channel."
      },
      "typeVersion": 1
    },
    {
      "id": "87a5ca14-6177-48a8-aae8-f9e954a71339",
      "name": "Get software to check",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        -768,
        176
      ],
      "parameters": {
        "table": "mdxtflijkbf3po6",
        "options": {},
        "operation": "getAll",
        "projectId": "pksfpoc943gwhvy",
        "returnAll": true,
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 3
    },
    {
      "id": "b442bf59-5535-43bf-8d9e-8fbd899ec12c",
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -1456,
        -32
      ],
      "parameters": {
        "color": 3,
        "width": 528,
        "height": 368,
        "content": "## Fill out config\nHow many days before End of life date, End of support date, or Subversion Release should you be notified  "
      },
      "typeVersion": 1
    },
    {
      "id": "47ea36e8-fecf-445d-9300-4fa0903cf0cc",
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -912,
        -32
      ],
      "parameters": {
        "color": 7,
        "width": 896,
        "height": 368,
        "content": "## Step 1: Fetch softwares you are using from NocoDB EOLSoftware Table and feed them to into pipeline\nLoops are perfect tool if we want to process each item individaully with more than one block and retrun combined result or like in this case you want to better visually represent ongoing process.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "63ab8eca-d2cf-4894-b01a-be3fc7eaa3c1",
      "name": "Sticky Note5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2096,
        -32
      ],
      "parameters": {
        "color": 3,
        "width": 624,
        "height": 512,
        "content": "## Before you start:\nThis workflow requires 3 NocoDB Tables which can be created with single click by pressing \"Create Tables\". It will create required tables. It's important to then populate EOL Software table by hand, run workflow again manually, this time from \"Run daily\" trigger and populate EOL Projects table using values from EOLDates.\n"
      },
      "typeVersion": 1
    },
    {
      "id": "724b03ec-2caf-4ba3-afda-f81a81bde704",
      "name": "Sticky Note8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2720,
        -480
      ],
      "parameters": {
        "width": 608,
        "height": 960,
        "content": "## End of life alert\nThis workflow monitors your projects for software that is approaching or has passed its End of Life date, by fetching up-to-date data from https://endoflife.date and cross-referencing it with software versions used in each of your projects stored in NocoDB. When an issue is detected, a structured alert is sent to a designated Slack channel.\n\n### How it works\n1. Workflow fetches the list of software you track from NocoDB and queries the https://endoflife.date free API for each one. \n2. The retrieved data is normalized, stored in the EOLDates table, and kept up to date on every run. \n3. For each project in your EOLProjects table, the workflow checks whether any linked software version falls into one of three categories\n    1. Past EOL - end of life, end of support, or subversion release date has already passed\n    2. Due today - any of those dates fall on today's date\n    3. Incoming EOL - any of those dates fall within the configured threshold (default: 31 days)\n4. Projects with no issues are silently skipped. Affected projects trigger a structured Slack message listing all flagged software versions grouped by severity.\n\n### Setup\n1. Run the Create Tables trigger once to automatically provision tables to NocoDB\n2. Populate the EOLSoftware table with the names of software you want to track (names must match https://endoflife.date slugs)\n3. Trigger the workflow manually using Run daily to populate the EOLDates table\n4. Populate the EOLProjects table with your project names and link each project to the relevant software versions from EOLDates\n5. Adjust the Config node to set how many days before EOL you want to be notified\n\n### Customize\nThe Slack channel is configured directly in the Send a message node \u2014 swap it for any channel your team monitors. The three alert categories (Past EOL, Due today, Incoming EOL) and their Slack block layouts can be adjusted in that same node if you want to change the message format or add additional fields.\n\n\n\n\n\n\n\n\nNeed help? Contact us at [developers@sailingbyte.com](mailto:developers@sailingbyte.com) or on [sailingbyte.com](sailingbyte.com)!\n\nHappy hacking!"
      },
      "typeVersion": 1
    },
    {
      "id": "de227d95-4094-4545-acf5-d64c73a256a6",
      "name": "Run daily",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -1392,
        176
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 7,
              "triggerAtMinute": {}
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "9ef9587b-0043-4c9f-b670-37ee8a2c5b5b",
      "name": "Create Tables",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        -2032,
        128
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "626bca10-49f8-450f-9347-4753adf2fd76",
      "name": "NocoDB Config",
      "type": "n8n-nodes-base.set",
      "position": [
        -1840,
        128
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "54aae501-d2c2-4d1e-b268-341126fcfb9b",
              "name": "Base ID",
              "type": "string",
              "value": ""
            },
            {
              "id": "697fc737-8f87-403e-83fe-b82d4ce4ab48",
              "name": "NocoDB Url",
              "type": "string",
              "value": ""
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1e7a2c02-fac8-4113-8927-a27408360118",
      "name": "Create relation between tables",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1632,
        320
      ],
      "parameters": {
        "url": "={{ $('NocoDB Config').first().json['NocoDB Url'] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables/{{ $json.id }}/fields",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n      \"title\": \"EOLDates\",\n      \"type\": \"Links\",\n      \"options\": {\n        \"relation_type\": \"hm\",\n        \"related_table_id\": \"{{ $('Create NocoDB EOL Dates Table').first().json['id'] }}\"\n      }\n    }",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "1a82ac26-8211-4d3a-8739-7a063ca0c62d",
      "name": "Create NocoDB EOL Software Table",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1632,
        128
      ],
      "parameters": {
        "url": "={{ $json[\"NocoDB Url\"] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables",
        "method": "POST",
        "options": {},
        "jsonBody": "{\n  \"title\": \"EOLSoftware\",\n  \"table_name\": \"EOLSoftware\",\n  \"fields\": [\n    {\n      \"title\": \"Software\",\n      \"type\": \"SingleLineText\"\n    }\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "9cea509b-dfb9-483c-8213-8596a88d8061",
      "name": "Create NocoDB EOL Dates Table",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2032,
        320
      ],
      "parameters": {
        "url": "={{ $('NocoDB Config').first().json['NocoDB Url'] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables",
        "method": "POST",
        "options": {},
        "jsonBody": "=\n    {\n  \"title\": \"EOLDates\",\n  \"table_name\": \"EOLDates\",\n  \"fields\": [\n    {\n      \"title\": \"key\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Software\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Version\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Latest Subversion\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"Subversion Release\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"End Of Life\",\n      \"type\": \"SingleLineText\"\n    },\n    {\n      \"title\": \"End Of Support\",\n      \"type\": \"SingleLineText\"\n    }\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "b3f014c9-66cc-4fc1-98cb-fbf17cb7e357",
      "name": "Create NocoDB EOL Projects Table",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -1840,
        320
      ],
      "parameters": {
        "url": "={{ $('NocoDB Config').first().json['NocoDB Url'] }}api/v3/meta/bases/{{$('NocoDB Config').first().json['Base ID']}}/tables",
        "method": "POST",
        "options": {},
        "jsonBody": "={\n  \"title\": \"EOLProjects\",\n  \"table_name\": \"EOLProjects\",\n  \"fields\": [\n    {\n      \"title\": \"Project Name\",\n      \"type\": \"SingleLineText\"\n    }\n  ]\n}",
        "sendBody": true,
        "specifyBody": "json",
        "authentication": "predefinedCredentialType",
        "nodeCredentialType": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 4.3
    },
    {
      "id": "bd4e6b21-61d2-4495-9e01-f1260cac4c2a",
      "name": "Check when is EOL",
      "type": "n8n-nodes-base.code",
      "position": [
        1200,
        -384
      ],
      "parameters": {
        "jsCode": "for (const item of $input.all()) {\n  const now = $now.toUTC().toString().slice(0, 10);\n  const daysBeforeEol = $('Config').first().json[\"Days before EOL\"] ?? 30;\n  const manyToManyProjectsSoftwareColumn = item.json.EOLDates\n  // First, identify items that are EOL today\n  item.json.EOL_Today = manyToManyProjectsSoftwareColumn.filter(\n    (d) =>\n      d[\"Subversion Release\"] === now ||\n      d[\"End Of Life\"] === now ||\n      d[\"End Of Support\"] === now\n  );\n  \n  // Create a Set of today's EOL items for quick lookup\n  const todayEOLSet = new Set(item.json.EOL_Today);\n  \n  // Then filter Past_EOL, excluding items already in EOL_Today\n  item.json.Past_EOL = manyToManyProjectsSoftwareColumn.filter(\n    (d) =>\n      !todayEOLSet.has(d) &&\n      (new Date(d[\"Subversion Release\"]) < new Date(now) ||\n       new Date(d[\"End Of Life\"]) < new Date(now) ||\n       new Date(d[\"End Of Support\"]) < new Date(now))\n  );\n\n  const pastEOLSet = new Set(item.json.Past_EOL)\n  // Filter EOL_in_x_days, excluding items already in EOL_Today or Past_EOL\n  item.json.EOL_in_x_days = manyToManyProjectsSoftwareColumn.filter(\n    (d) =>\n      !todayEOLSet.has(d) &&\n      !pastEOLSet.has(d) &&\n      ($now.diff(DateTime.fromJSDate(new Date(d[\"Subversion Release\"])), 'days').days <= daysBeforeEol ||\n       $now.diff(DateTime.fromJSDate(new Date(d[\"End Of Life\"])), 'days').days <= daysBeforeEol ||\n       $now.diff(DateTime.fromJSDate(new Date(d[\"End Of Support\"])), 'days').days <= daysBeforeEol)\n  );\n  \n  delete item.json._nc_m2m_EOLDates_EOLProjects;\n}\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "1199a871-f107-4d59-b1ba-19e62cc61a6c",
      "name": "Get EOLProjects",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        32,
        -352
      ],
      "parameters": {
        "table": "m68cljurlid8t2z",
        "options": {
          "fields": []
        },
        "operation": "getAll",
        "projectId": "pksfpoc943gwhvy",
        "returnAll": true,
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 3,
      "alwaysOutputData": false
    },
    {
      "id": "ce0cd00f-392c-4fb4-830d-ee220375a77c",
      "name": "Loop over projects",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        256,
        -416
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "d86ddcf5-cc84-407f-aa13-8d5a69309be5",
      "name": "Get many rows",
      "type": "n8n-nodes-base.nocoDb",
      "position": [
        480,
        -336
      ],
      "parameters": {
        "table": "mmk9jtv13jor4jh",
        "options": {
          "where": "=(EOLProjects_id,eq,{{ $json.Id }})"
        },
        "operation": "getAll",
        "projectId": "pksfpoc943gwhvy",
        "returnAll": true,
        "authentication": "nocoDbApiToken"
      },
      "credentials": {
        "nocoDbApiToken": {
          "name": "<your credential>"
        }
      },
      "executeOnce": true,
      "typeVersion": 3
    },
    {
      "id": "be2d33bc-3468-4d19-9ec1-4e2276fe5857",
      "name": "Merge Project with Softwares it uses",
      "type": "n8n-nodes-base.merge",
      "position": [
        960,
        -384
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "combineBy": "combineByPosition"
      },
      "typeVersion": 3.2
    },
    {
      "id": "cf1c6243-b85b-4d76-8a35-65bc2ccd039c",
      "name": "Combine All Software into single list",
      "type": "n8n-nodes-base.set",
      "position": [
        704,
        -336
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "b75f3135-56b6-461a-a286-85b788e68f50",
              "name": "EOLDates",
              "type": "array",
              "value": "={{ $input.all().map(i=>i.json) }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    }
  ],
  "connections": {
    "Wait": {
      "main": [
        [
          {
            "node": "Each Software Once",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Convert bool to null",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Config": {
      "main": [
        [
          {
            "node": "Get software to check",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Filter": {
      "main": [
        [
          {
            "node": "Send a message",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Run daily": {
      "main": [
        [
          {
            "node": "Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Insert New": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Make ID Key": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Rename Keys": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update Data": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If ID exists": {
      "main": [
        [
          {
            "node": "Update Data",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Insert New",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create Tables": {
      "main": [
        [
          {
            "node": "NocoDB Config",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get many rows": {
      "main": [
        [
          {
            "node": "Combine All Software into single list",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "NocoDB Config": {
      "main": [
        [
          {
            "node": "Create NocoDB EOL Software Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Send a message": {
      "main": [
        [
          {
            "node": "Loop over projects",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get EOLProjects": {
      "main": [
        [
          {
            "node": "Loop over projects",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Current Rows": {
      "main": [
        [
          {
            "node": "Make ID Key",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check when is EOL": {
      "main": [
        [
          {
            "node": "Filter",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Each Software Once": {
      "main": [
        [
          {
            "node": "Get EOLProjects",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "Get Current Rows",
            "type": "main",
            "index": 0
          },
          {
            "node": "Get EOL data from endoflife.date",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Loop over projects": {
      "main": [
        [],
        [
          {
            "node": "Get many rows",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge Project with Softwares it uses",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Add Key and Software": {
      "main": [
        [
          {
            "node": "Rename Keys",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Convert bool to null": {
      "main": [
        [
          {
            "node": "If ID exists",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get software to check": {
      "main": [
        [
          {
            "node": "Each Software Once",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create NocoDB EOL Dates Table": {
      "main": [
        [
          {
            "node": "Create NocoDB EOL Projects Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create relation between tables": {
      "main": [
        []
      ]
    },
    "Create NocoDB EOL Projects Table": {
      "main": [
        [
          {
            "node": "Create relation between tables",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Create NocoDB EOL Software Table": {
      "main": [
        [
          {
            "node": "Create NocoDB EOL Dates Table",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get EOL data from endoflife.date": {
      "main": [
        [
          {
            "node": "Add Key and Software",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Project with Softwares it uses": {
      "main": [
        [
          {
            "node": "Check when is EOL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Combine All Software into single list": {
      "main": [
        [
          {
            "node": "Merge Project with Softwares it uses",
            "type": "main",
            "index": 1
          }
        ]
      ]
    }
  }
}

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 is an automated system that tracks End-of-Life (EOL) dates for software and technologies used across your projects. It eliminates the need to manually monitor EOL dates in spreadsheets or calendars by automatically fetching the latest EOL information and sending…

Source: https://n8n.io/workflows/14309/ — 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 is designed for engineering teams, project managers, and IT operations who need consistent visibility into team availability across multiple projects. It’s perfect for organizations that

HTTP Request, Execute Workflow Trigger, Slack
Slack & Telegram

This workflow continuously monitors the Meta Ads Library for new creatives from a specific competitor pages, logs them into Google Sheets, and sends a concise Telegram notification with the number of

HTTP Request, Telegram, Google Sheets +1
Slack & Telegram

Enhance financial oversight with this automated n8n workflow. Triggered every 5 minutes, it fetches real-time bank transactions via an API, enriches and transforms the data, and applies smart logic to

HTTP Request, Email Send, Google Sheets +1
Slack & Telegram

This workflow automates competitive price intelligence using Bright Data's enterprise web scraping API. On a scheduled basis (default: daily at 9 AM), the system loops through configured competitor pr

HTTP Request, Google Sheets, Slack +1
Slack & Telegram

&gt; n8n, Binance API, Google Sheets, Slack, Telegram, Jira & Email

HTTP Request, Google Sheets, Slack +3