Going multi-region is the moment your architecture decisions stop being theoretical. This post is the working playbook for SaaS in 2026.
Why multi-region
Three real reasons:
- Latency. Users in Bangalore on a US-East server pay 250ms RTT. Local serving is 30ms.
- Data residency. EU customers’ data must stay in EU (GDPR + customer demand).
- Disaster recovery. One region fails; another takes over.
Any one of these is enough to justify the cost. None of them: stay single-region.
Tenant pinning — the simple model
Each customer’s data lives in one region. They sign up; pick a region (or default by IP); their data lives there forever.
User logs in
↓
Auth service looks up tenant's home region
↓
Routes to that region's stack
↓
Region serves all reads and writes locally
- Simple: each region is a complete deployment.
- Fast: all data local; no cross-region latency.
- Compliant: EU data stays in EU.
- Limitation: tenant can’t operate cross-region without explicit migration.
For 95% of B2B SaaS, this is the right model.
Routing
Two patterns:
DNS-based
Each region has its own subdomain: eu.app.example.com, us.app.example.com. Login redirects to the tenant’s region.
Path-based with edge router
app.example.com/* hits a global edge router (Cloudflare Worker, edge Lambda). It looks up the tenant; routes to the right region.
For Cloudflare Workers Durable Objects fit perfectly — one DO per tenant; lives in the right region.
Postgres patterns
Per-region primary
Each region has its own Postgres primary. Tenants are pinned. Cross-region replicas exist for DR / failover.
US: primary (writes) + EU replica (read for cross-region needs)
EU: primary (writes) + US replica
APAC: primary (writes) + cross-region replicas
For Postgres replication patterns .
Cross-region failover
If US primary dies: promote US replica in EU; users see brief degradation; failover within minutes.
DR runbook: practice it monthly. Untested failover doesn’t work.
Read replicas in non-home region
For tenants with users in multiple regions, a read replica in those regions lets reads stay local. Writes still go to home.
Application routes: writes to home region; reads to local replica with eventual consistency tolerated.
Data residency
For EU customers requiring data residency:
- Tenant in EU region.
- No cross-region replication of their data outside EU.
- CDN at EU edge only for their assets.
- Backups in EU.
- Audit log of any cross-region access.
Engineering for this isn’t free. Charge for it (enterprise tier).
Global state
Some data is genuinely global: user identity, billing, feature flags. Two patterns:
Eventually consistent
Single global Postgres in one region; replicas everywhere. Writes go to the central; reads can be slightly stale.
Most “global” data tolerates this — feature flags, billing usage records.
Distributed SQL
CockroachDB / Spanner / Yugabyte. True multi-region writes. See Distributed SQL in 2026 .
Costs: more ops, higher latency, more complexity. Use when tenant data is genuinely global (collaborative editing, financial trading).
Deploys
Deploy regions independently. Roll out a feature region-by-region for blast-radius control.
1. Deploy to EU staging.
2. Deploy to EU prod (small region).
3. Watch SLOs. ([SLOs and Error Budgets](https://blog.rajpoot.dev/posts/devops/slos-error-budgets-sre-app-developers/))
4. Deploy to US prod.
5. Deploy to APAC.
Region-aware GitOps (Argo CD ApplicationSet with cluster generator).
Latency budget
For a multi-region app, the latency dance:
- User → edge: 30–80ms.
- Edge → home region: 0 (local) or 100–200ms (cross-region routing miss).
- Home region: app + DB: 30–100ms.
- Total: 60–380ms.
Cross-region routing failures (a tenant served from the wrong region) kill UX. Test thoroughly.
Cost
Multi-region is more expensive:
- 3× compute (one per region, lower utilization in each).
- Cross-region traffic charges.
- More ops (3× the dashboards to watch).
- Per-region certificates, secrets, monitoring.
Plan: 2–3× single-region cost for the same workload. Charge enterprise pricing.
Common mistakes
1. Active-active without consensus
Two writers updating the same row in two regions = silent corruption. If you go active-active, use distributed SQL.
2. No tenant pinning awareness in code
Code assumes “the database” is one. After multi-region, code accidentally writes to the wrong region. Audit.
3. Forgetting backups per region
EU data backed up in US violates residency. Per-region backup pipelines.
4. Cross-region synchronous writes
A 300ms RTT for every write × 1000 writes per page load = unusable. Async replicate; serve writes locally.
5. No failover practice
Untested failover fails. Schedule game days. See Chaos Engineering .
What I’d ship today
For a SaaS going multi-region:
- Tenant pinning as the model.
- 3 regions (US, EU, APAC if APAC matters).
- Per-region Postgres + ElastiCache + S3.
- Cross-region async replicas for DR.
- Global edge router (Cloudflare Workers) for routing.
- Region-aware deploys via ApplicationSet.
- Quarterly DR drills.
Read this next
- Distributed SQL — CockroachDB / Spanner / Yugabyte
- Postgres Replication and HA in 2026
- Cloudflare Workers + D1 + Durable Objects
- Multi-Tenancy SaaS Patterns
If you want a multi-region SaaS reference architecture, it’s at rajpoot.dev .
Building something AI-, backend-, or data-heavy and want a second pair of eyes? I do consulting and freelance work — see my projects and ways to reach me at rajpoot.dev .