[{"data":1,"prerenderedAt":885},["ShallowReactive",2],{"\u002Fblog\u002Fhow-to-write-a-postmortem-guide":3},{"id":4,"title":5,"author":6,"body":8,"category":876,"date":877,"description":878,"extension":334,"image":879,"lastUpdated":879,"meta":880,"navigation":367,"path":881,"readingTime":456,"seo":882,"stem":883,"__hash__":884},"blog\u002Fblog\u002Fhow-to-write-a-postmortem-guide.md","How to Write a Postmortem That Prevents Repeat Incidents",{"name":7},"Vantaj Team",{"type":9,"value":10,"toc":858},"minimark",[11,15,18,23,70,73,77,153,157,162,165,169,172,176,189,193,196,207,211,214,228,232,235,239,242,246,322,325,329,787,791,805,809,836,840,854],[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,201,204],{},[27,199,200],{},"MTTD (mean time to detect)",[27,202,203],{},"MTTA (mean time to acknowledge)",[27,205,206],{},"MTTR (mean time to resolve)",[158,208,210],{"id":209},"_5-make-actions-measurable","5) Make actions measurable",[12,212,213],{},"Each action should include:",[177,215,216,219,222,225],{},[27,217,218],{},"owner",[27,220,221],{},"due date",[27,223,224],{},"success metric",[27,226,227],{},"risk reduced",[158,229,231],{"id":230},"_6-run-a-blameless-language-pass","6) Run a blameless language pass",[12,233,234],{},"Replace blame language with mechanism language. Name failing systems and decisions, not individual people.",[158,236,238],{"id":237},"_7-track-closure-not-publication","7) Track closure, not publication",[12,240,241],{},"A published postmortem without shipped actions is a status artifact, not an improvement loop.",[19,243,245],{"id":244},"benchmarks-for-saas-teams","Benchmarks for SaaS teams",[78,247,248,264],{},[81,249,250],{},[84,251,252,255,258,261],{},[87,253,254],{},"Metric",[87,256,95],{"align":257},"right",[87,259,260],{"align":257},"Acceptable",[87,262,263],{"align":257},"Needs work",[97,265,266,280,294,308],{},[84,267,268,271,274,277],{},[102,269,270],{},"MTTD",[102,272,273],{"align":257},"\u003C 2 min",[102,275,276],{"align":257},"2 to 5 min",[102,278,279],{"align":257},"> 10 min",[84,281,282,285,288,291],{},[102,283,284],{},"MTTR",[102,286,287],{"align":257},"\u003C 30 min",[102,289,290],{"align":257},"30 to 90 min",[102,292,293],{"align":257},"> 2 hours",[84,295,296,299,302,305],{},[102,297,298],{},"Postmortem publication",[102,300,301],{"align":257},"\u003C 48 hours",[102,303,304],{"align":257},"2 to 5 days",[102,306,307],{"align":257},"> 7 days",[84,309,310,313,316,319],{},[102,311,312],{},"30-day action closure",[102,314,315],{"align":257},"> 80%",[102,317,318],{"align":257},"60 to 80%",[102,320,321],{"align":257},"\u003C 60%",[12,323,324],{},"These thresholds help teams turn reliability conversations into measurable targets.",[19,326,328],{"id":327},"copy-ready-incident-postmortem-template","Copy-ready incident postmortem template",[330,331,336],"pre",{"className":332,"code":333,"language":334,"meta":335,"style":335},"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","",[337,338,339,362,369,378,395,409,424,439,454,459,467,475,483,491,496,504,518,532,546,561,566,574,595,612,617,625,631,636,644,656,667,672,680,694,708,713,721,763,768,776],"code",{"__ignoreMap":335},[340,341,344,348,352,355,359],"span",{"class":342,"line":343},"line",1,[340,345,347],{"class":346},"sMK4o","# ",[340,349,351],{"class":350},"sBMFI","Incident Postmortem: ",[340,353,354],{"class":346},"[",[340,356,358],{"class":357},"sfazB","Title",[340,360,361],{"class":346},"]\n",[340,363,365],{"class":342,"line":364},2,[340,366,368],{"emptyLinePlaceholder":367},true,"\n",[340,370,372,375],{"class":342,"line":371},3,[340,373,374],{"class":346},"## ",[340,376,377],{"class":350},"1) Summary\n",[340,379,381,384,388,390,393],{"class":342,"line":380},4,[340,382,383],{"class":346},"-",[340,385,387],{"class":386},"sTEyZ"," Start: ",[340,389,354],{"class":346},[340,391,392],{"class":357},"UTC",[340,394,361],{"class":346},[340,396,398,400,403,405,407],{"class":342,"line":397},5,[340,399,383],{"class":346},[340,401,402],{"class":386}," End: ",[340,404,354],{"class":346},[340,406,392],{"class":357},[340,408,361],{"class":346},[340,410,412,414,417,419,422],{"class":342,"line":411},6,[340,413,383],{"class":346},[340,415,416],{"class":386}," Duration: ",[340,418,354],{"class":346},[340,420,421],{"class":357},"minutes",[340,423,361],{"class":346},[340,425,427,429,432,434,437],{"class":342,"line":426},7,[340,428,383],{"class":346},[340,430,431],{"class":386}," Severity: ",[340,433,354],{"class":346},[340,435,436],{"class":357},"SEV1\u002FSEV2\u002F...",[340,438,361],{"class":346},[340,440,442,444,447,449,452],{"class":342,"line":441},8,[340,443,383],{"class":346},[340,445,446],{"class":386}," Services impacted: ",[340,448,354],{"class":346},[340,450,451],{"class":357},"list",[340,453,361],{"class":346},[340,455,457],{"class":342,"line":456},9,[340,458,368],{"emptyLinePlaceholder":367},[340,460,462,464],{"class":342,"line":461},10,[340,463,374],{"class":346},[340,465,466],{"class":350},"2) Customer Impact\n",[340,468,470,472],{"class":342,"line":469},11,[340,471,383],{"class":346},[340,473,474],{"class":386}," Affected users: [segment \u002F %]\n",[340,476,478,480],{"class":342,"line":477},12,[340,479,383],{"class":346},[340,481,482],{"class":386}," User symptoms: [what they saw]\n",[340,484,486,488],{"class":342,"line":485},13,[340,487,383],{"class":346},[340,489,490],{"class":386}," Business impact: [errors, revenue, support volume]\n",[340,492,494],{"class":342,"line":493},14,[340,495,368],{"emptyLinePlaceholder":367},[340,497,499,501],{"class":342,"line":498},15,[340,500,374],{"class":346},[340,502,503],{"class":350},"3) Detection and Response Metrics\n",[340,505,507,509,512,514,516],{"class":342,"line":506},16,[340,508,383],{"class":346},[340,510,511],{"class":386}," MTTD: ",[340,513,354],{"class":346},[340,515,421],{"class":357},[340,517,361],{"class":346},[340,519,521,523,526,528,530],{"class":342,"line":520},17,[340,522,383],{"class":346},[340,524,525],{"class":386}," MTTA: ",[340,527,354],{"class":346},[340,529,421],{"class":357},[340,531,361],{"class":346},[340,533,535,537,540,542,544],{"class":342,"line":534},18,[340,536,383],{"class":346},[340,538,539],{"class":386}," MTTR: ",[340,541,354],{"class":346},[340,543,421],{"class":357},[340,545,361],{"class":346},[340,547,549,551,554,556,559],{"class":342,"line":548},19,[340,550,383],{"class":346},[340,552,553],{"class":386}," Detection source: ",[340,555,354],{"class":346},[340,557,558],{"class":357},"monitoring\u002Fcustomer\u002Finternal",[340,560,361],{"class":346},[340,562,564],{"class":342,"line":563},20,[340,565,368],{"emptyLinePlaceholder":367},[340,567,569,571],{"class":342,"line":568},21,[340,570,374],{"class":346},[340,572,573],{"class":350},"4) Timeline (UTC)\n",[340,575,577,579,582,585,588,590,593],{"class":342,"line":576},22,[340,578,383],{"class":346},[340,580,581],{"class":346}," [",[340,583,584],{"class":357},"time",[340,586,587],{"class":346},"]",[340,589,581],{"class":346},[340,591,592],{"class":357},"event",[340,594,361],{"class":346},[340,596,598,600,602,604,606,608,610],{"class":342,"line":597},23,[340,599,383],{"class":346},[340,601,581],{"class":346},[340,603,584],{"class":357},[340,605,587],{"class":346},[340,607,581],{"class":346},[340,609,592],{"class":357},[340,611,361],{"class":346},[340,613,615],{"class":342,"line":614},24,[340,616,368],{"emptyLinePlaceholder":367},[340,618,620,622],{"class":342,"line":619},25,[340,621,374],{"class":346},[340,623,624],{"class":350},"5) Root Cause\n",[340,626,628],{"class":342,"line":627},26,[340,629,630],{"class":386},"[one specific statement]\n",[340,632,634],{"class":342,"line":633},27,[340,635,368],{"emptyLinePlaceholder":367},[340,637,639,641],{"class":342,"line":638},28,[340,640,374],{"class":346},[340,642,643],{"class":350},"6) Contributing Factors\n",[340,645,647,649,651,654],{"class":342,"line":646},29,[340,648,383],{"class":346},[340,650,581],{"class":346},[340,652,653],{"class":357},"factor",[340,655,361],{"class":346},[340,657,659,661,663,665],{"class":342,"line":658},30,[340,660,383],{"class":346},[340,662,581],{"class":346},[340,664,653],{"class":357},[340,666,361],{"class":346},[340,668,670],{"class":342,"line":669},31,[340,671,368],{"emptyLinePlaceholder":367},[340,673,675,677],{"class":342,"line":674},32,[340,676,374],{"class":346},[340,678,679],{"class":350},"7) What Worked \u002F What Failed\n",[340,681,683,685,688,690,692],{"class":342,"line":682},33,[340,684,383],{"class":346},[340,686,687],{"class":386}," Worked: ",[340,689,354],{"class":346},[340,691,451],{"class":357},[340,693,361],{"class":346},[340,695,697,699,702,704,706],{"class":342,"line":696},34,[340,698,383],{"class":346},[340,700,701],{"class":386}," Failed: ",[340,703,354],{"class":346},[340,705,451],{"class":357},[340,707,361],{"class":346},[340,709,711],{"class":342,"line":710},35,[340,712,368],{"emptyLinePlaceholder":367},[340,714,716,718],{"class":342,"line":715},36,[340,717,374],{"class":346},[340,719,720],{"class":350},"8) Action Items\n",[340,722,724,726,728,731,733,736,738,741,743,746,748,751,753,756,758,761],{"class":342,"line":723},37,[340,725,383],{"class":346},[340,727,581],{"class":346},[340,729,730],{"class":357},"action",[340,732,587],{"class":346},[340,734,735],{"class":386}," | Owner: ",[340,737,354],{"class":346},[340,739,740],{"class":357},"name",[340,742,587],{"class":346},[340,744,745],{"class":386}," | Due: ",[340,747,354],{"class":346},[340,749,750],{"class":357},"date",[340,752,587],{"class":346},[340,754,755],{"class":386}," | Success metric: ",[340,757,354],{"class":346},[340,759,760],{"class":357},"metric",[340,762,361],{"class":346},[340,764,766],{"class":342,"line":765},38,[340,767,368],{"emptyLinePlaceholder":367},[340,769,771,773],{"class":342,"line":770},39,[340,772,374],{"class":346},[340,774,775],{"class":350},"9) Follow-up Review Date\n",[340,777,779,781,783,785],{"class":342,"line":778},40,[340,780,383],{"class":346},[340,782,581],{"class":346},[340,784,750],{"class":357},[340,786,361],{"class":346},[19,788,790],{"id":789},"common-mistakes-to-avoid","Common mistakes to avoid",[177,792,793,796,799,802],{},[27,794,795],{},"Publishing without action owners.",[27,797,798],{},"Using generic wording that hides mechanisms.",[27,800,801],{},"Ignoring process contributors and focusing only on code bugs.",[27,803,804],{},"Skipping closure tracking for action items.",[19,806,808],{"id":807},"related-blog-posts","Related blog posts",[177,810,811,816,821,826,831],{},[27,812,813],{},[337,814,815],{},"\u002Fblog\u002Fincident-postmortem-template",[27,817,818],{},[337,819,820],{},"\u002Fblog\u002Fmttr-mttd-mtbf-incident-metrics",[27,822,823],{},[337,824,825],{},"\u002Fblog\u002Fincident-response-checklist-startups",[27,827,828],{},[337,829,830],{},"\u002Fblog\u002Fwebsite-outage-response-runbook",[27,832,833],{},[337,834,835],{},"\u002Fblog\u002Fhow-to-communicate-during-service-outage",[19,837,839],{"id":838},"stop-slop-check","Stop-Slop check",[177,841,842,845,848,851],{},[27,843,844],{},"Direct language, no filler intros.",[27,846,847],{},"Active voice and clear actors.",[27,849,850],{},"Concrete metrics and thresholds.",[27,852,853],{},"Actionable template with owners and due dates.",[855,856,857],"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":335,"searchDepth":364,"depth":364,"links":859},[860,861,862,871,872,873,874,875],{"id":21,"depth":364,"text":22},{"id":75,"depth":364,"text":76},{"id":155,"depth":364,"text":156,"children":863},[864,865,866,867,868,869,870],{"id":160,"depth":371,"text":161},{"id":167,"depth":371,"text":168},{"id":174,"depth":371,"text":175},{"id":191,"depth":371,"text":192},{"id":209,"depth":371,"text":210},{"id":230,"depth":371,"text":231},{"id":237,"depth":371,"text":238},{"id":244,"depth":364,"text":245},{"id":327,"depth":364,"text":328},{"id":789,"depth":364,"text":790},{"id":807,"depth":364,"text":808},{"id":838,"depth":364,"text":839},"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":878},"blog\u002Fhow-to-write-a-postmortem-guide","r8TashVNcJI0EmIWMBiVwQV2UqZ6g8glagpC18pjFpw",1782766757088]