Engineering
Blue Friday: Resilience Lessons from the CrowdStrike Outage
Last Friday morning, a faulty content update to CrowdStrike's Falcon sensor sent something like 8.5 million Windows machines into a boot loop. Airlines grounded flights, hospitals postponed procedures, broadcasters went dark, and a lot of point-of-sale terminals spent the day showing a blue screen to a line of confused customers. It was, by most accounts, the largest IT outage in history, and it was not even an attack. It was a routine update from a vendor everyone trusted.
We build brand and commerce experiences, not endpoint security, so it would be easy to file this under somebody else's postmortem. We think that would be a mistake. The failure pattern, one trusted third party with the power to take you down instantly and globally, is the exact architecture of the modern marketing stack.
Count your single points of failure
Take an inventory of a typical commerce site we inherit: a tag manager loading forty scripts, a consent platform that gates rendering, a personalization vendor in the critical path, an A/B testing snippet that blocks first paint by design, a chat widget, a reviews widget, a font CDN. Any one of these shipping a bad update on a Friday can degrade or destroy the experience for every visitor, and most teams have never tested what that looks like.
So test it. This week, we ran a simple drill on our own properties and two client staging environments: block each third-party domain at the network level, one at a time, and watch what happens. The results ranged from "graceful, barely noticeable" to "infinite spinner on the checkout button." You want to find the second category before your customers do.
Design for degraded mode
The sites that behaved well under our drill shared a few habits worth stealing:
- Every third-party script loads async or deferred, with a timeout, and the page is functional if it never arrives.
- The consent platform failing open or closed is a deliberate, documented decision, not an accident.
- Personalization is an enhancement layered onto a complete default experience, so its absence means generic, not broken.
- There is a rendered, cached fallback for critical pages that can be served if the origin or the framework runtime misbehaves.
The defensive loading pattern is not complicated:
const loadVendor = (src, timeoutMs = 3000) =>
Promise.race([
import(src),
new Promise((_, reject) =>
setTimeout(() => reject(new Error("vendor timeout")), timeoutMs)
),
]).catch(() => null); // page continues without it
Null is a feature. A page that quietly loses its chat widget is a page that still sells things.
Staged rollouts are for everyone
The deeper lesson from Friday is about deployment discipline. A change that reaches one hundred percent of machines simultaneously has no blast radius control, and blast radius control is most of what resilience means in practice. We already canary application deploys, but marketing stacks rarely get the same care. Tag manager changes routinely go straight to production, globally, on a Friday afternoon, published by someone outside engineering.
Our new house rule, effective this week: tag and experiment changes follow the same rollout rules as code. Staged publish where the platform supports it, a named owner, a rollback plan, and nothing nonessential ships on Fridays.
Trust, but verify, then verify again
None of this is an argument against third parties. Nobody should build their own consent management or session replay. It is an argument for treating every vendor as a component that will eventually fail, because every component eventually fails. The teams that looked competent last Friday were not the ones with perfect vendors. They were the ones who had already imagined the bad day, and had built a Tuesday-quality experience that survived it.
Your stack has a CrowdStrike in it somewhere. Better to meet it in a drill than in the news.
Building something this could apply to?
We take on a small number of flagship projects each quarter.
Start a project