There's a category of system that only gets exercised on its worst day: backups, failovers, and alerting. Everyone eventually learns to test the first two — restore drills and failover days are standard practice. Alerting somehow stays exempt, running untested for months on the assumption that a thing configured correctly in January still works in August. Then the outage comes, and the postmortem contains the sentence every on-call dreads: "the alert fired, but nobody received it."

Alert pipelines rot silently because every failure mode lives downstream of the monitoring service. The monitor detects the outage, opens the incident, dispatches the alert — and the Slack webhook returns an error because someone archived the channel in a spring cleanup, or the email lands in spam, or the push notification arrives on the phone of an engineer who left in March. From the monitoring dashboard, everything worked. From the humans' side, nothing happened.

The fix is the same as for backups: drill it. Break something on purpose, on a schedule, and watch the alert travel the whole path to an actual human. Here's how to do it in about fifteen minutes a quarter.

How alerting rots: the failure catalog

  • Archived Slack channels. The #alerts channel gets archived or renamed in a workspace tidy-up; the incoming webhook dies with it. Nothing notifies the monitoring side.
  • Email drift. Alert mail worked for a year, then a new spam rule, a full shared inbox, or a company-wide filter migration quietly reroutes it. Deliverability is a moving target even when nothing on your side changed.
  • The org-chart failure. Alerts route to the person who set up monitoring. That person changes teams or companies. The address still accepts mail; no human reads it. This is the single most common way small teams lose alerting — the same dead end that kills automation-platform failure emails.
  • Muted channels and DND. The channel exists and receives the message — under a mute someone set during a noisy week and never lifted. Or the push notification arrives on a phone whose overnight Do Not Disturb doesn't except it. Delivered, technically.
  • Rotated integration keys. A PagerDuty service gets reorganized, a webhook receiver changes its URL, an API key is rotated in a security pass — every credential between your monitor and your pager is a thing that expires.
  • Routing gaps. The channel works; the new monitor just isn't attached to it. Every monitor added since the last audit is a chance for "we monitored it but didn't alert on it."

Notice what's absent: monitoring-service outages. The weak link is almost never detection — it's the last mile between the incident and a human's attention.

Level 1: channel tests (monthly, one click each)

Every alert channel in CronAlert has a test button that dispatches a real test alert through the real integration — the actual webhook call, the actual email send. Click it for each channel and confirm the message arrived where a human looks: in the Slack channel (not just accepted by the API), in the inbox (not spam), on the phone's lock screen.

This catches dead webhooks, bad addresses, and revoked keys in seconds. What it can't catch is everything upstream and downstream of delivery — which is why it's level 1 of 3, not the whole exercise.

Level 2: the fire drill (quarterly, fifteen minutes)

The drill exercises the pipeline the way a real outage does: a monitor detects a genuine failure and everything downstream runs for real.

  • Set up a drill target you control. The cleanest is a route on your own app that returns HTTP 500 (a one-line handler), a subdomain with no DNS record, or a test container you can stop. Don't repoint a production monitor — add a dedicated drill monitor that lives permanently in your account, attached to every alert channel you actually rely on. On CronAlert's free plan that's one monitor out of 25.
  • Start the clock and break it. Deploy the 500, stop the container, or flip the feature flag. Note the time.
  • Watch the three clocks. Detection: how long until the monitor confirms the failure — governed by your check frequency and confirmation policy, so this also validates that your interval matches your expectations. Delivery: how long until the alert shows up on each channel. Response: how long until a human acknowledges — in the drill, whoever is on point replies "ack" in the channel.
  • Fix the target and verify recovery. The up/recovery notification is half the system — during a real incident, a missing "resolved" message keeps people debugging a fixed problem.
  • Record the numbers. A three-line note per drill (detection, delivery per channel, ack) turns the exercise into a trend. The quarter where email delivery goes from 40 seconds to "never arrived" is the quarter the drill paid for itself.

If you use heartbeat monitors, drill those too: pause the ping (comment out the curl line, disable the workflow step) and confirm the missed-beat alert fires after the grace period. Heartbeat pipelines have an extra failure mode HTTP monitors don't — a wrong grace window that means alerts fire days late or not at all — and only a drill surfaces it.

Level 3: the human path (once a year, or when on-call changes)

Delivery to a device is not delivery to a person. Once a year — or whenever the on-call roster changes — run the drill at an inconvenient hour, with consent, and verify the 3 AM path: does the page override Do Not Disturb (PagerDuty-style tools and phone notification settings both have per-app overrides worth configuring), does the escalation move to the next person when the first doesn't ack, and does the person waking up have what they need — a runbook link, dashboard access from a phone, credentials that don't live on the laptop at the office?

Small teams skip this level because it feels heavyweight. Do it once anyway: the first run almost always finds something — most often that "escalation" is a concept the team has discussed but never configured. Our on-call guide for small teams covers setting that up without enterprise tooling.

When to re-test outside the schedule

  • A team member leaves — audit every channel and monitor routed to them, then drill.
  • Slack/Teams workspace migrations, channel renames, permission changes.
  • Any new alert channel or escalation change — test on creation, not on first incident.
  • Email provider or domain changes on either side.
  • A quiet quarter. Ironically the strongest trigger: if you haven't seen a single alert in months, either your systems are perfect or your alerting is dead. Only the drill knows which. (This is also the argument for keeping alert volume low — a noisy pipeline gets accidental testing daily; a quiet one needs deliberate testing.)

Frequently asked questions

How do I test alerts without causing a real outage?

A dedicated drill monitor pointed at a target you control — a 500 route, an unresolvable subdomain, a stoppable test server. The pipeline runs for real; production stays up.

How often should I test?

Channel test buttons monthly; full drill quarterly; the 3 AM human-path drill yearly or when on-call changes; ad-hoc after any change to channels, workspaces, or team membership.

What breaks alerting most often?

Archived Slack channels, spam-filtered email, departed employees still holding the routing, muted channels and DND, and rotated integration keys. All invisible until tested.

What should the drill measure?

Detection time, delivery time per channel, and human acknowledgment time — plus a check that the recovery notification fires.

Is the channel test button enough?

It proves delivery works today. It doesn't prove detection, routing, or that a human notices. Buttons monthly, drills quarterly.

Trust is a test result, not a setting

Monitoring you haven't drilled is monitoring you hope works. The full exercise is one drill monitor, one broken route, and fifteen minutes a quarter — cheaper than the first hour of any undetected outage. Create a CronAlert account, add your channels, click every test button, then schedule the first real drill for this week. The free plan's 25 monitors and email, Slack, Discord, webhook, and push channels cover the whole exercise; PagerDuty, Teams, and Telegram routing come with Pro at $5/mo.

Related reading: how often to check your site, reducing alert fatigue, incident response for small teams, and eliminating false positives.