Your payment provider is timing out. Your team knows within four minutes and fixes the routing in fifty. You say nothing the whole time — "no news means we're on it."
Sixty-one support tickets later, an enterprise customer churns with the reason: "we couldn't tell if you even knew."
The outage cost the same engineering effort either way. The difference between 61 tickets and a churn vs. nine tickets and a renewal note was one static HTML page and the discipline to edit it.
A status page is four statements
Not a vendor product. Not a dashboard. A promise with a timestamp, kept in public, update by update. Every update carries the same four statements:
- What is broken — in customer terms. "Checkouts are failing" beats "payment-worker-3 pool exhausted."
- What we know — including "we are still investigating," said honestly with a timestamp. A known-unknown builds more trust than a confident guess that turns out wrong.
- What we are doing — one line. You owe evidence of motion, not internals.
- When the next update lands — the line that does the actual work. It lets customers stop refreshing and go back to their day.
Miss the fourth one and your page is a press release.
Five rows, not forty
Customers can hold about five things in their head. One row per customer-visible capability — Website, App/Dashboard, API, Payments/Checkout, Webhooks — with three states: Operational, Degraded, Outage. Forty microservice rows is an internal dashboard pointed at customers, and the one red row ends up below the fold.
Cadence is welded to severity
- P1: first update within 15 minutes of declaring, then every 30 minutes.
- P2: first update within 30 minutes, then hourly.
- Resolution post is mandatory: "Resolved at 14:58 UTC. Cause: X. Changing: Y." An incident that ends silently refunds none of the trust it spent.
The cadence lives in your severity matrix as a row — not in someone's memory.
The page itself is one static file
<h1>Service status</h1>
<p>All systems operational.</p> <!-- the ONLY text on a green day -->
<!-- incident: -->
<p><strong>[Degraded] Checkouts failing for some customers.</strong></p>
<p>Started: 09:12 UTC · We know: card payments fail at 3DS ·
Doing: provider engaged, failing queue paused ·
Next update: by 09:45 UTC.</p>
<!-- resolution: -->
<p><strong>[Resolved] 10:58 UTC</strong> Card payments recovered 10:41.
Cause: provider-side 3DS timeout. Change: auto-failover to secondary.</p>
During an incident you are editing one file and re-uploading it. The tooling must never be the thing that's down.
Wiring it in one afternoon
- Publish the green page before you need it, linked from your footer. A page discovered mid-outage that 404s is the second bad news of the day.
- Give edit rights to the on-call. No approval loop, no comms-team gate. If updating the page requires a meeting, the page will lie by omission.
- Drill the edit once in your next game day. First drill fails, embarrassingly and usefully — usually at "where do I even upload this."
The traps
- The silence gap. The first 30 minutes decide whether customers think you're honest or hiding. The void is always filled by speculation, and speculation is always worse than the truth.
- The green page during a live incident converts a technical failure into a credibility failure. Can't update fast? Change the header to "aware, working on it, updates every 30 min" and buy the cadence honestly.
- Marketing copy in incident updates. Customers in a burning building don't want the fire's journey.
- Timestamps in one timezone — yours. Customers aren't all where you are.
The scorecard
A fourteen-person invoicing SaaS shipped the page after the churn above. Three months later a similar provider incident: first update at minute 8, updates at +30/+60/+90, resolution post with cause and the failover change. Nine tickets, zero executive escalations — and the customer who had churned sent a note praising the comms, then renewed.
Track four numbers: time-to-first-update (<15 min for P1), cadence adherence (100% of promised times met, including the awkward "still investigating" ones), support tickets per incident (should trend down), and silent minutes during declared P1s (zero after the first update).
The full template — five-row component model, copy-paste HTML, the drills, and the worked example — is on the HIVE80lab ops notes.
If you're building out incident response for a small team: The First 30 Minutes is a free quick-start, and the Ops Starter Kit ($14) covers the whole incident rail.
Start here: The First 30 Minutes — a free incident quick-start checklist. When you need the full system, the Ops Starter Kit ($14) covers incident response, severity, and post-mortems for a 1–50 person team. Every template referenced in this post is free on HIVE80lab Ops Notes.
Top comments (0)