Changelog
- 1.0.0, 22 October 2026: first release
kits / production-incident
Runbook, severity levels, status page templates and a blameless postmortem so your team handles outages the same way every time.
MIT License
Copyright (c) 2026 Snowkit
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.Version 1.0.0
A complete incident process you can adopt in an afternoon: a runbook from first alert to close, severity levels with example response targets, a card for the first 15 minutes, message templates for the status page, internal updates and customer emails, a blameless postmortem template, an on-call checklist and a runbook template for each service. Everything is plain Markdown with fill-in fields, so it works with whatever paging, chat and status tools you already use.
severity-levels.md and change the response targets to numbers your team can meet.first-15-minutes.md for everyone on the rota.severity-levels.md: paging tool, channel naming, status page.communications/status-page-templates.md as canned responses in your status page tool.service-runbook-template.md.Then walk the team through incident-runbook.md once, ideally with a practice incident.
| File | What it is |
|---|---|
README.md | This file |
LICENSE.txt | MIT licence |
CHANGELOG.md | Version history |
first-15-minutes.md | One-page card: acknowledge, declare, understand, mitigate, communicate |
severity-levels.md | SEV1 to SEV4 criteria, example response targets, who gets paged, escalation triggers and postmortem rules |
incident-runbook.md | The full process: detect, declare, roles, mitigation, timeline, escalation, handover, close and learn |
incident-log-template.md | Fill-in log for summary, roles, impact, timeline, changes and communications |
communications/status-page-templates.md | Investigating, identified, monitoring, resolved, scheduled maintenance, third-party outage and regional templates, with writing rules |
communications/internal-update-template.md | Update format for leadership and support, with an example and a final update |
communications/customer-email-template.md | Post-incident emails for disruption, action required and data affected |
postmortem-template.md | Blameless postmortem: summary, impact, timeline, contributing factors, what went well, action items and a review checklist |
on-call-checklist.md | Before a shift, handover, during, after, and what the team owes people on call |
service-runbook-template.md | One-service runbook: dependencies, health checks, alerts, procedures, fallbacks, data and contacts |
This kit gives you a process and the words to go with it. It can't replace practice: run a game day or a tabletop exercise so the process is familiar before a real incident. The response targets are examples, not recommendations for your business. For security incidents and anything involving personal data, involve your security and legal contacts, because notification rules vary by country and sector.
MIT License. See LICENSE.txt.
Keep this card open on your second screen or printed by your desk. It's the short version of incident-runbook.md for the moment the page goes off.
---
If customers are or may be affected, declare an incident now. You can always stand it down.
#inc-[date]-[short-name].Incident declared. [What is broken], seen from [time UTC]. Severity: [SEV level], working guess. I'm [name], acting incident lead until someone takes over. Dashboard: [link].
severity-levels.md. When unsure, go higher.You're not looking for the root cause yet. You're looking for the fastest safe way to stop the harm.
Common mitigations, roughly in order of preference:
| If | Try |
|---|---|
| It started with a deploy | Roll back |
| It started with a flag or config change | Revert the change |
| One node, pod or region is bad | Take it out of rotation |
| Overloaded | Scale up, shed load, turn off expensive features |
| A dependency is down | Fail over, use cached data, show a degraded mode |
| Bad data being written | Stop the writer, pause the job |
communications/status-page-templates.md, "Investigating"). Short and honest is fine.Summary: [what's broken] since [time]. Impact: [who and how]. Tried: [actions and results]. Current theory: [theory]. Next step: [step]. Last status update: [time]. Next due: [time].
| What | Where |
|---|---|
| Incident lead rota | [link] |
| Status page admin | [link] |
| Main dashboard | [link] |
| Deploy and rollback | [link or command] |
| Cloud provider status | [link] |
| Key vendor support lines | [link] |
Copy this for each incident, or paste the headings into the incident channel's pinned message. Use UTC for every time. Short factual lines are best.
| Field | Value |
|---|---|
| Incident ID | [INC-2026-0001] |
| Title | [Short description, for example "Checkout errors for card payments"] |
| Severity | [SEV1 / SEV2 / SEV3], changes: [SEV2 to SEV1 at 14:20] |
| Status | [Investigating / Identified / Monitoring / Resolved] |
| Started (from graphs) | [YYYY-MM-DD HH:MM UTC] |
| Detected | [HH:MM UTC], by [alert / customer / colleague / vendor] |
| Declared | [HH:MM UTC] |
| Mitigated | [HH:MM UTC] |
| Resolved | [HH:MM UTC] |
| Channel | [#inc-...] |
| Bridge | [link] |
| Status page incident | [link] |
| Role | Name | From (UTC) | To (UTC) |
|---|---|---|---|
| Incident lead | |||
| Communications | |||
| Operations | |||
| Scribe |
| Time (UTC) | Who | Type | Entry |
|---|---|---|---|
| Detection | |||
| Declaration | |||
| Finding | |||
| Action | |||
| Decision | |||
| Comms | |||
| Mitigation | |||
| Resolution |
Types: Detection, Declaration, Finding, Theory, Action, Decision, Severity, Escalation, Comms, Mitigation, Resolution, Handover.
Every change, so they can be reviewed and made permanent or undone.
| Time (UTC) | Change | System | By | How to undo | Keep or revert? |
|---|
| Time (UTC) | Channel | Audience | Summary | By |
|---|---|---|---|---|
| Status page | Public | |||
| Internal update | Leadership, support |
| Item | Owner | Due |
|---|
This is the full process for a production incident, from the first alert to the postmortem. It's written for a team of three to thirty engineers. Smaller teams can combine roles; larger teams can add more.
An incident is any unplanned event that harms, or is about to harm, the service your customers rely on. If you're asking "is this an incident?", treat it as one. Standing one down costs a few minutes; missing one costs much more.
Incidents start from an alert, a customer report, a colleague's message or a provider notice.
Good alerts page on symptoms customers feel (error rate, latency, failed checkouts), not on every cause (CPU at 80%). If your team gets paged for things that don't need action, fix the alert after the incident. See on-call-checklist.md.
#inc-[YYYY-MM-DD]-[short-name]. Keep all incident discussion there.severity-levels.md.incident-log-template.md) or use the channel as the log, with times on every entry.For SEV1 and SEV2, fill these three roles as soon as possible. For SEV3, one person can hold all three.
Owns the incident until it's closed or handed over.
Owns every message that leaves the incident channel.
communications/status-page-templates.md).communications/internal-update-template.md).communications/customer-email-template.md).The people investigating and making changes. There can be several.
| Role | When to add it | What they do |
|---|---|---|
| Scribe | SEV1 lasting more than 30 minutes | Keeps the timeline so the lead can think |
| Subject expert | The cause is in a system the on-call team doesn't know | Joins to advise, takes direction from the lead |
| Liaison | A partner, major customer or vendor is involved | Single point of contact with them |
| Security lead | Any sign of an attack or data exposure | Owns evidence preservation and legal notification decisions |
Work in loops of about 10 to 15 minutes: observe, form a theory, try the safest action, check the result, report.
Questions that find most causes:
Mitigations, safest first:
| Mitigation | Use when | Watch out for |
|---|---|---|
| Roll back the last deploy | Timing lines up with a deploy | Database migrations that can't be reversed |
| Revert a config or flag change | Timing lines up with a change | Caches holding the old value |
| Drain a bad node, pod or region | Errors are concentrated | Remaining capacity must handle the load |
| Scale up or out | Saturation is the problem | Costs, and a slow dependency can't be fixed by more callers |
| Shed load or rate limit | Overload from traffic or a single client | Tell customers if their requests are being rejected |
| Disable a feature | One feature is causing wider harm | Turn it back on only after a fix |
| Fail over | Primary system or region is down | Data replication lag |
| Restore from backup | Data is corrupted | Last resort. Know your restore time and data loss window first |
Once impact stops, say so: "Mitigated at 14:42 UTC. Error rate back to baseline. Monitoring." Move the status page to "Monitoring". The root cause can now be investigated calmly, often the next working day.
Record, with UTC times:
Short lines are fine: "14:31 [Name]: rolled back api to v2.41.3." The postmortem will be built from this.
Escalate when:
How to escalate: page the next person on the escalation list, tell them the severity, the impact and what you need from them in one message.
On long incidents, or when the lead changes:
Handing over incident lead to [name] at [time]. Impact: [summary]. Status: [mitigated / not mitigated]. Current work: [who is doing what]. Next status update due: [time]. Open questions: [list].
The new lead confirms in the channel: "I have the lead."
Resolved means customers are no longer affected and the system is stable. It doesn't mean the cause is fixed for good.
Before closing:
Post the closing message in the channel:
Resolved at [time UTC]. Duration: [x]. Impact: [summary]. Postmortem owner: [name], draft due [date]. Thanks all.
Write the postmortem with postmortem-template.md, review it as a team and track the action items to completion. An incident without follow-up is likely to happen again.
| Step | Who | Done when |
|---|---|---|
| Confirm | First responder | One independent signal checked |
| Declare | First responder | Channel created, first message posted |
| Set severity | First responder, then lead | Level posted in channel |
| Assign roles | Incident lead | Lead, comms and ops named |
| Mitigate | Operations | Customer impact stopped |
| Communicate | Communications | Updates on schedule |
| Resolve | Incident lead | Stable for the agreed period, status page resolved |
| Learn | Postmortem owner | Postmortem reviewed, actions tracked |
On-call works when the person holding the pager has what they need, knows what's going on, and isn't worn out. This checklist covers a shift from start to finish, plus what the team owes the people on call.
At the start and end of every shift, ideally on a short call.
The outgoing person shares:
Handover note template:
On-call handover: [outgoing] to [incoming], [date HH:MM UTC]
Open incidents: [none / list with links]
Pages this shift: [number], [short summary of each]
Watch list: [things that might fire, and what to do]
Planned changes: [deploys, maintenance, migrations with times]
Temporary fixes in place: [what, where, when to revisit]
Follow-ups raised: [tickets]
Anything else: [notes]
first-15-minutes.md.Review these monthly or quarterly.
service-runbook-template.md).| Date and time (UTC) | Alert or event | Action taken | Needed action? | Follow-up ticket |
|---|---|---|---|---|
| Yes / No | ||||
| Yes / No | ||||
| Yes / No | ||||
| Yes / No |
Incident ID: [INC-2026-0001] Severity: [SEV1 / SEV2] Date of incident: [YYYY-MM-DD] Author: [Name] Reviewers: [Names] Status: [Draft / In review / Final] Review meeting: [Date and time]
---
severity-levels.md while memories are fresh. Build the timeline from the incident log and channel, not from memory.---
[Three to five sentences a busy executive could read: what happened, how long, who was affected, what fixed it, and the main change we're making.]
| Measure | Value |
|---|---|
| Duration of customer impact | [Start to end UTC, total minutes] |
| Time to detect | [Minutes from start to detection] |
| Time to mitigate | [Minutes from detection to impact stopped] |
| Customers affected | [Number or percentage, and how measured] |
| Requests or transactions failed | [Number, if known] |
| Data lost or corrupted | [None / describe] |
| Money affected | [Failed payments, refunds, credits issued] |
| Support tickets | [Number] |
| SLA or commitments breached | [None / which ones] |
All times UTC. Include the lead-up (the change that introduced the problem may be days earlier), detection, key decisions and resolution.
| Time | Event |
|---|---|
| [YYYY-MM-DD HH:MM] | [Change deployed / config edited / traffic began rising] |
| [HH:MM] | [Impact begins (from graphs)] |
| [HH:MM] | [Alert fires / customer reports] |
| [HH:MM] | [Incident declared, SEV level] |
| [HH:MM] | [Key finding] |
| [HH:MM] | [Mitigation attempted, result] |
| [HH:MM] | [Status page first update] |
| [HH:MM] | [Impact ends] |
| [HH:MM] | [Incident resolved] |
[A narrative in plain language, a few paragraphs. Explain the system as much as a reader from another team needs. Describe the sequence of events and the state of the system at each point.]
Incidents rarely have one root cause. List the conditions that together allowed this to happen and made it worse. For each, ask "why?" until you reach something you can change.
| Factor | Type | Why it mattered |
|---|---|---|
| [A config change was applied to all servers at once] | [Process / deploy] | [No chance to catch the problem on a small group first] |
| [The alert threshold was set above the level customers noticed] | [Monitoring] | [Detection took 18 minutes] |
| [The rollback procedure wasn't documented for this service] | [Documentation] | [Mitigation took longer while responders worked it out] |
Factor types to consider: code, configuration, deploy process, testing, monitoring and alerting, capacity, dependencies, documentation, access and permissions, communication, on-call load, time pressure.
[Things that limited the impact by chance rather than by design. These are often the most useful action items.]
Each item is specific, has one owner and a due date, and is tracked in [your issue tracker]. Prefer a few meaningful items over a long list nobody finishes.
| ID | Action | Type | Owner | Due | Ticket | Status |
|---|---|---|---|---|---|---|
| 1 | [Roll out config changes to 5% of servers first, with automatic rollback on error rate] | Prevent | [Name] | [Date] | [Link] | [Open] |
| 2 | [Lower the error-rate alert threshold to 2% for 3 minutes] | Detect | [Name] | [Date] | [Link] | [Open] |
| 3 | [Write the rollback steps into the service runbook] | Mitigate | [Name] | [Date] | [Link] | [Open] |
| 4 | [Add status page update reminders to the incident tool] | Respond | [Name] | [Date] | [Link] | [Open] |
Types: Prevent (stop it happening), Detect (find it sooner), Mitigate (reduce impact or speed recovery), Respond (improve the process).
[Two or three sentences other teams could learn from, even if they don't use this system.]
---
Before marking this final:
One runbook per service. Write it for the on-call engineer at 03:00 who has never touched this service: short steps, exact commands, links that work. Review it after every incident that involved this service, and at least every [6] months.
Owner team: [Team] Escalation contact: [Name or rota], [how to reach] Last reviewed: [Date] by [Name] Repository: [link] Dashboard: [link] Logs: [link with useful filters saved] Error tracker: [link]
---
[Two or three sentences. What it does, who uses it, and what customers notice if it breaks.]
Customer impact if down: [For example: "Customers can't check out. Browsing still works."] Usual severity if down: [SEV1 / SEV2], see severity-levels.md
| Depends on | What for | If it's down |
|---|---|---|
| [Database: orders-primary] | [Reads and writes orders] | [Service returns errors on checkout] |
| [Payments provider] | [Card authorisations] | [Checkout fails; retries queued for 15 minutes] |
| [Cache] | [Session and price cache] | [Slower, but works] |
| Used by | For | |
| [Web front end] | [Checkout pages] | |
| [Mobile app] | [In-app purchases] |
Where it runs: [Cloud, region, cluster, number of instances] How it's deployed: [Tool and link]
| Check | Command or link | Healthy looks like |
|---|---|---|
| Health endpoint | curl -s https://[host]/healthz | {"status":"ok"} with status 200 |
| Error rate | [Dashboard panel link] | Below [1]% |
| Latency (p95) | [Dashboard panel link] | Below [300] ms |
| Queue depth | [Dashboard panel link] | Below [1,000] and falling |
| Instance count | [Command or link] | [N] healthy |
One section per alert that can page. The alert's description should link straight here.
[exact command or steps, for example: deploy-tool rollback [service] --to [previous-version]]
[exact command]
[exact command]
| Flag | What it disables | Where to change it |
|---|---|---|
| [checkout.new-pricing] | [New pricing engine, falls back to old] | [Flag tool link] |
[How the service can keep partly working when something breaks. For example: "If the payments provider is down, set payments.queue-mode to on. Orders are accepted and charged when the provider recovers. Tell support."]
| Who | For | How |
|---|---|---|
| [Owner team channel] | Questions during working hours | [Channel] |
| [Escalation rota] | Out of hours, SEV1 or SEV2 | [Paging tool] |
| [Vendor support] | [Provider problems] | [Link, account ID, support tier] |
| [Database team] | [Database problems] | [Channel or rota] |
| Date | Change | By |
|---|---|---|
| [Date] | [First version] | [Name] |
A severity level is a shared shorthand for "how bad is this and how fast do we move". Agree the levels before you need them, so nobody argues about labels while customers are waiting.
The response targets below are examples to adapt. Set numbers your team can actually meet, at the hours you actually cover. A target nobody meets is worse than a modest one people trust.
| Level | Name | Criteria (any one is enough) | Examples |
|---|---|---|---|
| SEV1 | Critical | Core service down or unusable for most customers. Data loss or corruption in progress. Confirmed security breach or exposure of customer data. Payments or money movement failing broadly. Legal, safety or regulatory impact | Site returns errors for everyone. Database corruption. Leaked admin credentials being used. Checkout failing for all cards |
| SEV2 | Major | A key feature is down or badly degraded for many customers, or for an important segment. Core service is working but with serious slowness or high error rates. A SEV1 is likely if nothing is done | Sign-in failing for 20% of users. One region down. Background jobs stalled so emails and exports aren't sent. Error rate well above normal |
| SEV3 | Minor | A non-critical feature is broken, or a small number of customers are affected, and a workaround exists | Reports page slow. Image uploads failing for one file type. A single enterprise customer's integration broken with a manual workaround |
| SEV4 | Low | Little or no customer impact. Internal tools, cosmetic problems, or a risk that needs attention soon but not now | Admin dashboard chart broken. Certificate expires in 10 days. Disk at 75% and rising slowly |
When in doubt, pick the higher level. Downgrading later costs nothing. Starting too low means the wrong people aren't there when it gets worse.
| Level | Acknowledge page | Incident lead in place | First public update | Update cadence | Who gets paged | Hours |
|---|---|---|---|---|---|---|
| SEV1 | 5 minutes | 15 minutes | 15 to 30 minutes | Every 30 minutes, or sooner on change | Primary on-call, secondary on-call, incident lead rota, engineering manager | 24/7 |
| SEV2 | 15 minutes | 30 minutes | 30 to 60 minutes | Every 60 minutes | Primary on-call, incident lead rota | 24/7 or extended hours |
| SEV3 | 1 working hour | Optional | If customers are asking | When status changes | Primary on-call (notification, not a page) | Working hours |
| SEV4 | Next working day | Not needed | Not needed | Not needed | Ticket in the owning team's queue | Working hours |
Notes:
Raise the level, or bring in more people, when:
If you have SLAs or published uptime commitments, map them here so responders know which incidents count:
| Commitment | Applies to | Counts as downtime | Level it implies |
|---|---|---|---|
| [99.9% monthly uptime] | [API and dashboard] | [Error rate above 5% for 5 minutes or more] | [SEV1 or SEV2] |
| Level | Postmortem | Due | Review |
|---|---|---|---|
| SEV1 | Required | Draft within 3 working days | Team review meeting, shared with leadership |
| SEV2 | Required | Draft within 5 working days | Team review meeting |
| SEV3 | Short write-up if there's something to learn | Within 2 weeks | Optional |
| SEV4 | Not needed |
Fill these in and keep them up to date.
Send a direct email after an incident when the status page isn't enough: customers lost data or money, need to take action, have contractual commitments, or were affected for a long time. Most incidents don't need one. When in doubt, ask whether a customer would be surprised not to hear from you.
---
Subject: [Service] disruption on [date]: what happened
Hi [first name or team name],
On [date], between [HH:MM] and [HH:MM UTC], [service or feature] [was unavailable / returned errors / was slow] for [all customers / customers in [region] / some customers, including your account]. I'm sorry. We know you rely on [service] for [what they use it for], and we let you down.
What happened
[Two or three plain sentences. For example: "A configuration change we made to our database servers reduced their capacity. When traffic rose in the afternoon, requests began to fail. We reversed the change, and service recovered by [HH:MM UTC]."]
What this means for you
[For example: "No data was lost. Any requests that failed during this time can be retried." Or list what was affected.]
What you need to do
[Nothing. / Please [action] by [date]. / If you see [symptom], contact us at [link].]
What we're changing
- [Specific change, for example "Configuration changes to database servers now go through a staged rollout."]
- [Specific change]
- [Specific change]
[If applicable: "Under your agreement, this incident qualifies for a service credit of [amount or percentage], which will be applied to your next invoice. You don't need to do anything."]
If you have questions, reply to this email or contact [support link].
[Name]
[Title], Example Co
Use when customers must do something, such as retry payments, re-upload files or check data.
Subject: Action needed: [what they need to do] after the [date] incident
Hi [first name],
On [date], between [HH:MM] and [HH:MM UTC], an issue with [feature] meant that [what went wrong for them]. We're sorry.
Please [action] by [date]. [Step-by-step instructions, or a link to them.]
[Which records or items are affected, or how to find them: "You can see the affected [orders] in [location], marked [label]."]
If you don't take action, [what happens, honestly].
We've fixed the underlying problem and [what you're changing to stop it happening again].
If you need help, reply to this email and our team will help you directly.
[Name]
[Title], Example Co
Use only after legal and privacy review. Data protection laws may set the content and timing of these notices.
Subject: Important information about your [Example Co] account
Hi [first name],
We're writing to tell you about an incident that affected some of your information.
What happened: On [date], [plain description, for example "a software error caused some account details to be visible to other signed-in users for about 40 minutes"].
What information was involved: [Exactly which fields, for example "your name and email address. Passwords and payment details were not affected."]
What we've done: [Fixed the error, removed the exposure, informed the relevant authority if applicable, and any other steps.]
What you can do: [Specific advice, for example "Be cautious of emails claiming to be from us that ask for your password. We will never ask for it." Or "You don't need to take any action."]
For more information: [Contact details, a dedicated page or reference number.]
We're sorry this happened.
[Name]
[Title], Example Co
For leadership, support, sales, account managers and anyone else inside the company who needs to know but isn't in the incident channel. Send it to one place (an incidents channel or mailing list) so people stop asking the responders directly.
Internal updates can be more detailed and more candid than the status page, but keep them short enough to read on a phone in 30 seconds.
| Severity | First update | Then | Final |
|---|---|---|---|
| SEV1 | Within 15 minutes of declaring | Every 30 minutes | On resolution |
| SEV2 | Within 30 minutes | Every 60 minutes | On resolution |
| SEV3 | Optional | When status changes | Optional |
[SEV level] [Status: Investigating / Identified / Monitoring / Resolved] - [Short title]
Update [number], [HH:MM UTC]
Impact: [Who is affected and what they experience. Numbers if known, and how sure we are.]
Current status: [One or two sentences on what we know and what we're doing.]
Customer comms: [Status page posted at HH:MM / Not public yet, because ... / Support has a holding reply.]
What we need: [Nothing / Decision on X from Y / Help from team Z / Approval to contact customer A.]
Next update: [HH:MM UTC]
Incident lead: [Name] Channel: [#inc-...] Status page: [link]
SEV2 Identified - Delayed email notifications
Update 2, 15:10 UTC
Impact: Since about 14:20 UTC, password reset and receipt emails are delayed by up to 40 minutes for all customers. No emails are lost; they are queued.
Current status: Our email provider is rate-limiting our account after a sending spike. We've paused the marketing send that caused it and asked the provider to lift the limit.
Customer comms: Status page updated at 15:05. Support has a holding reply for password reset questions.
What we need: Nothing right now.
Next update: 16:00 UTC
Incident lead: [Name] Channel: #inc-2026-10-22-email Status page: [link]
RESOLVED - [Short title]
[HH:MM UTC]
Duration: [start] to [end] UTC ([x] hours [y] minutes)
Impact: [Final summary: who, what, how many, any data or money affected.]
Cause (initial): [One or two sentences. Say it's initial; the postmortem will confirm.]
Fix: [What stopped the impact.]
Follow-up: [Temporary changes to clean up. Customers to contact. Credits to consider.]
Postmortem: [Owner], draft due [date].
Thanks to [names or teams].
Include these in the first update when customers are affected:
Short, honest and on time beats detailed and late. Customers want to know three things: do you know, what's affected, and when will they hear more.
Fill-in fields are in [square brackets]. Delete any sentence you can't fill truthfully.
---
Use as soon as the incident is declared and customers may be affected.
Title: [Feature or service] [errors / slowness / unavailable]
We're investigating reports of [errors / slow responses / failures] when [customers do what, for example "signing in" or "loading dashboards"]. [Customers in [region] / Some customers / All customers] may be affected. We'll post an update by [HH:MM UTC].
Shorter version for the first few minutes:
We're investigating [errors when signing in]. Next update by [HH:MM UTC].
Use when you know the cause or have a clear fix underway.
We've identified the cause of [the errors when signing in] and are [rolling back a recent change / applying a fix / moving traffic to healthy servers]. [Customers may still see errors until this is complete.] Next update by [HH:MM UTC].
If you have a workaround:
While we work on a fix, you can [use the mobile app / retry the request / use the export from Settings instead].
Use when the fix is in place and you're watching to confirm it holds.
A fix has been applied and [sign-in / payments / dashboards] [are working normally again / are recovering]. We're monitoring to make sure the issue is fully resolved. [If you still see problems, please [retry / refresh / contact support at [link]].] Next update by [HH:MM UTC].
Use when impact has ended and the system is stable.
This issue is resolved. Between [HH:MM] and [HH:MM UTC], [some / all] customers [could not sign in / saw errors when paying / saw delayed data]. [Data was not lost / Delayed [emails / jobs] have now been processed / Affected [payments] can be retried.] We're reviewing what happened and will take steps to prevent it happening again. We're sorry for the disruption.
If you'll publish a summary:
We'll publish a summary of what happened and what we're changing by [date].
If customers need to act:
If you [made a payment / submitted a form] between [HH:MM] and [HH:MM UTC], please [check / retry / contact support at [link]].
Post at least [3 to 7] days ahead for disruptive work, and remind customers [24 hours] before.
Title: Scheduled maintenance: [system]
On [day, date] from [HH:MM] to [HH:MM UTC], we'll be carrying out maintenance on [system]. During this time, [describe the impact: "the dashboard will be read-only" / "the API may return errors for up to [5] minutes" / "no impact is expected"]. [No action is needed from you. / Please [action] before [time].] We'll update this page when the work starts and when it's complete.
When it starts:
Maintenance is now in progress. [Impact reminder.] We'll update this page when it's complete.
When it's complete:
Maintenance is complete and [system] is working normally. Thank you for your patience.
If it overruns:
Maintenance is taking longer than planned. [Impact reminder.] We now expect to finish by [HH:MM UTC] and will update this page by then.
Use when a provider you depend on has a problem that affects your customers.
Title: [Feature] affected by a third-party outage
[Feature, for example "card payments" or "email notifications"] [is unavailable / is delayed / may fail] because of an outage at one of our service providers. We're monitoring their progress [and have [switched to a backup provider / paused [jobs] so nothing is lost]]. [Other features are working normally.] Next update by [HH:MM UTC].
When the provider recovers:
Our provider has resolved their issue and [feature] is working normally again. [Delayed [emails / jobs] are being processed now and should complete by [HH:MM UTC].]
Naming the provider is a judgement call. It helps customers if they use the same provider and can see its status page; it can read as passing blame. Either is fine; be consistent.
[Feature] is [unavailable / slow] for customers in [region / on [plan] / using [integration]]. Other customers aren't affected. Next update by [HH:MM UTC].
Don't post detail about an active security incident on a public status page until your security lead and legal contact agree the wording. A neutral holding message is fine:
We're investigating an issue affecting [feature]. [Feature] [is temporarily unavailable] while we do this. Next update by [HH:MM UTC].
| Severity | First update | Then |
|---|---|---|
| SEV1 | Within 15 to 30 minutes of declaring | At least every 30 minutes |
| SEV2 | Within 30 to 60 minutes | At least every 60 minutes |
| SEV3 | If customers are noticing or asking | When status changes |
Adjust to match severity-levels.md.