An uptime status poster on AWS for a few dollars a month
There are two ways a status page fails and most small businesses manage both. It goes down with the thing it monitors, so during the one hour it exists for it shows nothing. And it reports that the server is responding while customers cannot check out, because it pings a home page. This post walks through a small system built to avoid exactly those two things.

Key takeaways
- Check journeys, not hosts. A 200 from the home page says almost nothing.
- Check from three regions, and require agreement before calling anything down.
- The status page is hosted on infrastructure that shares nothing with your site.
- Automated status publishes itself; the human incident note is drafted and published by a person.
- Designed on AWS for about $3 a month.
The whole system on one page
Before any code, here is the shape of what we are designing.
- Networking
- Management
- Analytics
- Front-end & mobile
- People
- Outside AWS
The independence requirement
A status page that lives on the same server, behind the same load balancer, in the same region, on the same DNS as your product is not a status page. It is a second copy of the thing that is broken.
So the requirement is stated as a rule rather than a preference: the publishing path shares nothing with the monitored path. Different region. Different bucket. Ideally a different domain or at minimum a subdomain whose DNS could survive the main zone being the problem. Part 4 works through what that means concretely and where the honest compromises are.
What runs every minute (the inside)
- The checkers. One per region, running the journeys as real requests: a login that authenticates, a search that returns results, a checkout that reaches the payment step. Part 2 covers what a journey check is and what it must not do.
- The decider. Takes three regional opinions and decides. Agreement first, then consecutive failures, then a state change. Part 3 is entirely about not calling an outage because one region had a bad minute.
- The publisher. Writes a static page to a bucket in a different region behind its own distribution. The page is plain HTML with no JavaScript, because a status page has to render on a phone on a train.
One incident, end to end
- App integration
- Management
- People
- Outside AWS
In plain words
At 14:06 the checkout journey fails from Ireland and Frankfurt. London still succeeds, so nothing is published: two out of three is a disagreement, and disagreement usually means a network problem between a checker and you rather than an outage.
At 14:07 London fails too. All three agree, but one round of agreement is not enough. At 14:08 all three fail again, and the status page changes to “Checkout: degraded” automatically. Total elapsed time from the first symptom: two minutes.
At the same moment a message goes to whoever is on call with a drafted note: “Checkout is currently failing. We are looking into it.” They read it, agree, and tap publish, and now the status page says something a customer can understand rather than just a red dot. The whole sequence took four minutes and the customer emailing to ask whether it is just them has somewhere to look.
Design rules that shaped every decision
- The publishing path shares nothing with the monitored path. That constrains everything else.
- Check journeys, not hosts. A working home page is not evidence of a working business.
- Require agreement across regions. One checker cannot distinguish your outage from its own.
- Two consecutive agreeing failures. One is a blip and publishing it is worse than waiting.
- The status changes itself; the sentence customers read is published by a person.
- The page is static HTML, no JavaScript. It has to render badly on a bad connection.
Why this shape
Uptime monitoring is a solved problem with a dozen good hosted options, and for most businesses buying one is the right answer. The reason to build a small one is the status page rather than the monitoring: a hosted checker tells you, and a status page tells your customers, and the second is the thing that reduces support load during an outage.
So the design puts almost all of its care into the publishing path being independent and the page being readable, and treats the checking itself as the straightforward part. That is the opposite emphasis from most monitoring tools, and it follows directly from asking what the thing is for.
The next four posts walk through each piece: what a journey check actually does, how a check becomes an outage, how the page is served independently, and how an incident gets closed. One diagram per post, a cost breakdown, and an engineering reference at the end.
All posts