Your Ring doorbell stopped answering. United's check-in screens went blank. Your bank's app spun, then failed, then told you to try later. None of those services look related — until you learn they all spent October 20, 2025 in the same place: AWS us-east-1.
At 03:11 ET that morning, AWS flagged elevated error rates in its Northern Virginia region. A race condition in DynamoDB's DNS automation had quietly broken the address book other AWS services use to find DynamoDB. Because DynamoDB stores session tokens, config, and metadata for dozens of sibling services, the failure cascaded across Lambda, ECS, EKS, Fargate, IAM, Amazon Connect, and more. DNS was mitigated at 02:24 PDT, but backlog drain and retry storms dragged the incident to roughly 15 hours — until about 15:01 PDT — before AWS declared full recovery.
That number — 15 hours — is the one to carry into every cost conversation below. Headlines quoted aggregate losses in the hundreds of millions. Those matter for insurance reports. They do not tell you what your app lost. This table does — plug in your own hourly number.
The worksheet, up front — find your row before you read the why
Formula: cost = (hourly_revenue + support_burn + SLA_credits) × duration + recovery_tail. Recovery tail is the extra hours after "all clear" spent draining queues, replaying webhooks, and answering tickets. Ignore it and you undercount by 20–40%.
| Your hourly burn | 5 hours (short us-east-1 hiccup) | 15 hours (Oct 2025 actual) | 138 hours (5d 18h, OVH-scale tail) |
|---|---|---|---|
| Small — $1k/hr (early SaaS / side project) | $5,000 | $15,000 | $138,000 |
| Mid — $10k/hr (seed-stage SaaS, ~$7M ARR) | $50,000 | $150,000 | $1,380,000 |
| Large — $100k/hr (scale-up, ~$70M ARR) | $500,000 | $1,500,000 | $13,800,000 |
Add $5k–$30k in support overtime and SLA credits for the mid-tier row, double that for the large row, and you land where Censinet did when it estimated $62,500 per hour for healthcare organizations alone during the same outage. CyberCube's $581 million in modelled insurance losses is the same event measured with a different denominator — the whole economy, not one tenant.
The rest of this post puts those numbers in context: why half the internet felt like it shared that one region, why you were in us-east-1 even though you never picked AWS, and what a fault domain you draw yourself actually has to get right to be cheaper — not just different.
The 15 Hours That Took Your Stack With It (and the Four Before It)
The October 2025 outage was not a new species. It was the latest, longest instance of a pattern us-east-1 has repeated every 12–24 months.
| When | What broke | How long | Why it matters |
|---|---|---|---|
Nov 25, 2020 — us-east-1 Kinesis | Kinesis ingestion stalled; CloudWatch, Lambda, and sites depending on real-time streams degraded | ~17 hours, staggered | Showed a single service inside us-east-1 could block dozens of others |
Dec 7, 2021 — us-east-1 networking | Internal network impairment took down the AWS console and major apps (Slack, Epic Games, Ring, Roomba) | ~7 hours | Proved consumer hardware (door locks, vacuums) shared the same blast radius as enterprise SaaS |
Jun 13, 2023 — us-east-1 Lambda/ECS | Lambda invocation failures, ECS task launch errors | ~4–5 hours | Hit compute itself, not just a data plane — apps could not start new work at all |
Oct 20–21, 2025 — us-east-1 DynamoDB DNS | Race condition in DynamoDB DNS automation → 113 AWS services affected (Lambda, EC2, S3, IAM, Connect) | ~15 hours (03:11 ET → 02:24 PDT mitigated → 15:01 PDT recovered) | Longest recent. 17M+ Downdetector reports. The one that broke Ring, Reddit, Snapchat, Roblox, Fortnite, Coinbase, Venmo, and United/Alaska check-in in the same window. |
Jul 2026 — us-east-1 minor warn cluster | Pinecone, DataStax Astra, and Cube Cloud all logged warned/degraded windows of 10m–14h in the same July fortnight | Scattered hours | No single mega-event, but enough independent us-east-1 warn states in two weeks that any tenant with two vendors in the region hit at least one |
Sources: AWS post-incident summary for Oct 2025 (DynamoDB DNS), Ookla/Catchpoint Downdetector analysis (17M reports vs 16M initially), GeekWire and TechCrunch contemporaneous coverage, Central Technology and Cato Networks impact roundups, StatusGator aggregations for July 2026, eG Innovations/Aviatrix timelines.
Three structural facts turn that pattern from "AWS had a bad day" into "you had a bad day":
us-east-1is the default. The AWS docs still note it as the default region for many SDKs and services, and it is the oldest, largest region by service footprint. Teams that never setregionend up there. So do many SaaS vendors.- DynamoDB sits underneath the control plane. Even if your workload stores nothing in DynamoDB, the AWS services you call do — for auth tokens, shard maps, quota state. When DynamoDB's endpoint cannot be resolved, IAM cannot verify you and Lambda cannot route you.
- Blast radius is uncorrelated with product category. A smart lock, an airline DCS, and a hospital EHR have no reason to share a fault domain. In October 2025 they did, because their vendors shared
us-east-1. TechTarget put it plainly: "organizations without direct AWS contracts experienced downtime because their SaaS vendors, payment processors and authentication services depended on the US-EAST-1 infrastructure."
That last point is why the worksheet above uses your hourly burn, not CyberCube's aggregate. Half the internet did not literally sit on us-east-1 — Cloudflare Radar and W3Techs put roughly a third of the top-million sites behind AWS, and us-east-1 holds the plurality but not the majority of AWS capacity. What was true is that enough of the middleware your app touches — auth, payments, email, error tracking, feature flags — had at least one critical dependency in us-east-1 that the median tenant was unknowingly single-region in exactly the way they would have rejected if it had been presented as an architecture choice.
Why You Were in us-east-1 Even Though You Never Chose AWS
Do this 30-second check. You only need the answer to "where does the platform I pay actually run?"
| If you host on… | You actually run in… | How you inherit us-east-1 |
|---|---|---|
| Render | AWS and GCP, per region. Oregon and Ohio are the two US options; Frankfurt and Singapore for EU/AP. | Regional choice is explicit, but the default new service often lands on us-east-1-adjacent routing (Cloudflare + AWS backbone), and any add-on (managed Postgres on AWS, object storage via AWS) may still be us-east-1 even when your web service is not |
| Heroku | AWS us-east-1 (Common Runtime) or eu-west-1 (EU). Private Spaces can be other regions, but most hobby-to-growth apps live on Common Runtime. | Default is us-east-1. You opt out of us-east-1 by paying for EU or Private Spaces. |
| Vercel | AWS backbone (plus CloudFront/CDN). Functions and edge middleware execute across AWS regions, with iad1 (us-east-1, Washington) as a gravity well for US traffic. | Even static-frontend teams inherit us-east-1 via ISR revalidation, Serverless Functions, and Log Drains — the July 2026 Log Drains gap was itself us-east-1-adjacent |
| Railway / Fly.io / Netlify | Varies (Railway heavy on AWS us-west-2; Fly.io on its own Anycast fleet but with upstream network dependencies; Netlify on AWS) | Multi-region PaaS reduces but does not eliminate the hop — Fly.io's own July 22, 2026 DFW maintenance window proved a tenant can be down because Fly.io's upstream was down |
Now count the second layer — the vendors those platforms call:
| Vendor category | Typical hosted dependency | Where they often run |
|---|---|---|
| Auth (Auth0, Clerk, WorkOS) | Token verification, JWKS | us-east-1 primary; EU is a paid option |
| Payments (Stripe, Paddle) | Webhook delivery, dashboard | Stripe's API is multi-region, but many ancillary services (Sigma, Radar) have us-east-1 control-plane ties |
| Database (Neon, Supabase, PlanetScale) | Control plane, branching | Control planes frequently us-east-1; data plane can be elsewhere, but provisioning still blocked when the control plane is down |
| Observability (Datadog, Sentry) | Ingest, alerting | US ingestion often us-east-1-fronted |
Each hop adds a shared fate you never drew. A single-app team in 2025 typically had 3–6 such hops before a request reached its own code. The question is not "do we use AWS?" It is "how many of the services we pay call AWS us-east-1 on our behalf, and do we know which ones?"
The Blast Radius Math: Shared Fate vs. Drawn Boundary
Put the two worlds side by side with numbers, not adjectives.
| Dimension | Shared fate: one hyperscaler region (the default) | Drawn boundary: owned Hetzner fleet under Cluster API |
|---|---|---|
| Fault domain | A vendor drew it. Northern Virginia — one metro, one power grid, one set of undersea fibers. All tenants in the region share it. | You drew it. fsn1 (Falkenstein) + nbg1 (Nuremberg) + hel1 (Helsinki) — three metros, two countries, three network fabrics. Per-MachineDeployment placement; failure of one location is a pool event, not a platform event. |
| Blast radius denominator | IncidentHub H1 2026 counted 30,246 outages across 1,082 providers in six months — the cost of multi-tenancy is that one bad deploy becomes everyone's outage. Your incident is correlated with theirs. | Single-tenant fleet. Your outage is yours. You trade correlated failures (many tenants, one region) for uncorrelated ones (your hardware, your config). Fewer incidents to watch, but when one hits, it is on you. |
| Remediation queue | Vendor's triage. Scaleway's H1 2026 object storage fix took 51 days to roll region-by-region. OVHcloud's web hosting incident took 5 days 18 hours. You wait behind every other tenant. | Operator's triage. A failed Hetzner node is a MachineHealthCheck → delete → CAPH provisions a replacement. Typical wall time: minutes to low hours (hardware swap is the long pole), and you set the priority because there is no shared queue. |
| Visibility | Status page you can read but cannot route around. Retry storms from thousands of tenants prolong your MTTR independently of your own traffic (Oct 2025's post-mitigation tail). | Prometheus + Loki you own. No third-party pipe for telemetry to vanish into — Vercel's July 23, 2026 Log Drains gap (six minutes marked unrecoverable) cannot happen to logs that never leave your fleet. |
| Monthly infra cost for the boring workload | Variable. A Next.js + Postgres + worker fleet on usage-metered PaaS can land $20–$200/mo at the same traffic level as meters for builds, bandwidth ($0.15/GB overage on Vercel Pro), functions, and add-on storage each move independently. | Flat. A Hetzner CX22 or ARM CAX11 at €3.79–€4.15/mo with 20 TB included bandwidth is the same number every month whether it handled 10 requests or 10 million. Three nodes for HA is still ~€12/mo before you add managed Postgres elsewhere. |
The honest row is the monthly cost. Hyperscaler pricing wins at truly spiky, mostly-idle shapes — Azure Container Apps' 180,000 vCPU-second free grant, or Cloudflare Workers with zero egress for stateless bursts, can be cheaper than idle iron you own at 5% utilization. The flat-box pitch wins at steady utilization above ~50%, which is where the boring 24/7 API + worker + Postgres workload most teams actually run lives. Medium's 2026 Hetzner move post that measured an 89% cut moving a steady API from AWS to Hetzner is a single anecdote, but Ankra's six-cloud Kubernetes benchmark that same summer found the same directionality at equal instance class.
Use the worksheet again here. If your 15-hour loss under the large row is $1.5M, you can tolerate a lot of flat-box overhead before owning the boundary stops paying. If your 15-hour loss under the small row is $15k and you value never paging at 03:11 ET more than you value owning the metal, the hosted trade may still be right — but at least it is now a number, not a vibe.
What "Own the Fleet" Has to Get Right (and What It Doesn't Magically Fix)
Owning the fault domain does not mean outages disappear. It means they become yours to prevent and to fix, with different failure modes. The ones that bite a Hetzner-backed Cluster API fleet are not price hikes — they are capacity and operations.
The three failure modes to wire for before you need them:
-
"No capacity in this location." Hetzner's 2026 status page has carried repeated limited availability notices as DRAM/NAND pressure constrains specific server lines. A
MachineDeploymentscaling infsn1can now fail with sold-out inventory, not a billing error. Mitigation is multi-location, multi-type fallback — never bet a fleet on one location and one SKU. -
"The hardware failed, not the software." On bare metal you swap a disk via a support ticket; on Hetzner Cloud you delete the machine and let CAPH recreate. MTTR is hours, not minutes, and you own the spare-capacity math. Hold 20% headroom (e.g., 3 nodes where 2 carry peak) so one lost node is not an outage, or you have just traded a provider queue for a self-inflicted one.
-
"The account, not the app." Hetzner's abuse automation is famously sharp-edged — the "absurdly cheap, sole-owner, account-terminated-without-appeal" review is not fringe lore. Guard the fleet provider account as tier-zero infrastructure: 2FA, billing alerts, secondary contact, and a tested restore path to a second Hetzner (or Hetzner-adjacent) account and to another provider entirely.
A minimal CAPH shape that survives all three:
# 5 lines that matter — full module at github.com/bex-co/bex
failureDomains: [fsn1, nbg1, hel1] # not one region
serverTypes: [cax11, cpx11, cx22] # Arm + x86 fallback
replicas: 3 # 20% headroom for N-1That is the whole trick. Not a custom scheduler — just never let a single location string or a single server_type be load-bearing. The rest is standard Kubernetes: PodDisruptionBudget, TopologySpreadConstraints, and an off-cluster etcd backup you have actually restored.
| Owned-fleet tradeoff | What it really means |
|---|---|
| Pro: flat, legible bill | €3.79–€12/mo per small fleet tier; 20 TB included bandwidth; no per-invocation or per-GB egress meter to discover next quarter |
| Pro: GDPR + owned DCs | Hetzner runs company-owned data centers in the EU; data residency is a placement decision, not a compliance add-on SKU |
| Pro: API-render compatibility | A Render-compatible API plus an open MCP server means AI agents operate the same App CR locally that a human would — no vendor acquihire (Stakpak → Vercel, July 2026) to wait for |
| Con: limited global edge | If you need 20+ PoPs with <50 ms global TTFB, Hetzner's four core locations plus Cloud is not a CDN. Put a real CDN in front or stay on a hyperscaler edge. |
| Con: operational load | You are the on-call for node failures, OS patches, and control-plane upgrades. Cluster API automates lifecycle, but it does not automate judgment — budget 2–4 hours / month for a small fleet. |
| Con: concentration elsewhere | The same grid that constrains AI campuses (24–36 month connection approvals, 140 kW racks, Berlin's January 2026 cable-bridge arson explicitly targeting AI power draw) constrains any concentrated compute. A three-location spread is more resilient than a single hyperscaler campus, but it is not immune to the DRAM and power squeezes already lifting Hetzner prices. |
The line to carry: self-hosting trades correlated multi-tenant outages and a bill that grows new line items (Fly.io's volume snapshots in January 2026, inter-region private networking at Machine rates in February 2026) for uncorrelated, operator-owned failures and a bill that is the same number every month. Whether that trade is good depends on your 15-hour row in the worksheet, not on a manifesto.
Designing for the Next us-east-1
There will be a next one. The policy question is not how to prevent hyperscaler failures, but how to make their blast radius explicit before the status page turns red.
Three steps this week, not this quarter:
-
Map your inherited dependencies. List every vendor you pay that can put your app in
us-east-1on your behalf — hosting, auth, payments, DB control plane, email, error tracking, feature flags. For each, note its primary region and whether failover is automatic, manual, or nonexistent. You will find at least two you had not thought of. -
Draw your fault domains on purpose. If you stay hosted, choose the region explicitly (Render Ohio vs Frankfurt, Herald EU, Vercel
fra1) and test what breaks when you intentionally fail that region. If you own the fleet, implement the five-line CAPH shape above across three Hetzner locations with two server types, thenkubectl drainone location and watch the workload reschedule. The drill is the document. -
Price the next 15 hours before it happens. Put your hourly burn into the worksheet at the top and decide, with your co-founders, whether a $15k, $150k, or $1.5M 15-hour loss is an annoyance, an incident, or an existential event. The answer determines how much headroom, multi-region spend, and operational overhead is rational — which is the exact inverse of discovering the answer at 03:11 ET.
us-east-1 is not going away. As the oldest, largest AWS region it will keep attracting new services, new defaults, and new customers — and, every 12–24 months, a new incident report. The teams that sleep through the next one will not be the ones whose vendors finally achieved five nines. They will be the ones who drew a boundary small enough that a single region going dark is a problem for someone else's whole internet, not for theirs.
Bex.co is the open-source, AI-native Render alternative — push a git repo, get a running HTTPS service on machines you own. A single Render-compatible API plus an open MCP server so humans and agents operate the same fleet. Star the repo on GitHub or provision your first three-node fleet across fsn1/nbg1/hel1 today.