Blog
How to structure components, define honest status levels, pace incident updates, announce maintenance and host your status page so it stays up when you are down.
The core status page best practices are simple to state: list components the way customers experience your product, use a small set of status levels with written criteria, update on a fixed cadence during incidents, announce maintenance in advance, notify subscribers only when it matters, and host the page on a custom subdomain outside your own infrastructure. A status page is only useful if it stays reachable, stays honest and stays current during the exact moments your own systems are failing. The rest of this guide turns each of those points into concrete decisions, thresholds and checks.
If you are still deciding whether you need a status page at all, start with this overview of what a status page is and what belongs on it. This article assumes you have one, or are about to set one up, and want it to work under pressure.
The most common mistake is mirroring your internal architecture. Customers do not know what "worker-pool-b" or "pg-replica-eu" means, and they should not have to translate it. Name components after things customers do or touch.
A useful test: could a support agent read the component name aloud to a customer without explaining it? If not, rename it.
Web App
- Login and authentication
- Dashboard
- File uploads
API
- REST API
- Webhooks delivery
Integrations
- Slack integration
- Billing and payments
Regions
- EU (Frankfurt)
- US (Virginia)Some guidelines that keep the list readable:
Map each public component to the internal checks behind it. That mapping lives in your runbook, not on the page, and it lets the on-call engineer decide quickly which component to mark.
Use a small, fixed vocabulary and define each level in writing before you need it. Ambiguity during an incident leads to the worst habit on status pages: everything stays green because nobody wants to be the one who flips it.
A practical set of status levels with example criteria you can adapt:
The numbers are placeholders. Pick values that match your normal baseline and write them into the runbook so the decision is mechanical.
Honesty rules worth adopting as a team:
Partially. Automating clear-cut failures, such as a component failing checks from several regions at once, gets the page to amber or red within minutes instead of whenever someone remembers. Automating everything is risky: a single flaky probe can flip a component back and forth and destroy trust faster than a slow manual update.
A reasonable split is automatic status changes only after confirmation from multiple locations and consecutive failures, with incident text always written by a human. The same techniques that keep alerts quiet apply here, see how to reduce false positive alerts with multi-region checks and retries.
Speed of the first post matters more than its completeness. Then a predictable rhythm matters more than the content of each update. Customers refresh the page; silence reads as "they do not know" or "they do not care".
A cadence that works for most small and mid-sized teams:
Assign one person as the communicator for the incident, separate from whoever is debugging. Engineers deep in a fix forget the clock. The wording of each stage is covered in detail in how to write an incident status update, so this article stays with timing and structure.
Planned work is where a status page earns trust cheaply. You control the timing, so there is no excuse for surprises.
Zero-impact maintenance usually does not need an announcement. Posting every routine deploy trains subscribers to ignore you.
Subscriber notifications are the push side of the page. They reach people who will not think to check the page, which is most of them. They also become spam quickly.
Send notifications for:
Do not send notifications for every 30-minute "no change" update. Those belong on the page, not in inboxes.
Two technical details are easy to overlook. First, confirm subscriptions with a double opt-in and include a one-click unsubscribe, or you will end up with bounced and complaining addresses. Second, check what sends those emails. If notifications go through the same mail setup as your application and that setup is part of the outage, your subscribers hear nothing exactly when they should.
A status page that runs on the same servers, cloud account, CDN or database as your product will go down with it. That is the one failure mode you cannot afford. Independent hosting is the best practice that matters most and gets checked least.
Walk through every dependency of the page and ask whether it is shared with production:
A custom subdomain such as status.example.com tells customers the page is official and is easy to remember. With a hosted page this is usually a CNAME record:
status.example.com. 3600 IN CNAME your-page.status-host.example.Verify it from outside your network and check that HTTPS works on the custom domain:
dig +short status.example.com CNAME
curl -sSI https://status.example.com | head -n 1Then run the real test: during a game day or maintenance window, pretend production is gone and try to load the page, log in and publish an update using nothing that depends on your own stack. Monitor the status page URL itself with an external check as well, because nobody notices a broken status page until the day it is needed.
Public pages work for most SaaS products and reduce tickets the most. A password-protected page fits internal platforms, single large customers or B2B products where you do not want to expose component names. The same practices apply to both.
Any hosted status page service that runs outside your infrastructure can cover most of this checklist. As one option, m0nitor's public status pages show current and historical availability per component, active incidents and scheduled maintenance, and support a custom domain via CNAME, password protection for private pages, email subscribers, multiple languages and a public incident history. Incident templates with placeholders can help keep first posts fast and consistent. The checklist above applies regardless of the tool you choose.
Customer-facing components with their current status, active incidents with timestamped updates, upcoming scheduled maintenance, a history of past incidents and a way to subscribe to notifications. Internal service names, raw metrics and vendor names usually do not belong there.
Post the first update within 10 to 15 minutes of confirming impact, then update at least every 30 minutes until the issue is resolved, even if nothing has changed. Always state when the next update will come.
No. If the page shares hosting, DNS, CDN or login with your product, it can fail at the same time. Host it independently, ideally with a custom subdomain pointing to an external provider, and test that you can publish updates while production is unavailable.
Automate component status for confirmed failures detected from multiple locations, so the page reacts within minutes. Keep incident messages human-written, because automated text cannot explain impact, workarounds or next steps in a way customers trust.