Your app is up.Is it working?
A ping only checks that your server answers. Staygreen checks what it answers, that your crons did their job, and that Stripe’s webhooks arrived.
Free for 50 monitors, with commercial use. No card.
{
"status": "ok",
"db": {
"ok": true, "latency_ms": 41
}
}$.db.ok is true, as expected.Failures that pass a ping
Each one is a check you add in a minute, or that your coding agent adds for you. Coming soon means it isn’t running yet, and you don’t pay for it.
Your API says 200 while the database is gone
Assertions on the JSON body, like $.db.ok == true. A wrong value is an outage, even with a 200.
GET askone.org/api/health returned 200 in 182 ms
- Status is 200200
$.db.okequalstruefalse- Answers within 1.5 s182 ms
{"status":"ok","db":{"ok":false,"error":"too many connections"}}GET /api/health returned 200, but $.db.ok == true got false.
{"db":{"ok":false,"error":"too many connections"}}Alerts that say what broke
A failed request is checked again from a second location before anyone is woken. The alert carries the request, what it got and the response, so you can start fixing from your phone.
- Email, Telegram, Slack, Discord or a signed webhook
- A recovery notice when it’s fixed
- On Telegram, acknowledge or pause from the message itself
Your users see it too
A status page on your own domain, in your colours. And a banner inside your app while something is wrong, so people don’t have to go looking.
You write the update, or your agent drafts it for you to publish. Free includes one page with HTTPS on your domain.
- WebsiteOperational
- Live Q&A roomsOperational
- Live votingOutage
- Sign-inOperational
Your coding agent can read it
Staygreen has an MCP server and a REST API on every plan. Ask Claude Code or Codex what’s broken and it gets the evidence, not a guess. It can set up monitoring for a new app from its URL.
> Is anything broken in askone? staygreen: get_incidents(app: "askone", state: "open") One open incident since 14:02: API health. /api/health returns 200, but $.db.ok is false from San Francisco and Toronto. The body says "too many connections". Your pool max is 10 in lib/db.ts. Raise it to 25 and draft a status update for you to publish? > yes staygreen: draft_incident_update(incident: "inc_7Qa2", state: "identified", text: "…") Draft saved. It's not public until you publish it.
Free for most apps
Builder is for when you run several apps, or want checks every minute.
Free
$0No card.
- Uptime, SSL, DNS, TCP and heartbeat monitors
- Checks that read what your app returns
- Stripe webhook and Supabase project checks
- Email, Telegram, Slack, Discord and webhook alerts
- A status page on your own domain
- MCP server for your AI agents
- 1 app, 50 monitors and 5 heartbeats
- HTTP checks every 3 minutes from 2 locations
- Commercial use allowed
Builder
$7.50a month, billed yearly. $9 billed monthly.
- Everything in the free plan
- 10 apps, 100 monitors and 50 heartbeats
- 1-minute HTTP checks from 3 locations, one in Europe
- No Staygreen mark on your status pages
- Members-only status pages
- Alert routing by severity
- Teammates alerted without an account
- 1 year of history
Start free, then upgrade from your workspace’s billing whenever you need it.
Compare everything in each plan
What the same things cost elsewhere
The cheapest plan that unlocks each one, from each vendor’s own pricing page on . Billed monthly unless it says otherwise.
| Feature | Staygreen | UptimeRobot | Better Stack | OpenStatus | Hyperping |
|---|---|---|---|---|---|
| Stripe webhook failures | Free | Not offered | Not offered | Not offered | Not offered |
| A paused Supabase project | Free | Not offered | Not offered | Not offered | Not offered |
| Webhook alerts | Free | €41/moTeam | Its pricing page doesn't say which plan | $30/moStarter | $24/moEssentials, billed yearly |
| Checks every minute | Builder | €10/moSolo | $34/moOne responder seat | $30/moStarter | $24/moEssentials, billed yearly |
| A status page on your own domain | Free | €10/moSolo | Its pricing page doesn't say which plan | $30/moStarter | $24/moEssentials, billed yearly |
| A status page without the vendor's name on it | Builder | €41/moTeam | $284/moA seat, plus white-label for one page | $330/moStarter plus white-label | $249/moBusiness, billed yearly |
Stripe webhook failures
- Staygreen
- Free
- UptimeRobot
- Not offered
- Better Stack
- Not offered
- OpenStatus
- Not offered
- Hyperping
- Not offered
A paused Supabase project
- Staygreen
- Free
- UptimeRobot
- Not offered
- Better Stack
- Not offered
- OpenStatus
- Not offered
- Hyperping
- Not offered
Webhook alerts
- Staygreen
- Free
- UptimeRobot
- €41/moTeam
- Better Stack
- Its pricing page doesn't say which plan
- OpenStatus
- $30/moStarter
- Hyperping
- $24/moEssentials, billed yearly
Checks every minute
- Staygreen
- Builder
- UptimeRobot
- €10/moSolo
- Better Stack
- $34/moOne responder seat
- OpenStatus
- $30/moStarter
- Hyperping
- $24/moEssentials, billed yearly
A status page on your own domain
- Staygreen
- Free
- UptimeRobot
- €10/moSolo
- Better Stack
- Its pricing page doesn't say which plan
- OpenStatus
- $30/moStarter
- Hyperping
- $24/moEssentials, billed yearly
A status page without the vendor's name on it
- Staygreen
- Builder
- UptimeRobot
- €41/moTeam
- Better Stack
- $284/moA seat, plus white-label for one page
- OpenStatus
- $330/moStarter plus white-label
- Hyperping
- $249/moBusiness, billed yearly
Not offered means it isn’t among the monitor types the vendor lists, read on . Watching Stripe’s own status page doesn’t count: it can’t see your failed deliveries. UptimeRobot showed its prices in euros, so they stay in euros here. OpenStatus’s pricing table covers only its paid plans, so for webhooks, an own domain and a page without its name, its prices are on its cheapest paid plan. Prices change: check UptimeRobot, Better Stack, OpenStatus and Hyperping before you decide.