Back to blog
uptime monitoring best-practices

How to monitor website uptime, and the best practices that make it reliable

A practical guide to monitoring whether your website is actually up: why it matters, how external checks work, and the best practices that stop both real outages and false alarms.

The Cronaut team

Your website being down is the one failure your customers notice before you do. The signup page returns a 500, the checkout stops loading, the certificate expires overnight, and the first you hear about it is a support email asking if you are still in business. By then the damage is done.

The fix is not complicated, and it is not expensive. A good uptime monitor checks your site from the outside on a schedule and tells you the moment something breaks. This guide covers why that matters, how to do it efficiently, and the best practices that keep the alerts honest.

Why monitoring uptime matters

You cannot watch your own site every minute, and the times it tends to break are exactly the times you are not looking: overnight, on a weekend, right after a deploy you thought was safe. Without monitoring, your mean time to detection is “whenever a customer complains,” which on a small product can be hours.

There is a direct cost to that gap. A storefront that is down is not taking orders. An API that is timing out is breaking every app that depends on it. Search engines that crawl a site returning errors will quietly demote it. And trust is hard to win back once someone hits a dead page during the one task they came to do.

Monitoring turns an outage from a silent, open-ended problem into a timestamped event you can act on. You find out in seconds, you know what broke, and you can fix it before most people ever load the page.

What “is my website up” actually means

A site can fail in more ways than “the server is off.” Efficient monitoring checks for the ones that actually hurt:

  1. The request fails outright. Connection refused, DNS does not resolve, the request times out, or the server returns a 5xx.
  2. The server responds, but with the wrong thing. It returns a 200 while serving an error shell, a maintenance page, or a blank body because a backend dependency is down.
  3. It is up but unusably slow. Responses that take ten seconds are a degraded outage even when the status code is green.
  4. The certificate is expiring. TLS expiry takes a working site fully offline in every browser the moment it lapses, with no warning unless you watch for it.

A status code alone only catches the first case. Good monitoring covers all four.

How external uptime checks work

The core idea is simple: something outside your infrastructure sends a request to your site on a fixed interval, inspects the response, and alerts when it is wrong. Running the check from outside is the whole point, because a monitor sitting on the same box as the site goes down with it and tells you nothing.

A solid check verifies three things on every run:

  • The status code. Confirm you get the code you expect, usually a 200, and treat anything else as a failure.
  • A keyword in the body. Assert that a known string actually appears on the page, so you catch the case where the server returns 200 while rendering an error. Checking for a word like “Sign in” or a product name proves the page rendered, not just that the socket opened.
  • The certificate. Track TLS validity and expiry on the same check, so an expiring cert warns you weeks ahead instead of becoming a 2am outage.

Recording response latency on every check gives you a fourth signal almost for free: you can see slowdowns building before they turn into timeouts.

Best practices

Check from the outside, and check the right URL

Monitor the URL a real user hits, over the public internet, end to end. Point the check at a page that exercises the parts that matter, your app shell or a lightweight health endpoint that touches the database, rather than a static file that stays up even when everything behind it is broken.

Assert content, not just a status code

A 200 is not proof the page works. Pick a keyword that only appears when the page rendered correctly and require it in the response. This single step catches the most common silent failure: a server that is technically responding but serving garbage.

Pick an interval that matches the stakes

A higher frequency means you find out sooner, at the cost of more requests. A marketing site is fine on a slower cadence; a checkout flow or a paid API deserves a tight one. Reads can be capped to a few kilobytes, since a check only needs the status code and a keyword, so a fast interval stays cheap even on a busy probe.

Require consecutive failures before you alert

The internet has blips. A single failed request is often a transient network hiccup, not an outage. Wait for two or three consecutive failures before declaring the site down, and treat a quick recovery as a non-event. This flap detection is the difference between an alert you trust and one you learn to ignore.

Set a latency threshold, not just up or down

Decide what “too slow to be useful” means for the page and alert on it. A site that takes fifteen seconds to respond is failing your users even though it never returns an error, and watching latency trends lets you catch the slowdown before it becomes a timeout.

Watch the certificate before it expires

Add SSL expiry to the same monitor and have it warn you weeks out. Certificate renewals fail quietly all the time, and “the cert expired” is one of the few outages that is completely avoidable with a single piece of monitoring. See SSL monitoring for what to track.

Route alerts where you already look

An alert nobody sees is not monitoring. Send failures to the place you actually watch, a Slack channel, email, or your on-call tool, and make the message say which check, what broke, and the status code or error. Alert on the change from healthy to down, not on every individual failed request, so an outage is one clear page instead of a flood.

Give the outage a public home

When the site does go down, the next thing that happens is people asking whether it is just them. A public status page that updates itself answers that question before the support tickets start, and it keeps your team from posting manual updates during the one moment they are busiest fixing the problem. The cleanest setup is one where a failed check opens the incident on its own. More on that in status pages without the busywork.

Test that the monitoring actually fires

Silently broken monitoring is worse than none, because you trust it. Once a check is live, break it on purpose, point it at a URL you know is down or returns the wrong keyword, and confirm you get paged. Repeat it whenever you change the alert routing. A check you have never seen fire is a check you should not rely on.

Putting it together

Monitoring website uptime well comes down to a handful of habits: check from the outside, assert the page actually rendered, allow for blips, watch latency and certificates, and make sure the alert reaches a human and your users. None of it requires a heavy platform.

Cronaut is built to make this the default. You give it a URL and an optional keyword, and it probes your site on a fast interval from a scalable fleet, checks the status code, content and SSL on every run, and records latency over time. It waits for repeated failures before paging you, opens an incident on your public status page automatically when a check goes down, and closes it when the site recovers. The same engine watches your cron jobs and SSL certificates, so everything that can break shows up in one place. See uptime monitoring for how the checks work, or read cron job monitoring best practices for the scheduled-job side of the same idea.

Try Cronaut free

Uptime, cron and a self-updating status page in one tool.

Start free