The tool decision is simpler than it looks. You need four things: a public page on your own domain, components you can flip between operational, degraded and down, templated updates with phases, and subscriber notifications by email or SMS. A managed product such as Statuspage, Instatus or Better Stack gives you all four on day one. A self-hosted option such as Cachet or Upptime gives you control and a lower recurring cost but puts availability on you, which is the wrong trade for a team whose page must stay up precisely when your own infrastructure is not.
The decision rule: if your status page will be hosted on the same infrastructure as the product it reports on, self-hosting is disqualified. A status page that goes down with your API is worse than no status page, because it looks like everything is fine. Host it somewhere else or pay someone who does.
Components are where most teams get this wrong. Engineers instinctively model the stack: load balancer, app servers, Postgres primary, Redis, the queue. Customers do not buy those. They buy outcomes. A defensible component list for a typical subscription product:
| Component | What it tells the customer | Granularity |
|---|---|---|
| Dashboard and web app | "Can I get into the product and see my data?" | Group the internal services behind it |
| API | "Do my integrations work?" | One entry, not one per endpoint |
| Login and SSO | "Can my users sign in?" | Separate because it has a distinct failure mode |
| Webhooks and background jobs | "Are my events being delivered, eventually?" | One entry, with delivery delay described in updates |
| Billing and checkout | "Can I pay you?" | Separate because it triggers the loudest support tickets |
For each component, publish the current state and an uptime figure over a fixed window. The openstatus best-practice guide recommends a simple, memorable URL such as status.yourcompany.com, a prominent link from your app footer and support docs, and honest reporting even of minor issues. Uptime history is worth having because it converts an argument ("you are always down") into a number.
One caution on uptime percentages: define what counts. A component that is degraded for six hours is not down, and customers will read a 99.9% figure as a claim about their own experience. State on the page whether degraded time counts against uptime, and keep the measurement method consistent.
Finally, subscriber notifications. Let people subscribe to all components or only the ones they care about. An integration customer who gets paged because your dashboard had a cosmetic issue will unsubscribe, and then they miss the API outage that actually matters to them.



