How SilentWatch works
Two check types cover almost everything that fails silently in a small SaaS: things that should run on a schedule, and things that should keep happening at a rate.
1. Create a check
Pick a heartbeat check ("this job must run every N minutes") or an event check ("we need at least N signups every X hours"). Each gets a unique, unguessable token.
2. Wire up one line
Add a ping call at the end of your job, or a webhook relay for Stripe events. Copy-paste snippets are generated for curl, Node, Vercel Cron, GitHub Actions, and Supabase Edge Functions.
3. We watch the clock
A scheduler runs every 1–5 minutes and compares the last signal against your interval + grace period, or your event count against your threshold.
4. You get emailed, not surprised
The moment a check goes quiet past its grace period, you get an alert email. When it recovers, you get a recovery email with total downtime.
Heartbeat check example
A nightly backup job that should run every 24 hours, with a 2-hour grace period.
#!/bin/bash
set -e
run_backup.sh
curl -fsS "https://silentwatch.app/api/ping/sw_your_token"Business-event check example
Alert if you get fewer than 3 signups in any 6-hour window — useful for catching a broken signup form that returns 200 but doesn't actually create an account.
await fetch("https://silentwatch.app/api/event/sw_your_token", {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ event: "signup" }),
});Stripe webhook relay
Point an additional Stripe webhook endpoint at SilentWatch alongside your real one. We count events by type, so you can alert if invoice.paid or checkout.session.completed events stop arriving.