AutomationFlowsSlack & Telegram › Automated Ssl Certificate Monitoring and Renewal with Notion and Telegram

Automated Ssl Certificate Monitoring and Renewal with Notion and Telegram

ByFrank Chen @frankchen on n8n.io

Automatically fetch existing domains from Notion's Database and verify the validity of SSL certificates through SSL-Checker. If the validity period is less than 14 days, send a Telegram message notification and trigger SSH remote automatic refresh. Successful refresh…

Cron / scheduled trigger★★★★☆ complexity21 nodesHTTP RequestNotionExecute Workflow TriggerSshTelegram
Slack & Telegram Trigger: Cron / scheduled Nodes: 21 Complexity: ★★★★☆ Added:

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

This workflow follows the Execute Workflow Trigger → 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": "469d3992-ba1a-47c2-8400-73224b70425c",
      "name": "Check SSL",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1620,
        600
      ],
      "parameters": {
        "url": "=https://ssl-checker.io/api/v1/check/{{ $json.name }}",
        "options": {}
      },
      "typeVersion": 4.2
    },
    {
      "id": "c84b355a-0f3a-4256-b835-28f1a2c08fbb",
      "name": "If",
      "type": "n8n-nodes-base.if",
      "position": [
        2040,
        600
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "e4af952e-e497-4d8e-a0fe-6d05c385bdd6",
              "operator": {
                "type": "number",
                "operation": "lt"
              },
              "leftValue": "={{ $('Refresh SSL Status').item.json.result.days_left }}",
              "rightValue": 14
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "da422db5-a9cf-4977-b508-ec4d17f34c56",
      "name": "Get SSL Info",
      "type": "n8n-nodes-base.notion",
      "position": [
        1420,
        600
      ],
      "parameters": {
        "options": {},
        "resource": "databasePage",
        "operation": "getAll",
        "returnAll": true
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "806efbf8-9783-439e-8068-b59b86f41be8",
      "name": "Refresh SSL Status",
      "type": "n8n-nodes-base.code",
      "position": [
        1840,
        600
      ],
      "parameters": {
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nfor (const item of $input.all()) {\n  if (item.json.result.days_left < 14) {\n    item.json.ssl_status = \"It's about to expire.\";\n  } else if (item.json.result.days_left >= 14) {\n    item.json.ssl_status = \"Normal\";\n  } else {\n    item.json.ssl_status = \"Unavailable\";\n  }\n}\n\nreturn $input.all();"
      },
      "typeVersion": 2
    },
    {
      "id": "b82487c2-9070-4741-b8a3-d91595b52272",
      "name": "Update SSL Info",
      "type": "n8n-nodes-base.notion",
      "position": [
        2420,
        740
      ],
      "parameters": {
        "pageId": {
          "__rl": true,
          "mode": "url",
          "value": "={{ $('Get SSL Info').item.json.url }}"
        },
        "options": {},
        "resource": "databasePage",
        "operation": "update",
        "propertiesUi": {
          "propertyValues": [
            {
              "key": "Creation Date|date",
              "date": "={{ $json.result.valid_from }}",
              "timezone": "Asia/Taipei",
              "includeTime": false
            },
            {
              "key": "Expiration Date|date",
              "date": "={{ $json.result.valid_till }}",
              "timezone": "Asia/Taipei",
              "includeTime": false
            },
            {
              "key": "SSL \u72c0\u614b|select",
              "selectValue": "={{ $json.ssl_status }}"
            },
            {
              "key": "Last Check At|date",
              "date": "={{ $now.toString() }}"
            }
          ]
        }
      },
      "credentials": {
        "notionApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8e721b47-ea70-462f-9bcd-7c7d82197c6e",
      "name": "Merge Content",
      "type": "n8n-nodes-base.code",
      "position": [
        2620,
        480
      ],
      "parameters": {
        "jsCode": "var result = \"The certificates for the following domains are about to expire. Please confirm that they have been updated to avoid unexpected service downtime.\uff1a\\n\";\nvar index = 1;\n\nfor (const item of $('Refresh SSL Status').all()) {\n  if (item.json.result.days_left < 14) {\n    result += `${index}. ${item.json.host}\uff1a${item.json.result.days_left} days remaining.\\n`;\n    \n    index++;\n  }\n}\n\nresult += \"\\nThe instruction to update the credentials has been automatically triggered and the system will check again.\";\n\nreturn {output: result};"
      },
      "typeVersion": 2
    },
    {
      "id": "dbac84ed-cde7-4ec0-83ad-9f66b8c313d5",
      "name": "Weekly Trigger",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        740,
        600
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks"
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "b6e10348-6364-4ba1-8770-d4451e88bc3a",
      "name": "When clicking \u2018Execute workflow\u2019",
      "type": "n8n-nodes-base.manualTrigger",
      "position": [
        740,
        420
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "883b7a42-f6d8-43f2-b06b-9f7ced94a53c",
      "name": "Wait",
      "type": "n8n-nodes-base.wait",
      "position": [
        3300,
        480
      ],
      "parameters": {},
      "typeVersion": 1.1
    },
    {
      "id": "c4a69edf-680a-461e-ad07-b59b478a511d",
      "name": "If3",
      "type": "n8n-nodes-base.if",
      "position": [
        2240,
        720
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "273ad0c0-dc65-4e22-8248-2394cf9540b8",
              "operator": {
                "type": "array",
                "operation": "lengthNotEquals",
                "rightType": "number"
              },
              "leftValue": "={{ $('If').all() }}",
              "rightValue": "={{ $('Get SSL Info').all().length }}"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "43d2b787-83cf-46c0-9a7f-d96d9790c118",
      "name": "Merge",
      "type": "n8n-nodes-base.merge",
      "position": [
        2420,
        480
      ],
      "parameters": {
        "mode": "chooseBranch"
      },
      "typeVersion": 3.1
    },
    {
      "id": "69cdc9ee-aff1-4487-92ff-f025210a2c68",
      "name": "If1",
      "type": "n8n-nodes-base.if",
      "position": [
        2620,
        740
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "b519c2ca-048a-4a53-97f3-d2c6fec2987e",
              "operator": {
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $('Select Who Triggered').first().json.triggerBy }}",
              "rightValue": "anotherWorkflow"
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "3084cc79-82ed-470b-bf13-bad763f1eb4f",
      "name": "Execute Workflow",
      "type": "n8n-nodes-base.executeWorkflow",
      "position": [
        3520,
        480
      ],
      "parameters": {
        "options": {},
        "workflowId": {
          "__rl": true,
          "mode": "list",
          "value": "WO0anosBgPhhJ0Qi",
          "cachedResultName": "SSL Check Service"
        },
        "workflowInputs": {
          "value": {
            "has_expired_cert": true
          },
          "schema": [
            {
              "id": "has_expired_cert",
              "type": "boolean",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "has_expired_cert",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "has_expired_cert"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "323cf648-0ed5-4b0c-801f-ea088a8c969f",
      "name": "When Executed by Another Workflow",
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "position": [
        740,
        780
      ],
      "parameters": {
        "workflowInputs": {
          "values": [
            {
              "name": "has_expired_cert",
              "type": "boolean"
            }
          ]
        }
      },
      "typeVersion": 1.1
    },
    {
      "id": "950d0d4f-7ec7-4fdf-a871-fdc2f6a695d6",
      "name": "Set Click Triggered",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        420
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7ae06a67-600e-4efa-9eb1-da1bf83dc983",
              "name": "triggerBy",
              "type": "string",
              "value": "click"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "ffe248fd-0a2e-4635-a749-8f982a5a5412",
      "name": "Set Weekly Triggered",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        600
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7ae06a67-600e-4efa-9eb1-da1bf83dc983",
              "name": "triggerBy",
              "type": "string",
              "value": "weekly"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "a1f5e319-1cff-4bb7-8911-d067095d1c6c",
      "name": "Set anotherWorkflow Triggered",
      "type": "n8n-nodes-base.set",
      "position": [
        960,
        780
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "7ae06a67-600e-4efa-9eb1-da1bf83dc983",
              "name": "triggerBy",
              "type": "string",
              "value": "anotherWorkflow"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "758c172a-d289-4a1c-8e3d-1c4aaf643ff6",
      "name": "Select Who Triggered",
      "type": "n8n-nodes-base.merge",
      "position": [
        1220,
        600
      ],
      "parameters": {
        "numberInputs": 3
      },
      "typeVersion": 3.1
    },
    {
      "id": "6b7db2a1-677a-4e24-93b7-baff9a2b60c2",
      "name": "Renew Server Cert",
      "type": "n8n-nodes-base.ssh",
      "position": [
        3080,
        480
      ],
      "parameters": {
        "cwd": "/your/work//directory",
        "command": "sudo certbot renew",
        "authentication": "privateKey"
      },
      "credentials": {
        "sshPrivateKey": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "caa30dca-a69e-499c-802b-e025ea8f4c10",
      "name": "Telegram",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2860,
        480
      ],
      "parameters": {
        "text": "=\\[Notify] `{{ $workflow.name }}`\n{{ $json.output }}",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "1853becf-ec46-47e2-b51e-c03f616e16ee",
      "name": "Telegram1",
      "type": "n8n-nodes-base.telegram",
      "position": [
        2860,
        720
      ],
      "parameters": {
        "text": "=\\[Notify] `{{ $workflow.name }}`\nThe SSL certificate has been updated and all certificates are normal.",
        "additionalFields": {}
      },
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      },
      "typeVersion": 1.2
    }
  ],
  "connections": {
    "If": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "If3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If1": {
      "main": [
        [
          {
            "node": "Telegram1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "If3": {
      "main": [
        [
          {
            "node": "Merge",
            "type": "main",
            "index": 1
          }
        ],
        [
          {
            "node": "Update SSL Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Wait": {
      "main": [
        [
          {
            "node": "Execute Workflow",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge": {
      "main": [
        [
          {
            "node": "Merge Content",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Telegram": {
      "main": [
        [
          {
            "node": "Renew Server Cert",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Check SSL": {
      "main": [
        [
          {
            "node": "Refresh SSL Status",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get SSL Info": {
      "main": [
        [
          {
            "node": "Check SSL",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge Content": {
      "main": [
        [
          {
            "node": "Telegram",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Weekly Trigger": {
      "main": [
        [
          {
            "node": "Set Weekly Triggered",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Update SSL Info": {
      "main": [
        [
          {
            "node": "If1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Renew Server Cert": {
      "main": [
        [
          {
            "node": "Wait",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Refresh SSL Status": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Click Triggered": {
      "main": [
        [
          {
            "node": "Select Who Triggered",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Select Who Triggered": {
      "main": [
        [
          {
            "node": "Get SSL Info",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Set Weekly Triggered": {
      "main": [
        [
          {
            "node": "Select Who Triggered",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Set anotherWorkflow Triggered": {
      "main": [
        [
          {
            "node": "Select Who Triggered",
            "type": "main",
            "index": 2
          }
        ]
      ]
    },
    "When Executed by Another Workflow": {
      "main": [
        [
          {
            "node": "Set anotherWorkflow Triggered",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "When clicking \u2018Execute workflow\u2019": {
      "main": [
        [
          {
            "node": "Set Click Triggered",
            "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

Automatically fetch existing domains from Notion's Database and verify the validity of SSL certificates through SSL-Checker. If the validity period is less than 14 days, send a Telegram message notification and trigger SSH remote automatic refresh. Successful refresh…

Source: https://n8n.io/workflows/4973/ — 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 n8n workflow monitors your Proxmox VE server and sends automated reports to Telegram every 15 minutes. It tracks VM status, host resource usage, temperature sensors, and detects recently stopped

HTTP Request, Ssh, Telegram
Slack & Telegram

This workflow is for system administrators or self-hosted n8n users who want to automatically check and update their n8n instance to the latest version — with Telegram notifications for every step. Th

HTTP Request, Telegram, n8n +2
Slack & Telegram

Solo founders and spreadsheet gremlins who track everything in Notion and want crisp Telegram pings without opening a single page.

Telegram, Notion
Slack & Telegram

This workflow provides a complete solution for handling Telegram Stars payments, invoicing and refunds using n8n. It automates the process of sending invoices, managing pre-checkout approvals, recordi

HTTP Request, Execute Workflow Trigger, Google Sheets +2
Slack & Telegram

This workflow is an AI-assisted clean plate and object removal pipeline built for modern VFX production environments. It transforms a single plate image and removal brief into multiple high-quality cl

HTTP Request, Google Drive, Slack +3