Your Postmortems Are Compliance Theater. Here’s How to Make Them Actually Useful.
Blameless postmortems sound good in theory, but most teams still avoid the real failures hiding underneath the incident timeline.
A postmortem is supposed to be your team’s institutional memory.
The incident happens, everyone scrambles, things get fixed, and then you write it down so the next person doesn’t have to learn the same lesson the hard way.
A good postmortem captures not just what broke but why your system allowed it to break, what you learned about your assumptions, and what you’re going to do differently. It becomes a living document that makes your entire organization smarter.
That’s the dream.
Here’s what actually happens… The incident ends, everyone’s exhausted, and someone opens a Google Doc with a template they copied from a blog post three years ago. They fill in the timeline because that part’s easy. They list some action items because the template has a section for it, the doc gets shared in Slack, two people add comments, and then it goes into a folder no one will ever open again. Six months later, the same incident happens.
Different service, same root cause. And someone asks “didn’t we have a postmortem about this?” and the answer is yes, technically, but nobody remembers what it said.
The postmortem isn’t failing because people don’t care. It’s failing because we treat it like a compliance exercise instead of an engineering practice.
We optimize for having a document instead of having understanding.
In order for that to happen, let’s understand what’s happening under the hood so that when your next postmortem lands in the folder of forgotten docs, you know why and how to fix it.
Welcome to Code Like a Girl, the community where women in tech come to be seen, heard, and championed as they walk this path together.
If you are a woman in tech who is tired of doing the practice for the checkbox instead of the craft, this is where you find the people who take the work as seriously as you do.
The Anatomy of a Postmortem That Works
A useful postmortem has five distinct components, and most templates either miss some entirely or collapse them into mush. Let me break them apart.
The incident summary
This is one paragraph, maybe two. It answers: what happened, when, how long, and what was the customer impact. Not the technical details. Not the timeline. Just enough that someone skimming a list of postmortems can decide if this one is relevant to them.
Production example:
On March 14, 2024 from 14:23 to 15:47 UTC, customers in the EU region
experienced failed checkout attempts. Approximately 450 of checkout
requests returned 500 errors during this window. The incident was
caused by a database connection pool exhaustion following a routine
deployment.
That’s it. No preamble, no context about what we were trying to do, no explanation of how the system works. Just the facts.
The timeline
This is the play-by-play, but it’s not a log dump. The timeline should include human decisions and observations, not just system events. Every entry should have a timestamp and should answer either “what changed” or “what did we notice and do about it.”
The mistake I see constantly is timelines that only track the incident. A useful timeline starts before the incident, often hours or days before. That deployment that seemed fine? It goes in the timeline. The alert that fired and got dismissed? Timeline. The meeting where someone mentioned the service was acting weird? Timeline.
March 14, 2024
09:15 UTC - Deploy v2.4.1 to EU production (routine release)
09:20 UTC - Deployment completes, smoke tests pass
14:23 UTC - First 500 errors appear in checkout service logs
14:31 UTC - PagerDuty alert fires for elevated 5xx rate
14:33 UTC - On-call engineer acknowledges, begins investigation
14:41 UTC - Database connection pool exhaustion identified
14:45 UTC - Decision made to rollback to v2.4.0
15:02 UTC - Rollback complete, errors persist
15:18 UTC - Stale connections identified, manual pool flush initiated
15:47 UTC - Error rate returns to baseline
Notice that gap between deployment and first errors. That’s not noise. That’s the interesting part.
The technical root cause
This is where most postmortems fall apart. “The database ran out of connections” is not a root cause, that’s the proximate cause. The root cause answers why the system allowed that to happen.
Keep asking why until you hit something you can actually fix with a systemic change. The database ran out of connections. Why? Because the new code version held connections longer during a new caching operation. Why did that matter? Because the connection pool was sized for the old behavior with no margin. Why was there no margin? Because we sized it based on peak load from six months ago and traffic has grown. Why didn’t we notice the growth? Because we don’t have alerting on connection pool utilization trending toward capacity.
Now you have something useful. The root cause isn’t “bad code” or even “undersized pool.” The root cause is “we lack observability into resource utilization trends that would catch capacity problems before they become incidents.”
Contributing factors
These are the things that didn’t cause the incident but made it worse or made it take longer to resolve. This section is often missing entirely, and that’s a mistake.
For the example above, contributing factors might include:
The rollback didn’t immediately fix the issue because stale connections persisted in the pool.
The on-call engineer wasn’t familiar with this service’s database configuration.
The deployment happened at the start of a peak traffic period for EU customers.
Each of these is something you could potentially address without being the root cause.
Action items
This is where most postmortems turn into fantasy fiction. I’ve seen action items like “improve monitoring” and “add better tests” that sit open for years. Useful action items are specific, owned, and have deadlines.
Bad: “Add alerting for database issues”
Good: “Add PagerDuty alert for connection pool utilization > 80% sustained for 5 minutes. Owner: Sarah. Due: March 21.”
And here’s the part nobody wants to hear. If you can’t commit to actually doing the action item in the next two weeks, it probably shouldn’t be in the postmortem. Put it in your backlog, sure. But the postmortem action items should be the immediate response, not the wishlist.
The Blameless Myth
Every postmortem guide tells you to be blameless, this is correct but wildly misunderstood.
Blameless doesn’t mean we pretend humans weren’t involved. Blameless means we recognize that when a human makes an error, the interesting question is what about the system made that error possible, likely, or unrecoverable.
Imagine being on a team where an engineer fat-fingered a production command and took down a critical service for twenty minutes. The instinct is to write it up as “operator error” and move on. But instead, dig in. Why was it possible to run that command without confirmation? Why did the command have access to production at all when the engineer was trying to target staging? Why didn’t our safeguards catch a command that would affect that many records?
The postmortem ends up not being about the engineer’s mistake, but why it was allowed to happen in the first place. It’s about the fact that the tooling made it trivially easy to make that mistake and had no guardrails to prevent it.
That’s blameless. Not “nobody did anything wrong” but “the human error revealed system weaknesses.”
Here’s the thing though. Being blameless requires psychological safety, and you can’t mandate that with a template. If your team has a culture where mistakes lead to consequences, your postmortems will be exercises in creative writing. People will leave out the parts that make them look bad. They’ll describe symptoms without admitting they saw warnings and ignored them. They’ll blame external factors.
If you’re a lead or manager and your postmortems seem thin on human detail, that’s a signal about your culture, not your template.
Running the Meeting
The postmortem document matters, but the meeting matters more. And most teams run terrible postmortem meetings.
The standard approach: someone reads through the doc, people nod, someone asks a clarifying question, action items get assigned, meeting ends. This is useless. You could have done this async.
A useful postmortem meeting is a collaborative investigation. You’re not reviewing the document, you’re building shared understanding.
Start with the timeline and stop constantly. At each entry, ask what people were thinking. Not what they did. What they were thinking. “I saw the alert but I assumed it was a false positive because we’d had three that week” is gold. That tells you your alert fatigue problem is affecting incident response.
Then focus on the decision points. Every incident has moments where someone chose path A over path B. Maybe they chose to rollback instead of forward-fix. Maybe they chose to page the database team instead of investigating themselves. These decisions aren’t right or wrong in retrospect. They’re data about how your team reasons under pressure.
The meeting should generate surprises. If everyone leaves with exactly the understanding they came in with, you wasted the meeting. Someone should say “I didn’t realize that’s how that system worked” or “I thought we had alerting for that” or “wait, we don’t have runbooks for this?”
Keep the meeting under an hour. If you can’t get through it in an hour, your incident was complex enough to warrant multiple sessions focused on different aspects.
And for the love of everything, don’t skip the meeting because “we already wrote the doc.” The doc is the artifact. The meeting is where the learning happens.
The Follow-Through Problem
Most teams don’t consistently complete all their postmortem action items. I’ve seen teams that complete most of them. I’ve seen teams that complete none of them. But all of them? I’m not sure it’s possible, and I’m not sure it’s desirable.
Some action items turn out to be harder than expected. Some turn out to be less important once the incident fades from memory. Some get superseded by other work that addresses the same underlying issue.
But there’s a difference between thoughtful prioritization and silent abandonment.
The practice that’s worked best for me: review open postmortem action items weekly as a team. Not a status meeting. Just someone reading through them and asking “is this still something we’re doing?” If the answer is no, close it explicitly and document why. “Decided not to pursue because the monitoring improvements from incident X address the same gap” is a valid outcome. “We forgot about it” is not.
The other practice that helps: limit action items to three per postmortem. Not three categories. Three actual items. This forces you to prioritize in the moment when the incident is fresh, rather than writing down everything you could possibly do and hoping someone will sort it out later.
If you’re finding that the same themes appear in action items across multiple postmortems, that’s a signal that you need to address something structural. Not more action items. A project.
Templates Are Scaffolding, Not Structure
I’ve deliberately avoided giving you a template because templates are part of the problem. Teams adopt a template, fill in the blanks, and think they’ve written a postmortem. They haven’t. They’ve completed a form.
A postmortem is an investigation report. It has structure, yes, but the structure serves the investigation, not the other way around. If your incident doesn’t fit neatly into a template, that’s fine. The template isn’t sacred.
That said, here’s the scaffolding I use:
Summary in three sentences or less
Timeline starting before the incident
Technical root cause expressed as a system weakness
Contributing factors that affected severity or duration
Action items with owners and dates, limited to three
The format for each section varies based on what actually happened. Sometimes the timeline is the important part and needs detail. Sometimes the root cause analysis is complex enough to need subsections. Sometimes the contributing factors are the whole story.
One thing I’ve started doing recently: including a “what went well” section. Not to make people feel better. But because incident response often reveals good practices you want to reinforce. “The runbook for this service was accurate and up-to-date” is worth noting. “The on-call engineer correctly identified the affected system within ten minutes” is worth noting.
These observations help calibrate. If your postmortems are only ever about what went wrong, you lose the signal about what you should keep doing.
When the Document Becomes Valuable
The postmortem works when it changes how people think, not when it changes how they behave in one specific scenario.
When your postmortems work:
Engineers reference old postmortems during design reviews without being prompted
The same root cause pattern stops appearing across unrelated services
New team members can read recent postmortems and understand how your systems actually behave under stress
Action items get completed or explicitly closed within two weeks
The team has opinions about what makes a good postmortem
That last point is the quiet win.
What’s the last postmortem your team wrote that actually changed how you work?
I’d love to hear about it in the comments.
We're grateful to Maxine Meurer for sharing her work here. If you want production engineering explained by someone who scales databases and debugs incidents for a living, and writes about what actually holds up under pressure, be sure to subscribe to her publication. Maxine originally posted this story on Ilovedevops here.
You Belong Here
Code Like a Girl is the community for women in tech who are done performing the work and ready to actually get better at it, together.
If you are not subscribed yet, that is the place to start. It’s free.











A blameless label is meaningless if the analysis stops at the timeline. Useful postmortems expose incentives, ownership, system design, and detection gaps—not just individual error. I’m subscribed; keep up the work, Maxine.