1.SEV1: expired TLS certificate
When it fits: Use this when the outage was total, customers noticed before your monitoring did, and the real cause is a change made months earlier.
Post-mortem: API certificate expiry, 2026-11-03
Incident: INC-2291 Severity: SEV1 Status: Final Owner: Bianca Novak Incident lead: Desmond Clarke Review meeting: 2026-11-05 Related: [[orders-gateway]]
Blameless: this document describes what the system and our process allowed, not who to blame.
Summary
The TLS certificate on the API hostname expired at 13:00 UTC. Mobile apps and partner integrations could not connect for 47 minutes. A manually issued certificate restored service; automatic renewal is fixed.
Impact
- Duration: 13:00 to 13:47 UTC (47 min)
- Who was affected: all mobile users and 31 partner integrations; the website was unaffected (different certificate)
- Detected by: customer reports on social media, 9 minutes after start
- Support tickets: 412
- Data or money lost: an estimated 1,900 orders not placed
Timeline (UTC)
- 13:00 Certificate expires (source: certificate transparency log)
- 13:09 First support ticket; 13:11 incident declared (chat)
- 13:18 Desmond identifies the expiry with an openssl check
- 13:41 New certificate issued manually, deployed to the gateway
- 13:47 Error rate back to baseline (dashboard)
Contributing factors
- Trigger: the certificate reached its expiry date.
- Why it caused impact: auto-renewal had failed silently since the August DNS migration removed the validation record.
- Why we did not catch it sooner: the expiry alert checked the website hostname, not the API hostname. Renewal failures were logged but not alerted on.
What went well
- Diagnosis took 7 minutes once the right person joined.
What went badly
- 9 minutes from start to declaration, driven by customers.
- Nobody knew which DNS records the renewal depended on.
Where we got lucky
- The website certificate was on a different renewal path and stayed up.
Action items
- Prevent: restore the DNS validation record and test renewal end to end (@Desmond) @due(2026-11-06)
- Detect: expiry alert for every public hostname at 21 and 7 days (@Bianca) @due(2026-11-10)
- Detect: alert on any failed renewal attempt (@Bianca) @due(2026-11-10)
- Process: DNS migration checklist lists records owned by other systems (@Desmond) @due(2026-11-20)
Follow-up check
- All four closed or re-planned (@Bianca) @due(2026-12-05)