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 →
{
"nodes": [
{
"id": "ba168090-4727-4b72-a0cf-3f15ef3a9f17",
"name": "Send Email",
"type": "n8n-nodes-base.emailSend",
"position": [
580,
360
],
"parameters": {
"text": "=System resources are above the threshold.\n\nCPU: {{ $json.CPU.toNumber().round(2) }}%\nRAM: {{ $json.RAM.toNumber().round(2) }}%\nDisk: {{ $json.Disk.toNumber().round(2) }}%",
"options": {},
"subject": "System Resource Alert",
"toEmail": "change@me.com",
"fromEmail": "change@me.com"
},
"credentials": {
"smtp": {
"name": "<your credential>"
}
},
"typeVersion": 1
},
{
"id": "79afc30f-c3db-4ba1-8f0d-a1000b5e0abe",
"name": "Check RAM usage",
"type": "n8n-nodes-base.ssh",
"position": [
160,
40
],
"parameters": {
"command": "free | awk '/Mem:/ {printf \"%.2f\", (1 - $7/$2) * 100}'"
},
"credentials": {
"sshPassword": {
"name": "<your credential>"
}
},
"executeOnce": false,
"typeVersion": 1
},
{
"id": "d09aa314-8d60-42a8-9933-d7e8d73e2c7d",
"name": "Check Disk usage",
"type": "n8n-nodes-base.ssh",
"position": [
380,
40
],
"parameters": {
"command": "df -h | awk '$NF==\"/\"{printf \"%.2f\", $5}'"
},
"credentials": {
"sshPassword": {
"name": "<your credential>"
}
},
"executeOnce": false,
"typeVersion": 1
},
{
"id": "bc6a0df2-f4cc-484a-ac39-c92e8795175e",
"name": "Check CPU usage",
"type": "n8n-nodes-base.ssh",
"position": [
580,
40
],
"parameters": {
"command": "top -bn 1 | grep \"Cpu(s)\" | sed \"s/.*, *\\([0-9.]*\\)%* id.*/\\1/\" | awk '{print 100 - $1}'"
},
"credentials": {
"sshPassword": {
"name": "<your credential>"
}
},
"executeOnce": false,
"typeVersion": 1
},
{
"id": "de0df734-1e4a-4bf0-9f7d-d60b52e06f48",
"name": "Merge check results",
"type": "n8n-nodes-base.merge",
"position": [
-40,
380
],
"parameters": {
"mode": "combineBySql",
"query": "SELECT input1.stdout as CPU, input2.stdout as Disk, input3.stdout as RAM FROM input1 LEFT JOIN input2 ON input1.name = input2.id LEFT JOIN input3 ON input1.name = input3.id",
"numberInputs": 3
},
"typeVersion": 3
},
{
"id": "7b7d6c0a-3f46-48b3-aa1d-191839540196",
"name": "Check results against thresholds",
"type": "n8n-nodes-base.if",
"position": [
240,
380
],
"parameters": {
"conditions": {
"number": [
{
"value1": "={{ $json.CPU }}",
"value2": 80,
"operation": "largerEqual"
},
{
"value1": "={{ $json.Disk }}",
"value2": 80,
"operation": "largerEqual"
},
{
"value1": "={{ $json.RAM }}",
"value2": 80,
"operation": "largerEqual"
}
]
},
"combineOperation": "any"
},
"typeVersion": 1
},
{
"id": "92331c38-cab8-4719-8746-6fb341954516",
"name": "Sticky Note1",
"type": "n8n-nodes-base.stickyNote",
"position": [
560,
260
],
"parameters": {
"width": 320,
"height": 280,
"content": "## Update email addresses\nUpdate From and To email addresses in this node to receive notifications"
},
"typeVersion": 1
},
{
"id": "3117fdbc-fde9-469b-bd47-59f45c349162",
"name": "Sticky Note",
"type": "n8n-nodes-base.stickyNote",
"position": [
-260,
-120
],
"parameters": {
"width": 320,
"height": 260,
"content": "## Check VPS resource usage every 15 minutes\nThis workflow checks VPS CPU, RAM and Disk usage every 15 minutes and if any of it exceeds 80% will inform you by email"
},
"typeVersion": 1
},
{
"id": "45b4c33a-8f02-4535-b67f-56d9d0aaf2ae",
"name": "Sticky Note2",
"type": "n8n-nodes-base.stickyNote",
"position": [
180,
260
],
"parameters": {
"width": 360,
"height": 280,
"content": "## Update threshold\nIf needed, you can increase/decrease the 80% threshold in this node individually per resource "
},
"typeVersion": 1
},
{
"id": "0bf83ea8-b1c4-40f7-8a60-39f765e8ec2c",
"name": "Schedule Trigger",
"type": "n8n-nodes-base.scheduleTrigger",
"position": [
-40,
40
],
"parameters": {
"rule": {
"interval": [
{
"field": "minutes",
"minutesInterval": 15
}
]
}
},
"typeVersion": 1.2
}
],
"connections": {
"Check CPU usage": {
"main": [
[
{
"node": "Merge check results",
"type": "main",
"index": 0
}
]
]
},
"Check RAM usage": {
"main": [
[
{
"node": "Check Disk usage",
"type": "main",
"index": 0
},
{
"node": "Merge check results",
"type": "main",
"index": 2
}
]
]
},
"Check Disk usage": {
"main": [
[
{
"node": "Check CPU usage",
"type": "main",
"index": 0
},
{
"node": "Merge check results",
"type": "main",
"index": 1
}
]
]
},
"Schedule Trigger": {
"main": [
[
{
"node": "Check RAM usage",
"type": "main",
"index": 0
}
]
]
},
"Merge check results": {
"main": [
[
{
"node": "Check results against thresholds",
"type": "main",
"index": 0
}
]
]
},
"Check results against thresholds": {
"main": [
[
{
"node": "Send Email",
"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.
smtpsshPassword
For the full experience including quality scoring and batch install features for each workflow upgrade to Pro
How this works
Keep your servers running smoothly without constant monitoring by receiving automated email alerts for critical resource issues, saving time and preventing downtime for busy system administrators or DevOps teams. This workflow checks CPU, RAM, and disk usage on remote servers via SSH, merges the results, and compares them against predefined thresholds to trigger notifications only when necessary. The key step involves the conditional evaluation that decides whether to send an alert, integrating seamlessly with email services for instant delivery.
Use this workflow for routine health checks on Linux servers where resources often fluctuate, such as during peak hours or after deployments, ensuring proactive issue resolution. Avoid it for non-SSH environments like cloud dashboards with built-in monitoring, or if you need real-time alerts beyond scheduled intervals. Common variations include adjusting cron triggers for hourly versus daily runs, or adding Slack notifications instead of email for team collaboration.
About this workflow
Schedule Stickynote. Uses emailSend, ssh, stickyNote, scheduleTrigger. Scheduled trigger; 10 nodes.
Source: https://github.com/Zie619/n8n-workflows — original creator credit. Request a take-down →
Related workflows
Workflows that share integrations, category, or trigger type with this one. All free to copy and import.
Code Schedule. Uses ssh, emailSend, scheduleTrigger, stickyNote. Scheduled trigger; 7 nodes.
Amazon Product Price Tracker. Uses googleSheets, splitInBatches, httpRequest, emailSend. Scheduled trigger; 16 nodes.
Datetime Googlecalendar. Uses dateTime, noOp, googleCalendar, emailSend. Scheduled trigger; 13 nodes.
Generate Weekly Energy Consumption Reports with API, Email and Google Drive. Uses httpRequest, convertToFile, emailSend, googleDrive. Scheduled trigger; 12 nodes.
Weekly hiring‑manager snapshot from Breezy HR to email (pipeline, next‑week interviews, stuck). Uses httpRequest, emailSend. Scheduled trigger; 12 nodes.