Skip to content

Docs & examples

What to watch, and how.

Holter watches two ways. Inbound heartbeats — your jobs ping us when they finish, and we alert if a ping goes missing. Outbound checks — we request your URL, cert, port or DNS from the outside on a schedule. No server agent, no access to your servers. And on Business, dependencies — we watch the status pages of the vendors you rely on, so you hear about their outages first.

Inbound heartbeats

A dead-man switch: ping us on success, and we alert if it goes quiet. Great for backups, queue workers, crons, pipelines and webhooks.

1 · Create your inbound heartbeat

New monitor preview

How Holter watches

Send an event to Holter Holter checks endpoint

Name

Nightly DB backup

Alert if no ping in

1 day

Your ping URL

https://holter.sh/e/abc…/nightly-db-backup-x7k2qa

Holter generates this — copy it from the dashboard.

2 · Then curl it from your job

# success — at the end of the job
pg_dump … | gzip | aws s3 cp - s3://… \
  && curl -fsS "$HOLTER_URL"

# failure — alert right away
curl -fsS "$HOLTER_URL/fail"

Miss the window and Holter opens an incident and alerts your channels. Same pattern for queue workers (ping every few minutes) and crons (append the curl to the line).

Prefer email? Switch the heartbeat to a unique address (…@in.holter.sh) and have your app send to it on a schedule. If your mail stops going out, Holter tells you — it watches the whole send pipeline, not just your code.

Outbound checks

We reach your service from the public internet on a schedule — nothing to install. Great for uptime, API health, SSL, domain, DNS and TCP.

Create an outbound check

New monitor preview

How Holter watches

Send an event to Holter Holter checks endpoint

What to check

HTTP endpoint (status / body / latency)

Endpoint

https://api.yourapp.com/health

Healthy status

200

Alert if slower than

2000 ms

What it catches

  • ● Down, or the wrong status code
  • ● Up but slow past your latency budget (degraded)
  • ● Recovered — with the outage duration

Switch What to check to SSL, Domain, DNS or Redirect — same screen, just a URL, no extra fields. Cert and domain checks warn you days before expiry.

Tip: inside Holter, “What to watch” sets any of these up for you in a click.

Watch what you depend on Business

Some outages aren't yours. When Stripe, AWS, your auth provider or database host has an incident, your app feels it — and your customers blame you. Add those vendors as dependencies and Holter watches their public status pages, so you hear it from an alert first.

Add a dependency

New monitor preview

Vendor

Stripe

Status page URL

https://status.stripe.com

Or pick from 24 popular vendors we already know how to read.

What depends on this?

Checkout

Alert me

On any degradation Only when fully down

What it catches

  • ● A vendor — or one of its components — reports degraded service
  • ● A vendor reports a full outage — alerted to your channels
  • ● Recovered — the upstream incident cleared

Holter reads each vendor's own published status page every few minutes — it doesn't probe their systems. Works for any page with a public status feed (most SaaS), with built-in support for AWS, Google Cloud and Azure.

Optionally list chosen dependencies on your own status page as “Upstream services.”

Status badges

Every public status page exposes an embeddable SVG badge — a live snapshot of your status or uptime you can drop into a README, wiki, or your own site. No API key, and it refreshes on its own.

Grab the snippet

New monitor preview

Badge URL

https://app.holter.sh/status/your-page/badge

Markdown

[![Status](…/status/your-page/badge)](https://status.your-domain.com)

Uptime variant

https://app.holter.sh/status/your-page/badge?metric=uptime

Live example

Holter live status badge Holter live uptime badge
  • ✓ Self-updating — reflects your real status within a minute
  • ✓ Public and self-contained — renders anywhere an image does

Set it up with your coding agent (MCP)

Rather than fill in the forms above by hand, let your agent do the first pass. Holter runs an MCP server — connect Claude Code, Cursor, or any MCP-capable agent with a team-scoped token and it reads your repo locally, proposes the monitors it finds (crons, queues, health checks, domains), and writes the heartbeat code for you to review.

1 · Add the MCP server

{
  "mcpServers": {
    "holter": {
      "type": "http",
      "url": "https://app.holter.sh/api/mcp",
      "headers": { "Authorization": "Bearer ${HOLTER_TOKEN}" }
    }
  }
}

Grab a team-scoped token from Settings → MCP and set it as HOLTER_TOKEN. The token is the only thing the agent needs — it is scoped to your Holter team and carries no access to your code, servers, or cloud.

2 · Then just ask

"Set up Holter monitoring for this repo —
read holter.sh/use and follow it."
  • ✓ It reads your codebase locally — Holter never gets your source
  • ✓ It proposes the monitors and heartbeat code; you review and apply every change
  • ✓ It works through the token, never your keys — it can't touch your systems

Production monitoring checklist

Every line is a 3-minute setup — or one tap from “What to watch” inside the app.

Reachability
  • Homepage / main app responds

    Outbound HTTP check, expect 200

  • API or health endpoint responds

    Outbound HTTP check on /health, optionally match a body string

  • Response time within budget

    Add an "alert if slower than" latency budget

  • HTTP redirects to HTTPS

    Outbound redirect check

Certificates & domains
  • TLS certificate not near expiry

    Outbound SSL check

  • Domain not about to lapse

    Outbound domain check (RDAP)

  • DNS still resolves

    Outbound DNS check

Background work
  • Nightly backup completed

    Inbound heartbeat from the backup script

  • Queue workers alive & draining

    Inbound heartbeat from a scheduled worker ping

  • Scheduled jobs / crons ran

    Inbound heartbeat at the end of each cron

  • Critical pipelines (ETL, billing runs)

    Inbound heartbeat on success, /fail on error

  • Transactional email still sending

    Inbound email monitor — your app emails a unique address on a schedule

Plumbing
  • Database / cache port reachable

    Outbound TCP check (public host:port)

  • Third-party webhooks still firing

    Inbound heartbeat from your webhook handler

  • Status page published

    Turn one on so customers self-serve during incidents

Upstream dependencies · Business
  • Payment provider status

    Add Stripe (or your processor) as a dependency

  • Cloud / hosting provider status

    Add AWS, GCP, Azure, Vercel… as a dependency

  • Critical third-party APIs

    Add OpenAI, Twilio, SendGrid… — anything core flows need

Start with one check.

Free for 5 monitors, no card. Tick off the rest of the list as you go.

Start watching free