← Tools I Use

When the Platform Goes Down, Your Jobs Fail Silently: Lessons from the June 2026 Copilot Outage

2026-06-03 · ~7 min read · Conor Dobbs

On Monday, June 1, 2026, Microsoft 365 Copilot fell over for the better part of a working day. Reports to Downdetector climbed through the late morning Eastern time and peaked just before noon; users across North America and Europe got app-load timeouts, couldn't open the assistant, and in some cases watched their recent conversation history quietly fail to load. Microsoft traced it to a misconfigured load-balancing change in the layer that routes Copilot requests, and it took roughly six hours to fully restore. As outages go it was unglamorous — not a meltdown of the underlying models, just a config change in the plumbing that sits in front of them.

I don't run on Copilot, so this wasn't my fire to fight. But I read the incident reports with the specific dread of someone who runs a lot of automation against other people's platforms, because the interesting part of this outage isn't the root cause. It's the shape of the failure, and how it would have shown up — or rather, not shown up — in a system that depends on Copilot for something automated.

The failure your monitoring was never built to see

Here's the thing that makes upstream outages so dangerous: from inside your own stack, they don't look like errors. They look like nothing.

Think about what actually happens when a platform you call into goes dark for six hours. A nightly job that enriches records through an upstream API doesn't crash — it gets timeouts, swallows them in a try/except that some past version of you wrote to "be resilient," and exits 0 having done no work. A webhook the platform was supposed to send never arrives, so the handler that processes it simply never runs. A scheduled sync that reads from the down service reads zero rows and faithfully writes zero rows downstream. Your dashboards are green. Your error rate is flat. Your logs are quiet. And your business is silently not happening.

This is the same trap I've written about with cron jobs that silently stop, and it generalizes: your alerting is built to catch things that happen, and an upstream outage is a thing that doesn't happen. A 500 trips a check. A request you never got to make, or a response that came back empty-but-valid, trips nothing. The outage is real and expensive, and the only signal your system produces is an absence.

Why "the vendor has a status page" isn't your monitoring

The reflexive answer is: I'll just watch the vendor's status page. Two problems with that.

First, status pages are famously slow and famously generous to the vendor. The gap between "users are clearly broken" and "the status page goes yellow" is often the whole first hour of an incident — exactly the hour you'd want to have already failed over, queued the work for retry, or at least stopped telling your own customers everything is fine. During the Copilot incident, plenty of teams knew from their own users before any official acknowledgment landed.

Second, and more important: the vendor's status page tells you about the vendor, not about you. It can't know that your particular integration, your particular job, your particular webhook is the thing that broke. A platform can be "operational" overall while the one API you depend on is degraded in your region. The only thing that knows whether your work is getting done is something watching your work.

The fix is to monitor your own heartbeat, not theirs

The pattern that actually catches this is the same one that catches a dead cron job: make the work that matters check in on a schedule, and make the absence of a check-in the alert. The mental shift is to stop monitoring "is the upstream up?" and start monitoring "did my thing that depends on the upstream actually complete?"

Concretely, for any job or integration that leans on an outside platform:

Full disclosure: I build a dead-man's-switch monitor (CronCanary), so I'm obviously biased toward this approach. But the pattern matters more than the tool — Healthchecks.io is open source and excellent, and you can wire the same idea up by hand with a cron line and a webhook. The point isn't which URL you ping. The point is that something off your platform is keeping time, so when an upstream like Copilot goes dark and your dependent job stops checking in, you find out in minutes instead of when a customer asks why their report is three days old.

What the Copilot outage should actually change

Microsoft will publish a post-incident review, ship the usual "stronger isolation between config changes and the request path" remediations, and the next outage will have a different root cause anyway. Chasing vendors' root causes is not a strategy you can build on, because you don't control their plumbing. What you do control is whether your own system can tell the difference between "everything is fine" and "everything is quietly broken."

So the takeaway isn't "Copilot is unreliable" — every platform has its day. The takeaway is the uncomfortable question every June-1-style incident hands you for free: if the platform you most depend on went dark for six hours right now, how would you find out — and how long would it take? If the honest answer is "a customer would tell me," you don't have a monitoring problem with that vendor. You have a monitoring problem with yourself, and it's the cheap kind to fix.

List the jobs and integrations that lean on someone else's uptime. Next to each, write down how long it can silently fail before it costs you something real. Then put a heartbeat on the ones where that number is small. That list is an afternoon of work, and it's the difference between a six-hour outage being an annoyance and it being the thing you discover eleven days later.

← More tools I actually use