Postmortem · Payments outage of Friday, February 5
On Friday, February 5, nobody could pay at any Farmgate shop from 9:12 to 10:03 a.m. Eastern. The security certificate for our payment pages expired because its automatic renewal had been failing for 30 nights, and the warnings went to a mailbox no one reads. We renewed it by hand, have added the two alarms that would have caught this in January, and list the rest of the fixes below.
By Deborah Achterberg, head of engineering, with the on-call engineer and the support lead on shift. This review is blameless: it describes systems and decisions, and looks for no one to fault.
Shoppers came back and paid for 832 of the 1,280 orders by Sunday night. The 448 that stayed lost were worth about $20,800 to our shops, at an average order of $46.50. No card details were exposed and nobody was charged twice. Support answered 94 tickets.
Friday, February 5. All times a.m., Eastern.
A certificate is what lets a browser trust that pay.farmgate.example is really ours. Each one lasts 90 days. A nightly job renews it once 30 days are left, and to do that the job must prove we control the domain by adding a temporary record to our DNS.
On December 15 we moved our DNS to a new provider. The renewal job wasn’t on the migration checklist, so it kept the old provider’s key. The payments certificate reached its 30-day mark on January 6. The job failed that night and the 29 nights after it, until the certificate ran out.
Each failure was emailed to a shared mailbox set up years ago that no team reads. Nothing else was watching the expiry date.
Our payments alarm counts requests that fail. With an expired certificate the browser gives up before it sends anything, so our servers saw no failures. They saw no payments at all, and nothing alarms on silence.
Two more certificates were on the same path, due to expire on February 19 and March 2. Both were renewed by hand on the day.
| No. | Action | Owner | Due | Status |
|---|---|---|---|---|
| 1 | Check every public certificate from outside our network each hour, and page when one has fewer than 21 days left. | Dele OkaforPlatform | Fri, Feb 5 | Done |
| 2 | Send renewal failures to the on-call pager and close the shared mailbox. | Dele OkaforPlatform | Mon, Feb 8 | Done |
| 3 | Let the support lead on shift change the status page without asking engineering. | Aroha NgataSupport | Wed, Feb 10 | In progress |
| 4 | Alarm when no payment succeeds for five minutes between 7 a.m. and 10 p.m. Eastern. | Mirela PopescuPayments | Fri, Feb 12 | In progress |
| 5 | Add “what writes to this system?” to the migration checklist, and go back over the December DNS move with it. | Jonas BergströmInfrastructure | Fri, Feb 19 | Planned |
| 6 | List every certificate and scheduled job, each with a team that owns it. | Dele OkaforPlatform | Fri, Feb 26 | Planned |
We will go through this list again on Monday, March 1, and say in the engineering update which items are closed. Corrections to this review are welcome: tell the Platform team.