AutomationFlowsSlack & Telegram › Scheduled SSH to Discord Notifications

Scheduled SSH to Discord Notifications

Original n8n title: Absen Nami

Absen Nami. Uses ssh, discord, scheduleTrigger. Scheduled trigger; 13 nodes.

Cron / scheduled trigger★★★★☆ complexity13 nodesSshDiscord
Slack & Telegram Trigger: Cron / scheduled Nodes: 13 Complexity: ★★★★☆ Added:

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
{
  "updatedAt": "2025-10-06T02:58:37.000Z",
  "createdAt": "2025-10-01T17:10:49.724Z",
  "id": "SSGSakJD6Aa4egmF",
  "name": "Absen Nami",
  "active": true,
  "isArchived": false,
  "nodes": [
    {
      "parameters": {
        "command": "AbsenVersiAing/.env/bin/python3 absenNami.py",
        "cwd": "/home/n8nbot/absen"
      },
      "type": "n8n-nodes-base.ssh",
      "typeVersion": 1,
      "position": [
        400,
        1680
      ],
      "id": "fadae081-d4be-49a4-842a-c98d435e4bd7",
      "name": "Absen",
      "credentials": {
        "sshPassword": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "jsCode": "// --- Mention User ---\nconst userId = \"664803448629493816\";\nconst mention = `<@${userId}>`;\n\n// --- Ambil output dari node sebelumnya (opsional) ---\nconst stdout = $input.first()?.json?.stdout || \"\u26a0 Tidak ada output dari script.\";\n\n// --- Ambil waktu sekarang ---\nconst now = new Date();\n\n// --- Hari dalam bahasa Inggris (Monday, Tuesday, ...) ---\nconst dayNames = [\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"];\nconst rawDay = dayNames[now.getDay()];\n\n// --- Jam sekarang dalam HH:mm ---\nconst pad = (n) => String(n).padStart(2, \"0\");\nconst rawTime = `${pad(now.getHours())}:${pad(now.getMinutes())}`;\n\n// --- Normalisasi nama hari ---\nconst dayMap = {\n  'senin': 'Monday', 'selasa': 'Tuesday', 'rabu': 'Wednesday', 'kamis': 'Thursday', 'jumat': 'Friday', 'jum\\'at': 'Friday',\n  'mon': 'Monday', 'monday': 'Monday',\n  'tue': 'Tuesday', 'tues': 'Tuesday', 'tuesday': 'Tuesday',\n  'wed': 'Wednesday', 'wednesday': 'Wednesday',\n  'thu': 'Thursday', 'thur': 'Thursday', 'thursday': 'Thursday',\n  'fri': 'Friday', 'friday': 'Friday'\n};\nconst dayKey = dayMap[rawDay.toLowerCase()] || rawDay;\n\n// --- Jadwal kuliah ---\nconst schedule = {\n  Monday: [\n    { time: \"08:00\", end: \"09:40\", subject: \"Metodologi Penelitian\", lecturer: \"Dr. Maulisa Oktiana\", room: \"Lab Elektro IV\" }\n  ],\n  Tuesday: [\n    { time: \"10:45\", end: \"12:25\", subject: \"Artificial Inteligent\", lecturer: \"Ir. Yudha Nurdin, ST., MT\", room: \"A14-302\" }\n  ],\n  Wednesday: [\n    { time: \"10:40\", end: \"12:25\", subject: \"Sistem Terdistribusi\", lecturer: \"Ir. Yudha Nurdin, ST., MT\", room: \"A25-201\" },\n    { time: \"14:00\", end: \"15:40\", subject: \"Pengolahan Sinyal Multimedia\", lecturer: \"Dr. Maulisa Oktiana\", room: \"A12-302\" }\n  ],\n  Thursday: [\n    { time: \"08:00\", end: \"09:40\", subject: \"Keamanan Informasi\", lecturer: \"Ir. Sayed Muchalili, S.T., M.Sc., IPM\", room: \"A12-304\" },\n    { time: \"10:45\", end: \"13:15\", subject: \"Keamanan Jaringan\", lecturer: \"Prof. Dr. Ir. Teuku Yuliar Arif, S.T., M.Kom\", room: \"A24-102\" },\n    { time: \"14:00\", end: \"15:45\", subject: \"Sistem Embedded\", lecturer: \"Ir. Rahmad Dawood, S.Kom., M.Sc., IPM\", room: \"Lab Terpadu\" }\n  ],\n  Friday: [\n    { time: \"08:00\", end: \"09:40\", subject: \"Praktikum Distribusi\", lecturer: \"Pak Yudha\", room: \"A12-304\" },\n    { time: \"16:30\", end: \"18:15\", subject: \"Tata Tulis Ilmiah\", lecturer: \"Dr. Maulisa Oktiana\", room: \"A12-304\" }\n  ]\n};\n\n// --- Helper: parse HH:MM ke menit ---\nfunction parseTimeToMinutes(t) {\n  if (!t) return null;\n  t = String(t).trim().replace(/\\./g, ':');\n  const m = t.match(/(\\d{1,2}):(\\d{2})/);\n  if (!m) return null;\n  let hh = parseInt(m[1], 10);\n  let mm = parseInt(m[2], 10);\n  if (isNaN(hh) || isNaN(mm)) return null;\n  return hh * 60 + mm;\n}\n\nlet mataKuliah = \"\u2753 Tidak ada jadwal terdaftar.\";\nlet dosen = \"-\";\nlet ruangan = \"-\";\nlet jadwalWaktu = \"-\";\n\nconst nowMinutes = parseTimeToMinutes(rawTime);\n\n// --- Cari jadwal sesuai hari & waktu ---\nif (dayKey && schedule[dayKey]) {\n  const rows = schedule[dayKey];\n\n  if (nowMinutes !== null) {\n    // cek kelas yang sedang berlangsung\n    for (const r of rows) {\n      const start = parseTimeToMinutes(r.time);\n      const end = parseTimeToMinutes(r.end);\n      if (start !== null && end !== null && nowMinutes >= start && nowMinutes <= end) {\n        mataKuliah = r.subject;\n        dosen = r.lecturer;\n        ruangan = r.room;\n        jadwalWaktu = `${r.time} - ${r.end}`;\n        break;\n      }\n    }\n  }\n\n  // kalau belum ada kelas sekarang, ambil yang berikutnya\n  if (mataKuliah.startsWith(\"\u2753\") && nowMinutes !== null) {\n    const upcoming = rows\n      .map(r => ({ ...r, start: parseTimeToMinutes(r.time) }))\n      .filter(r => r.start !== null && r.start > nowMinutes)\n      .sort((a, b) => a.start - b.start);\n\n    if (upcoming.length > 0) {\n      const next = upcoming[0];\n      mataKuliah = `Tidak ada kelas sekarang. Berikutnya: ${next.subject}`;\n      dosen = next.lecturer;\n      ruangan = next.room;\n      jadwalWaktu = `${next.time} - ${next.end}`;\n    }\n  }\n} else {\n  mataKuliah = \"\u274c Hari ini tidak ada jadwal kuliah.\";\n}\n\n// --- Format pesan final ---\nconst finalMessage =\n  `\ud83d\udd5c **Absen Otomatis**\n${mention} Nami\n\n\ud83d\udccc Status: ${stdout}\n\ud83d\udcc5 Hari: ${rawDay}\n\u23f0 Jam: ${rawTime}\n\ud83d\udcd6 Mata Kuliah: ${mataKuliah}\n\ud83d\udc68\u200d\ud83c\udfeb Dosen: ${dosen}\n\ud83c\udfeb Ruangan: ${ruangan}\n\ud83d\uddd3 Jadwal: ${jadwalWaktu}`;\n\nreturn [{ json: { text: finalMessage } }];\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        544,
        1680
      ],
      "id": "329bfda3-ecf2-4bba-b1e8-e59b33496bf7",
      "name": "Code3"
    },
    {
      "parameters": {
        "authentication": "webhook",
        "content": "={{ $json.text }}\n-----------------------------------------",
        "options": {}
      },
      "type": "n8n-nodes-base.discord",
      "typeVersion": 2,
      "position": [
        752,
        1680
      ],
      "id": "e0e8e976-dcde-4e5d-88eb-8488fc34a721",
      "name": "Discord3",
      "credentials": {
        "discordWebhookApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                1
              ],
              "triggerAtHour": 8,
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        1680
      ],
      "id": "63ef1b78-6632-473c-985b-601ecc20b862",
      "name": "Metopen",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                2
              ],
              "triggerAtHour": 10,
              "triggerAtMinute": 50
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -176,
        1536
      ],
      "id": "465d5c40-c70c-41a6-8e65-2cceb204944a",
      "name": "AI"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                4
              ],
              "triggerAtHour": 8,
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        160,
        1536
      ],
      "id": "5900fa81-0745-4f39-9e67-9a62f2f9240b",
      "name": "Informasi",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                4
              ],
              "triggerAtHour": 10,
              "triggerAtMinute": 50
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        1536
      ],
      "id": "90187a42-4500-469a-a13f-7f2ab83ff947",
      "name": "Jaringan"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                3
              ],
              "triggerAtHour": 10,
              "triggerAtMinute": 50
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        176,
        1840
      ],
      "id": "c3407198-e80b-4736-a0bf-aca568701ab8",
      "name": "Distribusi"
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                4
              ],
              "triggerAtHour": 14,
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -176,
        1840
      ],
      "id": "0cb2ac5d-fec3-4bab-beca-e1b2e305332b",
      "name": "Embedded",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                3
              ],
              "triggerAtHour": 14,
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -176,
        1680
      ],
      "id": "1729e73a-4344-4b42-88f8-bfb0d95c1436",
      "name": "Sinyal",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                5
              ],
              "triggerAtHour": 16,
              "triggerAtMinute": 40
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        160,
        1680
      ],
      "id": "570168e5-4fca-4444-aece-316835f6af8f",
      "name": "Tatul",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                5
              ],
              "triggerAtHour": 8,
              "triggerAtMinute": 5
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        0,
        1840
      ],
      "id": "f96cc745-6616-4e6d-a9ab-47035364e775",
      "name": "prak distribusi",
      "executeOnce": false
    },
    {
      "parameters": {
        "rule": {
          "interval": [
            {
              "field": "weeks",
              "triggerAtDay": [
                4
              ],
              "triggerAtHour": 15,
              "triggerAtMinute": null
            }
          ]
        }
      },
      "type": "n8n-nodes-base.scheduleTrigger",
      "typeVersion": 1.2,
      "position": [
        -336,
        1680
      ],
      "id": "c017d2c5-01b8-4dac-983c-53fdfda050e4",
      "name": "PrakEmbedded",
      "executeOnce": false
    }
  ],
  "connections": {
    "Absen": {
      "main": [
        [
          {
            "node": "Code3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code3": {
      "main": [
        [
          {
            "node": "Discord3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Informasi": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Distribusi": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Tatul": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "prak distribusi": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Metopen": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Jaringan": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "AI": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Sinyal": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Embedded": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "PrakEmbedded": {
      "main": [
        [
          {
            "node": "Absen",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "settings": {
    "executionOrder": "v1",
    "callerPolicy": "workflowsFromSameOwner",
    "errorWorkflow": "AvhjGJdACMdnvIEn"
  },
  "staticData": {
    "node:Metopen": {
      "recurrenceRules": []
    },
    "node:AI": {
      "recurrenceRules": []
    },
    "node:Informasi": {
      "recurrenceRules": []
    },
    "node:Jaringan": {
      "recurrenceRules": []
    },
    "node:Distribusi": {
      "recurrenceRules": []
    },
    "node:Embedded": {
      "recurrenceRules": []
    },
    "node:Sinyal": {
      "recurrenceRules": []
    },
    "node:Tatul": {
      "recurrenceRules": []
    },
    "node:prak distribusi": {
      "recurrenceRules": []
    },
    "node:PrakEmbedded": {
      "recurrenceRules": []
    },
    "node:Metopen1": {
      "recurrenceRules": []
    },
    "node:AI1": {
      "recurrenceRules": []
    },
    "node:Informasi1": {
      "recurrenceRules": []
    },
    "node:Jaringan1": {
      "recurrenceRules": []
    },
    "node:Distribusi1": {
      "recurrenceRules": []
    },
    "node:Embedded1": {
      "recurrenceRules": []
    },
    "node:Sinyal1": {
      "recurrenceRules": []
    },
    "node:Tatul1": {
      "recurrenceRules": []
    },
    "node:prak distribusi1": {
      "recurrenceRules": []
    },
    "node:PrakEmbedded1": {
      "recurrenceRules": []
    }
  },
  "meta": null,
  "versionId": "ca4acb9a-2259-48b7-826e-0da96d98a3f2",
  "triggerCount": 10,
  "shared": [
    {
      "updatedAt": "2025-10-01T17:10:49.731Z",
      "createdAt": "2025-10-01T17:10:49.731Z",
      "role": "workflow:owner",
      "workflowId": "SSGSakJD6Aa4egmF",
      "projectId": "DiQC0tGxFhuiK9UM"
    }
  ],
  "tags": [
    {
      "updatedAt": "2025-10-01T17:10:43.185Z",
      "createdAt": "2025-10-01T17:10:43.185Z",
      "id": "kFo2wAHgXOGuNR0l",
      "name": "Absen"
    }
  ]
}

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

How this works

This workflow automates attendance marking for Nami by securely executing SSH commands on a remote server at scheduled intervals, ensuring timely submissions without manual intervention and reducing errors from forgetfulness. It's ideal for students or staff managing regular check-ins on systems like Nami, where reliability is key to avoiding penalties. The core step involves the SSH node connecting to the server to input attendance data, followed by a Discord notification confirming success or flagging issues, streamlining what would otherwise be a repetitive manual task.

Use this workflow for daily or periodic attendance routines on accessible SSH-enabled systems, particularly when integrated with Discord for real-time alerts. Avoid it for one-off tasks or environments without SSH access, as it relies on cron scheduling for automation. Common variations include adjusting the schedule trigger for different frequencies or adding code nodes to customise data formatting before submission.

About this workflow

Absen Nami. Uses ssh, discord, scheduleTrigger. Scheduled trigger; 13 nodes.

Source: https://github.com/SamVivan1/n8n-Workflows-Backup/blob/main/absen-nami-SSGSakJD6Aa4egmF.json — 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

Absen Otomatis. Uses discord, ssh, scheduleTrigger, executeWorkflowTrigger. Scheduled trigger; 16 nodes.

Discord, Ssh, Execute Workflow Trigger
Slack & Telegram

Absen Nay. Uses ssh, discord, scheduleTrigger. Scheduled trigger; 13 nodes.

Ssh, Discord
Slack & Telegram

HomeLab. Uses scheduleTrigger, discord, ssh. Scheduled trigger; 8 nodes.

Discord, Ssh
Slack & Telegram

Wait Schedule. Uses spotify, supabase, compareDatasets, noOp. Scheduled trigger; 54 nodes.

Spotify, Supabase, YouTube +1
Slack & Telegram

This n8n template demonstrates how to automatically monitor and track username and nickname changes across your Discord server members. Perfect for community moderation, security monitoring, and maint

Discord, Data Table