[{"data":1,"prerenderedAt":871},["ShallowReactive",2],{"\u002Fblog\u002Fhow-to-write-a-postmortem-guide":3},{"id":4,"title":5,"author":6,"body":8,"category":862,"date":863,"description":864,"extension":340,"faq":865,"howTo":865,"image":865,"lastUpdated":863,"meta":866,"navigation":373,"path":867,"readingTime":462,"seo":868,"stem":869,"__hash__":870},"blog\u002Fblog\u002Fhow-to-write-a-postmortem-guide.md","How to Write a Postmortem That Prevents Repeat Incidents",{"name":7},"Theo Cummings",{"type":9,"value":10,"toc":845},"minimark",[11,15,18,23,70,73,77,153,157,162,165,169,172,176,189,193,196,213,217,220,234,238,241,245,248,252,328,331,335,793,797,811,815,841],[12,13,14],"p",{},"Most postmortems fail because teams document the outage, then skip systemic fixes. A useful postmortem changes engineering behavior after the incident ends.",[12,16,17],{},"Use this guide if you want postmortems that reduce repeat failures, lower MTTR, and improve on-call quality.",[19,20,22],"h2",{"id":21},"what-a-strong-postmortem-includes","What a strong postmortem includes",[24,25,26,34,40,46,52,58,64],"ol",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"Incident summary",": start time, end time, severity, impacted systems.",[27,35,36,39],{},[30,37,38],{},"Customer impact",": who was affected, for how long, and how badly.",[27,41,42,45],{},[30,43,44],{},"Detection path",": monitor, customer report, or internal observation.",[27,47,48,51],{},[30,49,50],{},"Timeline",": UTC-stamped sequence from first symptom to full recovery.",[27,53,54,57],{},[30,55,56],{},"Root cause",": single initiating failure.",[27,59,60,63],{},[30,61,62],{},"Contributing factors",": controls that failed to prevent blast radius.",[27,65,66,69],{},[30,67,68],{},"Actions",": owner, due date, and measurable success condition.",[12,71,72],{},"If any of these are missing, teams cannot learn reliably from the incident.",[19,74,76],{"id":75},"postmortem-quality-rubric","Postmortem quality rubric",[78,79,80,96],"table",{},[81,82,83],"thead",{},[84,85,86,90,93],"tr",{},[87,88,89],"th",{},"Section",[87,91,92],{},"Weak",[87,94,95],{},"Strong",[97,98,99,111,121,132,142],"tbody",{},[84,100,101,105,108],{},[102,103,104],"td",{},"Summary",[102,106,107],{},"\"Service had issues\"",[102,109,110],{},"\"Checkout API returned 5xx for 27 minutes; 14.2% checkout attempts failed\"",[84,112,113,115,118],{},[102,114,56],{},[102,116,117],{},"\"Human error\"",[102,119,120],{},"\"Deploy pipeline allowed unsafe schema change without migration guard\"",[84,122,123,126,129],{},[102,124,125],{},"Contributors",[102,127,128],{},"Generic list",[102,130,131],{},"Technical + process factors tied to timeline evidence",[84,133,134,136,139],{},[102,135,68],{},[102,137,138],{},"\"Improve monitoring\"",[102,140,141],{},"\"Add synthetic checkout monitor in 3 regions; owner: SRE lead; due: Jul 15\"",[84,143,144,147,150],{},[102,145,146],{},"Follow-up",[102,148,149],{},"No review date",[102,151,152],{},"Action status reviewed in weekly ops review",[19,154,156],{"id":155},"_7-step-process-to-write-the-postmortem","7-step process to write the postmortem",[158,159,161],"h3",{"id":160},"_1-start-with-impact-not-internals","1) Start with impact, not internals",[12,163,164],{},"Write customer and business impact first. This aligns engineering, product, and support before debating implementation details.",[158,166,168],{"id":167},"_2-build-timeline-from-evidence","2) Build timeline from evidence",[12,170,171],{},"Use monitor events, logs, deploy history, and incident chat timestamps. Avoid reconstructing from memory.",[158,173,175],{"id":174},"_3-separate-root-cause-from-contributors","3) Separate root cause from contributors",[177,178,179,184],"ul",{},[27,180,181,183],{},[30,182,56],{},": the initiating failure.",[27,185,186,188],{},[30,187,125],{},": missing safeguards, alerting gaps, or process failures.",[158,190,192],{"id":191},"_4-quantify-detection-and-recovery","4) Quantify detection and recovery",[12,194,195],{},"Include:",[177,197,198,207,210],{},[27,199,200,201,206],{},"MTTD (",[202,203,205],"a",{"href":204},"\u002Fblog\u002Fmttr-mttd-mtbf-incident-metrics","mean time to detect",")",[27,208,209],{},"MTTA (mean time to acknowledge)",[27,211,212],{},"MTTR (mean time to resolve)",[158,214,216],{"id":215},"_5-make-actions-measurable","5) Make actions measurable",[12,218,219],{},"Each action should include:",[177,221,222,225,228,231],{},[27,223,224],{},"owner",[27,226,227],{},"due date",[27,229,230],{},"success metric",[27,232,233],{},"risk reduced",[158,235,237],{"id":236},"_6-run-a-blameless-language-pass","6) Run a blameless language pass",[12,239,240],{},"Replace blame language with mechanism language. Name failing systems and decisions, not individual people.",[158,242,244],{"id":243},"_7-track-closure-not-publication","7) Track closure, not publication",[12,246,247],{},"A published postmortem without shipped actions is a status artifact, not an improvement loop.",[19,249,251],{"id":250},"benchmarks-for-saas-teams","Benchmarks for SaaS teams",[78,253,254,270],{},[81,255,256],{},[84,257,258,261,264,267],{},[87,259,260],{},"Metric",[87,262,95],{"align":263},"right",[87,265,266],{"align":263},"Acceptable",[87,268,269],{"align":263},"Needs work",[97,271,272,286,300,314],{},[84,273,274,277,280,283],{},[102,275,276],{},"MTTD",[102,278,279],{"align":263},"\u003C 2 min",[102,281,282],{"align":263},"2 to 5 min",[102,284,285],{"align":263},"> 10 min",[84,287,288,291,294,297],{},[102,289,290],{},"MTTR",[102,292,293],{"align":263},"\u003C 30 min",[102,295,296],{"align":263},"30 to 90 min",[102,298,299],{"align":263},"> 2 hours",[84,301,302,305,308,311],{},[102,303,304],{},"Postmortem publication",[102,306,307],{"align":263},"\u003C 48 hours",[102,309,310],{"align":263},"2 to 5 days",[102,312,313],{"align":263},"> 7 days",[84,315,316,319,322,325],{},[102,317,318],{},"30-day action closure",[102,320,321],{"align":263},"> 80%",[102,323,324],{"align":263},"60 to 80%",[102,326,327],{"align":263},"\u003C 60%",[12,329,330],{},"These thresholds help teams turn reliability conversations into measurable targets.",[19,332,334],{"id":333},"copy-ready-incident-postmortem-template","Copy-ready incident postmortem template",[336,337,342],"pre",{"className":338,"code":339,"language":340,"meta":341,"style":341},"language-md shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# Incident Postmortem: [Title]\n\n## 1) Summary\n- Start: [UTC]\n- End: [UTC]\n- Duration: [minutes]\n- Severity: [SEV1\u002FSEV2\u002F...]\n- Services impacted: [list]\n\n## 2) Customer Impact\n- Affected users: [segment \u002F %]\n- User symptoms: [what they saw]\n- Business impact: [errors, revenue, support volume]\n\n## 3) Detection and Response Metrics\n- MTTD: [minutes]\n- MTTA: [minutes]\n- MTTR: [minutes]\n- Detection source: [monitoring\u002Fcustomer\u002Finternal]\n\n## 4) Timeline (UTC)\n- [time] [event]\n- [time] [event]\n\n## 5) Root Cause\n[one specific statement]\n\n## 6) Contributing Factors\n- [factor]\n- [factor]\n\n## 7) What Worked \u002F What Failed\n- Worked: [list]\n- Failed: [list]\n\n## 8) Action Items\n- [action] | Owner: [name] | Due: [date] | Success metric: [metric]\n\n## 9) Follow-up Review Date\n- [date]\n","md","",[343,344,345,368,375,384,401,415,430,445,460,465,473,481,489,497,502,510,524,538,552,567,572,580,601,618,623,631,637,642,650,662,673,678,686,700,714,719,727,769,774,782],"code",{"__ignoreMap":341},[346,347,350,354,358,361,365],"span",{"class":348,"line":349},"line",1,[346,351,353],{"class":352},"sMK4o","# ",[346,355,357],{"class":356},"sBMFI","Incident Postmortem: ",[346,359,360],{"class":352},"[",[346,362,364],{"class":363},"sfazB","Title",[346,366,367],{"class":352},"]\n",[346,369,371],{"class":348,"line":370},2,[346,372,374],{"emptyLinePlaceholder":373},true,"\n",[346,376,378,381],{"class":348,"line":377},3,[346,379,380],{"class":352},"## ",[346,382,383],{"class":356},"1) Summary\n",[346,385,387,390,394,396,399],{"class":348,"line":386},4,[346,388,389],{"class":352},"-",[346,391,393],{"class":392},"sTEyZ"," Start: ",[346,395,360],{"class":352},[346,397,398],{"class":363},"UTC",[346,400,367],{"class":352},[346,402,404,406,409,411,413],{"class":348,"line":403},5,[346,405,389],{"class":352},[346,407,408],{"class":392}," End: ",[346,410,360],{"class":352},[346,412,398],{"class":363},[346,414,367],{"class":352},[346,416,418,420,423,425,428],{"class":348,"line":417},6,[346,419,389],{"class":352},[346,421,422],{"class":392}," Duration: ",[346,424,360],{"class":352},[346,426,427],{"class":363},"minutes",[346,429,367],{"class":352},[346,431,433,435,438,440,443],{"class":348,"line":432},7,[346,434,389],{"class":352},[346,436,437],{"class":392}," Severity: ",[346,439,360],{"class":352},[346,441,442],{"class":363},"SEV1\u002FSEV2\u002F...",[346,444,367],{"class":352},[346,446,448,450,453,455,458],{"class":348,"line":447},8,[346,449,389],{"class":352},[346,451,452],{"class":392}," Services impacted: ",[346,454,360],{"class":352},[346,456,457],{"class":363},"list",[346,459,367],{"class":352},[346,461,463],{"class":348,"line":462},9,[346,464,374],{"emptyLinePlaceholder":373},[346,466,468,470],{"class":348,"line":467},10,[346,469,380],{"class":352},[346,471,472],{"class":356},"2) Customer Impact\n",[346,474,476,478],{"class":348,"line":475},11,[346,477,389],{"class":352},[346,479,480],{"class":392}," Affected users: [segment \u002F %]\n",[346,482,484,486],{"class":348,"line":483},12,[346,485,389],{"class":352},[346,487,488],{"class":392}," User symptoms: [what they saw]\n",[346,490,492,494],{"class":348,"line":491},13,[346,493,389],{"class":352},[346,495,496],{"class":392}," Business impact: [errors, revenue, support volume]\n",[346,498,500],{"class":348,"line":499},14,[346,501,374],{"emptyLinePlaceholder":373},[346,503,505,507],{"class":348,"line":504},15,[346,506,380],{"class":352},[346,508,509],{"class":356},"3) Detection and Response Metrics\n",[346,511,513,515,518,520,522],{"class":348,"line":512},16,[346,514,389],{"class":352},[346,516,517],{"class":392}," MTTD: ",[346,519,360],{"class":352},[346,521,427],{"class":363},[346,523,367],{"class":352},[346,525,527,529,532,534,536],{"class":348,"line":526},17,[346,528,389],{"class":352},[346,530,531],{"class":392}," MTTA: ",[346,533,360],{"class":352},[346,535,427],{"class":363},[346,537,367],{"class":352},[346,539,541,543,546,548,550],{"class":348,"line":540},18,[346,542,389],{"class":352},[346,544,545],{"class":392}," MTTR: ",[346,547,360],{"class":352},[346,549,427],{"class":363},[346,551,367],{"class":352},[346,553,555,557,560,562,565],{"class":348,"line":554},19,[346,556,389],{"class":352},[346,558,559],{"class":392}," Detection source: ",[346,561,360],{"class":352},[346,563,564],{"class":363},"monitoring\u002Fcustomer\u002Finternal",[346,566,367],{"class":352},[346,568,570],{"class":348,"line":569},20,[346,571,374],{"emptyLinePlaceholder":373},[346,573,575,577],{"class":348,"line":574},21,[346,576,380],{"class":352},[346,578,579],{"class":356},"4) Timeline (UTC)\n",[346,581,583,585,588,591,594,596,599],{"class":348,"line":582},22,[346,584,389],{"class":352},[346,586,587],{"class":352}," [",[346,589,590],{"class":363},"time",[346,592,593],{"class":352},"]",[346,595,587],{"class":352},[346,597,598],{"class":363},"event",[346,600,367],{"class":352},[346,602,604,606,608,610,612,614,616],{"class":348,"line":603},23,[346,605,389],{"class":352},[346,607,587],{"class":352},[346,609,590],{"class":363},[346,611,593],{"class":352},[346,613,587],{"class":352},[346,615,598],{"class":363},[346,617,367],{"class":352},[346,619,621],{"class":348,"line":620},24,[346,622,374],{"emptyLinePlaceholder":373},[346,624,626,628],{"class":348,"line":625},25,[346,627,380],{"class":352},[346,629,630],{"class":356},"5) Root Cause\n",[346,632,634],{"class":348,"line":633},26,[346,635,636],{"class":392},"[one specific statement]\n",[346,638,640],{"class":348,"line":639},27,[346,641,374],{"emptyLinePlaceholder":373},[346,643,645,647],{"class":348,"line":644},28,[346,646,380],{"class":352},[346,648,649],{"class":356},"6) Contributing Factors\n",[346,651,653,655,657,660],{"class":348,"line":652},29,[346,654,389],{"class":352},[346,656,587],{"class":352},[346,658,659],{"class":363},"factor",[346,661,367],{"class":352},[346,663,665,667,669,671],{"class":348,"line":664},30,[346,666,389],{"class":352},[346,668,587],{"class":352},[346,670,659],{"class":363},[346,672,367],{"class":352},[346,674,676],{"class":348,"line":675},31,[346,677,374],{"emptyLinePlaceholder":373},[346,679,681,683],{"class":348,"line":680},32,[346,682,380],{"class":352},[346,684,685],{"class":356},"7) What Worked \u002F What Failed\n",[346,687,689,691,694,696,698],{"class":348,"line":688},33,[346,690,389],{"class":352},[346,692,693],{"class":392}," Worked: ",[346,695,360],{"class":352},[346,697,457],{"class":363},[346,699,367],{"class":352},[346,701,703,705,708,710,712],{"class":348,"line":702},34,[346,704,389],{"class":352},[346,706,707],{"class":392}," Failed: ",[346,709,360],{"class":352},[346,711,457],{"class":363},[346,713,367],{"class":352},[346,715,717],{"class":348,"line":716},35,[346,718,374],{"emptyLinePlaceholder":373},[346,720,722,724],{"class":348,"line":721},36,[346,723,380],{"class":352},[346,725,726],{"class":356},"8) Action Items\n",[346,728,730,732,734,737,739,742,744,747,749,752,754,757,759,762,764,767],{"class":348,"line":729},37,[346,731,389],{"class":352},[346,733,587],{"class":352},[346,735,736],{"class":363},"action",[346,738,593],{"class":352},[346,740,741],{"class":392}," | Owner: ",[346,743,360],{"class":352},[346,745,746],{"class":363},"name",[346,748,593],{"class":352},[346,750,751],{"class":392}," | Due: ",[346,753,360],{"class":352},[346,755,756],{"class":363},"date",[346,758,593],{"class":352},[346,760,761],{"class":392}," | Success metric: ",[346,763,360],{"class":352},[346,765,766],{"class":363},"metric",[346,768,367],{"class":352},[346,770,772],{"class":348,"line":771},38,[346,773,374],{"emptyLinePlaceholder":373},[346,775,777,779],{"class":348,"line":776},39,[346,778,380],{"class":352},[346,780,781],{"class":356},"9) Follow-up Review Date\n",[346,783,785,787,789,791],{"class":348,"line":784},40,[346,786,389],{"class":352},[346,788,587],{"class":352},[346,790,756],{"class":363},[346,792,367],{"class":352},[19,794,796],{"id":795},"common-mistakes-to-avoid","Common mistakes to avoid",[177,798,799,802,805,808],{},[27,800,801],{},"Publishing without action owners.",[27,803,804],{},"Using generic wording that hides mechanisms.",[27,806,807],{},"Ignoring process contributors and focusing only on code bugs.",[27,809,810],{},"Skipping closure tracking for action items.",[19,812,814],{"id":813},"related-blog-posts","Related blog posts",[177,816,817,822,826,831,836],{},[27,818,819],{},[343,820,821],{},"\u002Fblog\u002Fincident-postmortem-template",[27,823,824],{},[343,825,204],{},[27,827,828],{},[343,829,830],{},"\u002Fblog\u002Fincident-response-checklist-startups",[27,832,833],{},[343,834,835],{},"\u002Fblog\u002Fwebsite-outage-response-runbook",[27,837,838],{},[343,839,840],{},"\u002Fblog\u002Fhow-to-communicate-during-service-outage",[842,843,844],"style",{},"html pre.shiki code .sMK4o, html code.shiki .sMK4o{--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF}html pre.shiki code .sBMFI, html code.shiki .sBMFI{--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B}html pre.shiki code .sfazB, html code.shiki .sfazB{--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D}html pre.shiki code .sTEyZ, html code.shiki .sTEyZ{--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8}html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"title":341,"searchDepth":370,"depth":370,"links":846},[847,848,849,858,859,860,861],{"id":21,"depth":370,"text":22},{"id":75,"depth":370,"text":76},{"id":155,"depth":370,"text":156,"children":850},[851,852,853,854,855,856,857],{"id":160,"depth":377,"text":161},{"id":167,"depth":377,"text":168},{"id":174,"depth":377,"text":175},{"id":191,"depth":377,"text":192},{"id":215,"depth":377,"text":216},{"id":236,"depth":377,"text":237},{"id":243,"depth":377,"text":244},{"id":250,"depth":370,"text":251},{"id":333,"depth":370,"text":334},{"id":795,"depth":370,"text":796},{"id":813,"depth":370,"text":814},"tutorials","2026-06-30","A practical guide to writing blameless incident postmortems with a clear structure, quality rubric, KPI benchmarks, and a copy-ready template your team can use today.",null,{},"\u002Fblog\u002Fhow-to-write-a-postmortem-guide",{"title":5,"description":864},"blog\u002Fhow-to-write-a-postmortem-guide","bYVJPUXwePmx-Q8g1iebfJhykRMcHoD8SjisNt_xYjo",1783438375238]