A free Better Stack alternative — when you don’t need the on-call layer
Updated 26 August 2026 · by Cassian Wei · 5 min read
Better Stack is probably the most polished product in this space, and this guide will not pretend otherwise. It will instead explain the thing most "alternative" posts miss about it: Better Stack prices the human, not the monitor — and whether that's brilliant or a mismatch depends entirely on whether anyone needs to be phoned at 3am.
How Better Stack's pricing actually works
All figures from their own pricing page, August 2026:
- The free plan (labeled "Free for personal projects") includes 10 monitors & heartbeats and 1 status page, with Slack and e-mail alerts. Their uptime page states the free check interval plainly: 3-minute checks.
- The paid unit is a Responder license — from $29/month billed annually ($34 monthly) per person who can be alerted, buying on-call scheduling, incident management, and unlimited phone-call and SMS alerts. Plain team members are $0; you pay for each person the system may call. Their fastest checks (30-second) sit on the paid side too.
- Capacity is à la carte: an additional 50 monitors is $25/month, an additional 10 heartbeats is $20/month. Status pages likewise: a second public page is $15/month, custom CSS is $15/page/month, password protection $50/page/month, and white-labeling the footer is $250/page/month.
For a team running real on-call, this model is honestly good value: one $29 license replaces a PagerDuty seat and an uptime service, with unlimited voice/SMS where others sell alert credits. If that's you, this guide's advice is: pay them, it's a fair deal.
The mismatch: when nobody needs to be phoned
A lot of monitoring users have no on-call rotation at all — a solo developer, a small product team, an agency watching client sites. Alerts go to Slack, Telegram, or a phone's push notifications, and the person who fixes things is the person who built them. For that shape of user, Better Stack's ladder pinches twice:
- The free interval is 3 minutes. A short outage can start and end between checks; a real one is on average ~90 seconds old before the first failed probe, plus confirmation time. The whole point of the (excellent) paid 30-second checks is that detection latency matters — but the upgrade that buys them is a per-human license aimed at on-call.
- The upgrade buys the wrong thing. If you don't need phone calls, SMS or schedules, the Responder license's headline features go unused — you'd be paying for the on-call layer to get the faster checks underneath it.
A free tier shaped for monitors-and-alerts
Watchpup is the commodity layer done properly, free: 15 monitors, every one at 60-second intervals, mix of kinds up to you — HTTP checks with keyword/JSON-body assertions, custom headers and methods, heartbeat (cron) monitors that take real cron expressions with timezones, TCP ports, DNS records, and daily TLS-expiry and domain-expiry checks. Alerts go to email, signed webhooks, Slack, Discord, Teams, Google Chat, ntfy push and Telegram — all free, with delivery retries, per-monitor routing, quiet hours and escalation delays. Phone push here means the ntfy or Telegram app, not a voice call — if you need actual phone calls, see the previous section. Public status pages with visitor email subscriptions and embeddable widgets are included, and everything works over API, CLI or MCP.
Where Better Stack wins — honestly
- Everything on-call: schedules, escalation policies, incident timelines, post-mortems, unlimited voice/SMS, mobile apps. We have none of it and don't plan to be an incident-management product.
- 30-second checks (paid) vs our 60-second floor, and multi-location, geo-specific probes vs our single global edge network — no per-region "is it down in Asia?" view here.
- Failure forensics: error screenshots and traceroute/MTR captured at detection time, and hosted Playwright transaction checks that drive a real browser. Genuinely premium features we don't have.
- More probe protocols: POP3/IMAP/SMTP, UDP, ICMP ping and DNS-server checks. (We cover HTTP, TCP, DNS records, TLS and domain expiry.)
- A whole observability platform: logs, traces, metrics, error tracking and session replay under the same roof, with real free quotas.
- Track record and compliance: SOC 2 Type 2, thousands of customers, years of operation — vs a product in beta whose answers are a public changelog, a live demo and terms with written grandfathering and wind-down commitments.
Migrating: their API on the way out
Better Stack's Uptime API is clean, so trying this side by side is low-risk. Export your monitors with an API token, transform, and re-create them in one bulk call:
# 1. export (paginated — follow pagination.next if you have many)
curl -s -H "Authorization: Bearer $TOKEN" \
'https://uptime.betterstack.com/api/v2/monitors' > bs.json
# 2. transform to Watchpup bulk-import format
python3 - bs.json > monitors.json <<'EOF'
import json,sys
HTTPISH={"status","expected_status_code","keyword","keyword_absence"}
out=[]
for m in json.load(open(sys.argv[1]))["data"]:
a=m["attributes"]; t=a["monitor_type"]
if t in HTTPISH:
s={"kind":"http","name":a["pronounceable_name"],"url":a["url"],
"interval":max(60,a.get("check_frequency") or 180)}
if a.get("required_keyword"):
s["keyword"]=a["required_keyword"]
if t=="keyword_absence": s["keyword_absent"]="absent"
if a.get("expected_status_codes"):
s["expect"]=",".join(map(str,a["expected_status_codes"]))
if (a.get("http_method") or "get").lower()!="get":
s["method"]=a["http_method"].upper()
if a.get("request_headers"):
s["headers"]={h["name"]:h["value"] for h in a["request_headers"]}
if a.get("request_body"): s["body"]=a["request_body"]
out.append(s)
elif t=="tcp":
out.append({"kind":"tcp","name":a["pronounceable_name"],
"target":"%s:%s"%(a["url"],a["port"])})
print(json.dumps({"monitors":out,"skip_existing":True}))
EOF
# 3. import into Watchpup (re-runs skip monitors you already have)
curl -X POST https://watchpup.watchpup.workers.dev/api/monitors/bulk \
-H 'authorization: Bearer wp_...' -H 'content-type: application/json' \
-d @monitors.json
Notes: keyword and keyword-absence rules, expected status codes, custom
headers/methods/bodies all carry over; 30-second frequencies clamp to our 60-second
floor. Ping/UDP/SMTP/POP3/IMAP/DNS-server and Playwright monitors don't import —
no equivalent here (though a {"kind":"dns"} record check may cover the
DNS case). Heartbeats can't be imported either (ping URLs necessarily change):
re-create them as heartbeat monitors — you
get real cron expressions with timezones — and update the URLs in your crontabs.
If your monitors had ssl_expiration or domain_expiration
thresholds set, add tls and domain monitors for those
hosts; here they're first-class kinds that don't spend your HTTP checks.
Or run both — the layered setup
These products slice differently enough that "both" is often right: keep Better Stack for on-call and phone alerts on the services that justify a Responder license, and put the long tail — staging boxes, client sites, cron jobs, cert expiry across every subdomain — on 60-second checks here for $0. Each can watch the other's status page, so your monitoring has no single vendor as a point of failure.
Pricing and feature claims checked against Better Stack's own pricing, uptime and API docs pages, August 2026. Trademarks belong to their owners; no affiliation. Spot an error? Tell me — corrections ship same-day.
Watchpup is free uptime & cron monitoring — 1-minute checks, heartbeats, TLS/domain expiry, status pages, alerts everywhere. Sign up, try the live demo, or read more guides.