HIVE80lab — Ops notes

Status Page Template: What to Tell Customers During an Outage (Before They Ask)

A status page is not infrastructure — it is a promise with a timestamp. Four statements: what is broken, what we know, what we are doing, when the next update lands. You do not need a vendor product to keep that promise; you need one static HTML page and the discipline to publish it before the first customer email arrives.

1. The four statements every update carries

2. The component model: five rows, not forty

Your status page is for customers, and customers can hold about five things in their head. One row per customer-visible capability — for a typical SaaS: Website, App / Dashboard, API, Payments / Checkout, Webhooks. Every row has three states only: Operational, Degraded, Outage. If your page has forty microservice rows, you have built an internal dashboard and pointed customers at it. The five-row version also forces the only question that matters at 3am: which rows are lying?

3. Update cadence, welded to severity

The cadence belongs in the severity matrix, not in someone’s memory — the severity row already defines who is told and how often; the status page is just the channel that keeps that promise in public.

4. The template itself

One static HTML file, deployed with your site, zero dependencies. Copy, edit the rows, ship:

<h1>Service status</h1>
<p>All systems operational.</p>   <!-- the ONLY text on a green day -->

<!-- during an incident, replace with: -->
<p><strong>[Degraded] Checkouts are failing for some customers.</strong></p>
<p>Started: 09:12 AEST · We know: card payments fail at 3DS step ·
   Doing: payment provider engaged, failing queue paused ·
   Next update: by 09:45 AEST.</p>
<p>Workaround: invoices can still be paid by bank transfer.</p>

<!-- resolution: -->
<p><strong>[Resolved] 10:58 AEST</strong> Card payments recovered at 10:41.
   Cause: provider-side 3DS timeout. Change: automatic failover to
   secondary provider. Full write-up linked in the incident report.</p>

Three states, four statements, one page. During an incident you are editing one file and re-uploading it — the tooling must never be the thing that is down.

5. Wiring it in one afternoon

6. The traps

7. Worked example: a fourteen-person invoicing SaaS

A fourteen-person invoicing SaaS had no status page. Their payment provider had a 3DS timeout epidemic one Tuesday; the team knew within four minutes, fixed the routing in fifty, and stayed completely silent the whole time — “no news means we’re on it.” Meanwhile: 61 support tickets, three enterprise customers escalated to their account managers, and one churned citing “we couldn’t tell if you even knew.” The status page they shipped afterwards was one static HTML file with five rows. Three months later, a similar provider incident: first “aware & investigating” update at minute 8, updates at +30/+60/+90, resolution post with cause and failover change. Nine tickets total, zero executive escalations, and the enterprise customer who churned sent a note praising the comms — then renewed. The outage cost the same engineering effort both times. Only the storytelling changed.

8. Metrics

From the HIVE80lab kit

Related: the outage email templates carry the same four statements into every affected customer’s inbox, the database outage runbook is what the on-call is doing while the page updates, and the severity matrix sets the update cadence the page must keep. The incident response pillars overview shows where public comms sits among the four pillars.

Release notes are the planned side of the same honesty the status page template keeps on the unplanned side: what changed, what is broken, what we are doing, when to look again — customers should never have to guess which one applies.

The five components on the public page are rows on an internal page. The service catalog template defines those rows — service, owner, and the one-sentence “up means” the status page template publishes when the promise breaks.