n8n Uptime Monitoring with Slack Alerts (Without the Alert Storms)
Build n8n uptime monitoring with Slack alerts that fire on real outages, send a recovery notice, log SLA history, and skip the flapping alert storms.
An Uptime Check That Cries Wolf Gets Muted in a Week
The point of n8n uptime monitoring with Slack alerts isn't to detect a single outage. It's to be trusted the next hundred times it fires. Most of the workflows that rank for this fail that test. They ping one URL, fire on a single failed request, and never send the all-clear. So the channel fills with noise, someone mutes it, and the one real outage goes unnoticed.
The ranking pages get the easy 80% right: Schedule Trigger, HTTP Request, Slack message. They skip the parts that make the difference. Recovery notices. Latency thresholds. SLA history. A debounce so a flapping endpoint doesn't fire twelve times an hour.
n8n is a good fit for this because you own the logic. You decide what "down" means, how long to wait before believing it, and what gets logged for the monthly report.
What You Can Automate in an Uptime Monitor
A monitor worth keeping does more than detect a failed request:
- Multi-endpoint checks: loop a list of URLs through one HTTP Request node instead of one workflow per site
- Status-code branching: treat a 5xx, a redirect loop, and a timeout as different events
- Latency thresholds: alert on a slow-but-200 response, not just on errors
- Debounce: require two consecutive failures before paging, to ignore single transient blips
- Recovery notices: fire a resolved message when a down endpoint returns
- SLA logging: append every check result to Google Sheets so you can compute uptime percentage later
- Alert-storm suppression: don't re-alert every cycle while an endpoint stays down
The Uptime Monitoring Pipeline
Schedule Trigger (every 15 min)
→ Code (load URL list)
→ HTTP Request (per URL, continueOnFail: true, capture status + time)
→ IF (status in 2xx AND time < threshold?)
→ healthy:
→ IF (was previously DOWN?) → Slack (recovery: "X is back up")
→ Google Sheets (append OK + responseTime)
→ unhealthy:
→ Code (increment fail counter for this URL)
→ IF (failCount >= 2 AND not already alerting?)
→ Slack #incidents (down alert + status + last time)
→ Google Sheets (append DOWN + status)
1. Pick the interval deliberately
A Schedule Trigger every 15 minutes catches almost every outage that matters while keeping request volume low. The math is simple: every-minute checks generate 1,440 requests per URL per day against every-15-minute's 96. That's 15x the load, 15x the chances of a transient false positive, and a real risk the run overlaps itself.
In n8n, a Schedule Trigger that fires while the previous execution is still running will silently drop the new run. If your check loop can take longer than the interval (lots of URLs, slow targets), widen the interval or split URLs across staggered workflows.
A 15-minute check catches almost every outage that matters at a fraction of the cost. The every-minute version doesn't just hit your target 15x more often; it multiplies transient false positives and risks overlapping its own run. There's a real exception: a checkout or payment endpoint where 60 seconds of downtime is money lost. Put those on a tighter, dedicated monitor and leave everything else at 15.
2. Capture status AND time
Set the HTTP Request node to continue on failure so a dead host doesn't halt the workflow, and grab both signals:
// Code node after HTTP Request — read both health signals
const code = $json.statusCode ?? $json.error?.httpCode ?? 0;
const ms = $json.responseTimeMs ?? 0;
const healthy = code >= 200 && code < 300 && ms < 5000;
return [{ json: { url: $json.url, code, ms, healthy } }];
That 5000ms threshold is a starting point. A marketing page and a checkout API have very different "too slow" lines.
3. Debounce, then alert
The single biggest source of alert-storm noise is firing on the first failed request. Networks blip. Require two consecutive failures for the same URL before paging. Store a per-URL fail counter in a static data store or a Google Sheets column, increment on failure, reset on success.
Then suppress repeats: once you've alerted that an endpoint is down, don't re-alert every 15 minutes. Set an alerting flag and only clear it on recovery. The channel should see one "down" and one "back up," not eight identical alarms.
4. Close the loop with a recovery notice
Track the last state per URL. When a check flips from down to up, fire a resolved message. This is the difference between a monitor people trust and one they learn to ignore. The IF node reads the prior state from Google Sheets and only sends the recovery when the transition actually happens.
5. Log everything for the SLA report
Every result, healthy or not, gets a row: URL, timestamp, status, response time. At month-end a simple formula turns that into an uptime percentage per endpoint. You can't claim a 99.9% SLA without the data behind it, and this is where the data lives.
Implementation Patterns
Pattern 1 — Two consecutive failures before paging. A single failed request is noise more often than it's an outage. The AI Ops Watchtower template builds in this debounce plus the recovery notice, so the channel only sees real state changes.
HTTP Request (fail) → Code (failCount++) → IF (failCount >= 2) → Slack
Pattern 2 — Separate the "slow" alert from the "down" alert. A degraded service and a dead one need different responses. Branch latency and status independently and label them. On-call should know at a glance whether to roll back or just watch.
IF (code in 2xx) → IF (ms > threshold) → Slack #perf (degraded, not down)
Pattern 3 — One workflow, many URLs. Loop a maintained list through a single HTTP Request node. Adding a site is a row edit, not a new workflow.
n8n Nodes You'll Use Most
| Node | Purpose |
|---|---|
| Schedule Trigger | Run the check loop on a fixed interval |
| HTTP Request | Ping each endpoint, capture status code and response time |
| Code | Compute health, manage the per-URL fail counter and state |
| IF | Branch on healthy/unhealthy, debounce, detect recovery |
| Google Sheets | Store SLA history and the last-known state per URL |
| Slack | Send the down alert and the recovery notice |
Getting Started
- Add a Schedule Trigger and set it to every 15 minutes.
- Load your URL list (a Code node or a Google Sheets read).
- Add an HTTP Request node with continue-on-fail, capturing status and time.
- Add the health-check Code node and the debounce counter.
- Wire the recovery IF branch off the last-known state.
- Append every result to Google Sheets for SLA reporting.
- Send alerts to Slack, then start from a template rather than rebuilding the debounce logic by hand.
If your alerts need to reach a phone instead of a channel, the routing pattern in n8n Telegram automation covers the same idea with a different destination. For deploy-time failures rather than uptime, the AI Ops Guard for No-Code Agents template handles CI events with the same alert discipline, and for the broader incident-response picture, automating DevOps workflows with n8n connects uptime monitoring to on-call escalation.
The AI Ops Watchtower ships this end-to-end: the Schedule Trigger loop over a URL list, the two-failure debounce, the latency-vs-status branching, the recovery notice, and the Google Sheets SLA log, all pre-wired to Slack. It's part of The Complete n8n Templates Bundle, a one-time lifetime license to the whole catalog and every template added later, which pays off the moment you monitor more than one service.
Common questions
How often should an n8n uptime check run?
Can n8n send a recovery alert when the site comes back up?
Should an uptime alert fire on slow response or only on errors?
Get the workflow templates this guide is built on
Import-ready n8n JSON, step-by-step setup, and tested end-to-end. One-time payment, own it forever.
Get 3 tested n8n templates, free
The full customer package for three real catalog templates — workflow JSON, step-by-step setup guide, credential checklist. Built through the same live-instance release process as everything we sell. Plus new templates and automation guides in your inbox. No spam, unsubscribe anytime.
- 01Smart To-Do List ManagerPre-built n8n workflow template that automates productivity with OpenAI. Live in about 10 minutes.$14
- 02Email Follow-Up AutomatorPre-built n8n workflow template that automates crm with OpenAI. Live in about 15 minutes.$12
- 03Market Trend AnalyzerPre-built n8n workflow template that automates data processing with OpenAI. Live in about 10 minutes.$14
More automation guides

n8n Backup Automation That Actually Verifies the Backup
A Backup You Never Verified Is a Coin Flip Every n8n backup automation tutorial that ranks does the same thing: schedule an export, push the JSON to Google Drive or S3, done. They back up the data and…

How to Build an n8n Log Alerting Workflow (No Grafana Required)
Most n8n Error Setups Tell You Everything, Which Means They Tell You Nothing An n8n log alerting workflow has one job: surface the failures that need a human and quietly file the ones that don't. The…

How to Build n8n Deployment Failure Alerts That Actually Help
A Failed Deploy at 2am Is Only a Problem If Nobody Hears It Most teams wire up n8n deployment failure alerts the same way: connect a Netlify trigger, drop one Slack message, call it done. That works r…