Spurlock Studios
Contact
When Automation Fails at 2am: Alerts, Severity, and Who Gets Woken

When automation fails at 2am, one of three things should happen: a human gets woken for irreversible work, a morning queue gets a ticket for everything else, or a heartbeat proves the trigger never fired. Platform defaults do none of that well.

Spurlock Studios builds for the overnight case first. Happy-path demos lie. Broader production rules live in the Production n8n handbook.

The short answer

  • Page only when money moves, a customer gets contacted, or a system of record goes wrong with no safe retry.
  • Morning-triage everything else — enrichment skips, rate-limit waits, noncritical sync lag.
  • Detect silence with heartbeats; error alerts only fire when something ran and failed.
  • Name an owner before go-live. “The founder might see Slack” is not on-call.
  • Zapier / Make / n8n all fail quietly until you add severity and routing yourself.

Why platforms fail quietly by default

Out of the box, most rails treat failure as a UI badge or a polite email to the account owner. That email often lands in a shared inbox nobody checks at night. The workflow may keep “running” while every item fails, or — worse — stop receiving events and look healthy because nothing errored.

Default behaviorWhat operators thinkWhat actually happens
Error email to account ownerSomeone is on callInbox mute or spam folder
Slack webhook to #opsHumans will wakeChannel muted after week one
Red execution in the UIVisible overnightVisible only if someone opens the app
Zap / scenario auto-offSafe stopSilent stop; backlog grows

Quiet failure is the product default. Loud, graded failure is something you design.

Severity: page vs morning triage

Write severity before you wire Slack. Copy this table into the runbook:

SeverityExamplesResponse
P1 — wake someonePayment capture failed mid-charge; CRM write deleted or overwrote customer data; outbound SMS/email blast misfiredPhone / PagerDuty / SMS within minutes
P2 — morning firstLead sync delayed; enrichment API down; noncritical reporting job failedTicket + owner Slack by start of business
P3 — backlogOptional research step skipped; soft validation warningWeekly triage board

Rule: if the blast radius can create refunds, legal risk, or a customer-facing lie before 9am, it is P1. Everything else waits.

What should page a human

Page when all of these are true:

  1. The side effect is irreversible or customer-visible
  2. Waiting until morning makes the damage worse (duplicates, wrong quotes, missed SLAs)
  3. A human action in the next hour can stop or reverse it

Do not page for:

  • A node that already retried and will retry again safely
  • Enrichment that is allowed to fail open
  • Staging / test workflows
  • Known vendor maintenance windows you already documented

If every failure pages, people mute the channel. Mute is how 2am incidents become 9am discoveries.

Detecting a workflow that never ran

Error workflows answer “this execution failed.” They do not answer “the webhook died” or “the cron never fired.”

Add a dead-man / heartbeat check:

  1. Every successful production run writes last_success_at to a small store (DB row, Airtable, Redis key).
  2. A separate schedule (every 15–60 minutes, matched to expected volume) checks that timestamp.
  3. If now - last_success_at exceeds the SLA for that flow, fire a silence alert with severity based on the path.
Trigger typeSilence signalTypical SLA to alert
High-volume webhookNo success for N minutes during business hours15–30 min
Nightly cronMissed expected windowWindow end + 30 min
Weekly reportMissed Monday 06:00+2 hours

Silence detection is the control most “Slack alert” tutorials skip. Pair it with the failure classification in Why your automation broke.

How Zapier, Make, and n8n differ overnight

Same ops problem; different knobs:

RailCommon overnight defaultWhat you must add
ZapierError email; Zap may turn off after repeated errorsRouted alerts, owner, silence check, severity
MakeScenario error notifications to account emailSame — plus watch for partial scenario stops
n8nError Workflow (Error Trigger) if you attach oneAlert contract, DLQ, heartbeat; see error workflows operators read

n8n wins when you want one handler attached to every production flow. It does not wake anyone until you decide what the message says and who receives it.

The overnight ownership contract

Before activation, fill this once:

Workflow: _______________
Owner (primary): _______________
Backup owner: _______________
P1 channel: _______________
P2 channel: _______________
Mute policy: no mute on P1; P2 may snooze until 08:00 local
Heartbeat key: _______________
Max silence: _______________
Rollback / pause steps: _______________

If the primary is on vacation and the backup is “TBD,” the workflow is not production. It is a demo with a schedule.

Failure mode: muted #alerts

What breaks: a chatty Error Workflow posts every rate-limit hiccup into #alerts. After three nights, the team mutes the channel. On night four, a payment path fails and nobody sees it.

What it costs: morning discovery, manual cleanup, trust hit with whoever owns the CRM.

What you do instead:

  1. Split channels: #automation-p1 (never mute) and #automation-triage (morning).
  2. Route by severity inside the error handler — do not post everything once.
  3. Cap repeats: after N identical errors in an hour, collapse to one “still failing” message with a count.
  4. Keep P1 on a pager tool if chat culture cannot protect the channel.

Overnight checklist (before you call it production)

  • Severity table exists for this workflow
  • P1 has a phone/SMS path, not only Slack
  • P2 has a morning owner named in writing
  • Heartbeat / dead-man check covers “never ran”
  • Error handler includes workflow name, execution link, failed node, severity
  • Mute policy documented for the P1 channel
  • Pause steps written (who flips the workflow off)
  • Staging proved one intentional failure for an activated path

Decision list: page or wait

Ask in order:

  1. Can waiting until morning create irreversible customer or money damage? → Page
  2. Is the failure “never ran” rather than “ran and failed”? → Silence alert (severity if P1 path)
  3. Is it a known transient with bounded retry still in budget? → Wait; log
  4. Is it enrichment / optional enrichment? → Morning triage
  5. Unsure? → Treat as P1 once, then downgrade with evidence

Unsure defaults to loud once. Habitual over-paging defaults to mute. Calibrate with real incidents, not vibes.

Alert template worth pasting

Use one shape across Zapier digests, Make notifications, and n8n Error Workflows:

[P1] {{workflowName}} failed
Node: {{failedNode}}
Error: {{errorMessage}}
Exec: {{executionUrl}}
Owner: {{ownerPrimary}} (backup {{ownerBackup}})
Next: {{nextAction}}
Silence?: no — this is an execution failure

For silence alerts, swap the last line for Last success: {{lastSuccessAt}} (SLA {{maxSilence}}). Same channel discipline, different signal.

What “morning triage” actually means

Morning triage is not “ignore until angry.” It is a named queue with an SLA:

  1. Owner opens #automation-triage before first customer calls
  2. Sort by customer-visible impact, not by timestamp
  3. Pause anything still failing in a loop
  4. Replay or discard DLQ items with a written reason
  5. File one changelog note if a vendor caused it

If morning triage regularly spills past noon, you undersized ownership or over-automated enrichment noise into the wrong bucket.

Pairing overnight alerts with pause authority

Paging without pause rights creates spectators. The on-call person must be able to:

  • Deactivate the workflow (or flip a feature flag / dry-run)
  • Rotate or disconnect a bad credential
  • Tell sales/support the sync is paused
  • Open the DLQ and stop replaying poison

Write those four steps in the runbook next to the phone number. An alert that only says “failed” without pause authority is a status LED.

How this fits the spine

Overnight posture sits next to idempotency, DLQ, and schema checks — not instead of them. Alerts without a dead-letter path create panic without a fix queue. Alerts without ownership create noise. The handbook spine is the full list; this post owns who wakes and why.

FAQ

Is a Zapier error email enough?

No. Account-owner email is not an on-call system. Route P1 to a human who answers overnight, keep P2 for morning, and add silence detection so a Zap that quietly stopped still surfaces.

What belongs in an n8n Error Workflow alert?

Minimum: workflow name, execution URL, failed node, error message, severity, named owner, and whether the item was dead-lettered. Without those fields, the alert is noise people learn to ignore.

How do I stop alert mute?

Send fewer alerts. Split P1 and triage channels, collapse repeats, and never put enrichment skips in the pager path. Mute is a symptom of undifferentiated severity.

What is a heartbeat / dead-man check?

A periodic check that a workflow still produces successful runs on the expected cadence. It catches “never ran” failures that Error Workflows cannot see because no execution failed.

Should finance workflows page differently than Slack noise?

Yes. Finance, billing, and customer-contact paths default to P1. Internal Slack notifications and optional enrichment default to P2 or P3. Same rail, different blast radius.

Who is the named owner after hours?

A real person (and a backup) with authority to pause the workflow and access to credentials. “The agency” or “whoever built it” is not a name. Write primary and backup before activation.

CTA

If your automations only “email the account owner,” you do not have overnight coverage — you have hope.

For a production review of severity, heartbeats, and ownership, start at automation or book a call.

Book the audit