Alerts/alerts

Told when it matters, not when you remember to look

The most expensive analytics failure is not a wrong number, it is a right number nobody looked at for nine days. Alert rules run every five minutes against your own data and tell the channel your team is already in.

The alerts page: delivery channels, a list of alert rules with their conditions, and a history of firings.The alerts page: delivery channels, a list of alert rules with their conditions, and a history of firings.
Channels, rules and firing history

Four rule kinds, including the one that catches a broken install

Threshold rules for a figure crossing a line, anomaly rules for a figure leaving its usual range, error-spike rules for a sudden rise in JavaScript errors, and no-data rules, which catch the deploy that removed the tracker, the failure mode that otherwise presents as a quiet week.

An alert rules panel listing rules with their type, metric, condition and status.An alert rules panel listing rules with their type, metric, condition and status.

Delivered where the team already is

Slack, email or a generic webhook. Email goes out through Resend when it is configured, and the delivery result is recorded on the alert event itself, so a rule that fired but never reached anybody looks different from a rule that never fired.

A delivery channels panel listing configured Slack, email and webhook destinations.A delivery channels panel listing configured Slack, email and webhook destinations.

History and cooldown

Every firing is recorded with its value and its outcome. Cooldowns stop a flapping metric from producing forty notifications overnight, which is how a team learns to mute the channel, at which point the alerting is worse than none.

An alert history panel listing past firings with time, rule, value and delivery outcome.An alert history panel listing past firings with time, rule, value and delivery outcome.
Specifics

How it works, precisely

Rule types
threshold · anomaly · no_data · error_spike
Evaluation
Every five minutes, with a distributed lock so one instance evaluates each rule
Channels
Slack, email (Resend, SMTP or log), generic webhook
Noise control
Per-rule cooldown, with firing history retained

Run it yourself this afternoon

Clone the repository, bring up the stack with Docker Compose, paste one script tag. The data never leaves your machines.