Why I Built an 'Incident Sieve' to Stop 2am Sentry Pagers (and the alert it missed)

How I stopped waking up at 2am for the same Sentry noise by adding a small webhook layer that groups, dedups, and enriches alerts — and the time it filtered out a real outage.

Written by: Arjun Malhotra

A person coding on a laptop at night with a coffee cup and dim desk lamp
Photo by Branko Stancevic on Unsplash

It was 2:14 a.m. The phone vibrated, my screen lit up: “error.rate spike — users:payments — Sentry”. I fumbled through half-asleep commits, muted the thread, and went back to bed. The same alert came again at 2:19 a.m. Then at 2:25. Same stack trace, different ID, same panic that wasn’t one.

This repeated for a month. Wake up, acknowledge, sleep. Repeat. My team was small — three on-call devs for a product used by tens of thousands of Indians each day — and we were paying for PagerDuty seats we barely used constructively. I hated those pings and I hated that they were mostly noise.

So I built a small webhook proxy — what I now call the “incident sieve” — that sits between Sentry (or any error source) and our pager/SMS/Slack endpoints. It doesn’t replace monitoring. It keeps the pager for real emergent situations, but it intercepts the recurring noise we were living with. I run it on a ₹300/month VPS, it uses Redis for state, and it saved me roughly three sleep interruptions a week. It also almost cost us a real outage. Honest tradeoff incoming.

What the alerts were doing wrong The core issue wasn’t Sentry. It was our alerting config and the downstream workflow.

In India, where on-call often means a late-night bike ride to a client’s data centre (or worse, explaining to family why your phone buzzes at 2 a.m.), the psychological cost of false alarms is big. We needed to reduce interruptions without introducing blind spots.

What the sieve does (without magic) I had three goals: group duplicates, add small context, and let humans override quickly.

Basic flow:

Implementation choices that mattered

Costs and runtime The whole thing fits in a single 256MB VPS (I use a ₹300/month provider plan) and a tiny Redis instance. Monthly cost including domain+SSL + VPS: ≈ ₹800–1,200/month for our small team. PagerDuty still costs us; we didn’t remove it. The sieve reduced our actionable pages by about 70%, so the PagerDuty noise felt tolerable.

The time it failed me (and what I changed) Two months in, on a sleepy Sunday, a poorly formed third-party response started returning a new error variant. The sieve grouped it under a fingerprint that had been noisy for weeks; because of suppression and my overzealous 10-minute window, it never paged. The Slack channel had summaries, but nobody looked until a user messaged our support channel at 10 a.m. We missed three hours of degraded payments.

That mistake taught me two things:

Limitations I live with

If you want to try this

Takeaway Noise is not just annoying — it trains teams to ignore pages. A small, transparent middleware that groups duplicates and enriches alerts saved me real sleep and made the pager meaningful again. Be conservative when suppressing: the one time I wasn’t, we missed three hours of user pain. My current rule: dedupe aggressively, but never suppress a change in error phenotype. That single rule rebuilt our trust in the pager — and let me finish a night’s sleep without the phone lighting up at 2 a.m.