Is Supabase Down? Developer's Guide to Handling Outages (2026)
TLDR: Check if Supabase is down at apistatuscheck.com/api/supabase. This guide covers how to detect Supabase outages affecting your database, auth, and storage, plus offline-first patterns to keep your app functional.
TLDR: When Supabase goes down, check status.supabase.com and apistatuscheck.com/api/supabase. Build resilience with connection pooling, database connection retries, client-side caching, and fallback auth providers so your app degrades gracefully instead of going completely offline during outages.
Your app just stopped loading data. Auth is failing. Realtime subscriptions dropped. Your users are refreshing and nothing's happening. Supabase might be down — and since it's your database, auth provider, storage layer, and realtime engine all in one, a Supabase outage can take your entire app offline.
Here's how to confirm it's Supabase, respond immediately, and architect your app so the next outage doesn't take everything down with it.
Is Supabase Actually Down Right Now?
Before you start debugging your queries, confirm it's a Supabase issue:
- API Status Check — Supabase — Independent monitoring with response time history
- Is Supabase Down? — Quick status check with 24h timeline
- Supabase Official Status — Supabase's Statuspage (sometimes delayed)
- Downdetector — Supabase — Community-reported outages
What Supabase Outages Look Like
Supabase isn't a single service — it's a platform built on several components. Knowing which piece is failing changes your response:
| Component | Symptoms | Impact |
|---|---|---|
| Database (Postgres) | Queries timeout, ECONNREFUSED, 57P03 errors |
Full data layer down |
| Auth (GoTrue) | Login/signup fails, JWT refresh errors | Users locked out |
| Realtime | Subscriptions drop, no live updates | Features degrade |
| Storage | File uploads/downloads fail, 5xx on objects | Media broken |
| Edge Functions | 502/503 on function invocations |
Serverless logic down |
| Dashboard/API | Can't manage projects, REST API errors | Development blocked |
| PostgREST | REST queries return 500, schema cache stale |
API layer broken |
Key insight: Supabase runs your Postgres in a specific region. Outages are often region-specific — your ap-southeast-1 project can be down while us-east-1 is fine. Always check YOUR project's region status.
Recent Supabase Incidents
- Jan 2026 — Elevated 5xx errors and high response times in
ap-southeast-1region. Other regions remained healthy. - Nov 2025 — Brief service warning lasting ~1 hour affecting dashboard and management API.
- Regular maintenance — Supabase schedules maintenance windows (typically 02:00-03:00 UTC) for platform stability updates.
Architecture Patterns for Supabase Resilience
Read Replicas for Critical Reads
If you're on Supabase Pro or higher, enable read replicas. Your primary can go down while reads continue:
// Primary for writes
const primaryClient = createClient(PRIMARY_URL, ANON_KEY)
// Read replica for queries
const readClient = createClient(READ_REPLICA_URL, ANON_KEY)
async function resilientQuery(table: string, query: string) {
try {
// Try read replica first (lower load)
return await readClient.from(table).select(query)
} catch {
// Fall back to primary
return await primaryClient.from(table).select(query)
}
}
Cache Critical Data
Don't hit Supabase for data that rarely changes:
import { LRUCache } from 'lru-cache'
const cache = new LRUCache<string, any>({
max: 500,
ttl: 1000 * 60 * 5, // 5 minutes
})
async function getCachedQuery(key: string, queryFn: () => Promise<any>) {
const cached = cache.get(key)
if (cached) return cached
try {
const result = await queryFn()
if (result.data) cache.set(key, result)
return result
} catch (error) {
// Return stale data if Supabase is down
const stale = cache.get(key, { allowStale: true })
if (stale) {
console.warn(`Serving stale data for ${key} — Supabase may be down`)
return stale
}
throw error
}
}
// Usage
const products = await getCachedQuery('featured-products', () =>
supabase.from('products').select('*').eq('featured', true)
)
Realtime Reconnection Strategy
Supabase Realtime channels can drop during partial outages. Don't just subscribe and forget:
function createResilientChannel(channelName: string, table: string, callback: (payload: any) => void) {
let channel: any = null
let reconnectTimer: any = null
function connect() {
channel = supabase
.channel(channelName)
.on('postgres_changes', { event: '*', schema: 'public', table }, callback)
.subscribe((status: string) => {
if (status === 'SUBSCRIBED') {
console.log(`Realtime connected: ${channelName}`)
clearTimeout(reconnectTimer)
}
if (status === 'CLOSED' || status === 'CHANNEL_ERROR') {
console.warn(`Realtime lost: ${channelName}, reconnecting in 5s...`)
reconnectTimer = setTimeout(connect, 5000)
}
})
}
connect()
return () => {
clearTimeout(reconnectTimer)
channel?.unsubscribe()
}
}
Monitoring Supabase Proactively
Don't wait for users to tell you Supabase is down. Set up monitoring:
Health Check Endpoint
Add a /api/health route that tests Supabase connectivity:
// Next.js API route: /api/health
export async function GET() {
const checks = {
database: false,
auth: false,
storage: false,
timestamp: new Date().toISOString(),
}
try {
// Test database
const { error: dbError } = await supabase.from('_health').select('count').single()
checks.database = !dbError
} catch { checks.database = false }
try {
// Test auth service
const res = await fetch(`${process.env.NEXT_PUBLIC_SUPABASE_URL}/auth/v1/health`)
checks.auth = res.ok
} catch { checks.auth = false }
try {
// Test storage
const { error: storageError } = await supabase.storage.from('public').list('', { limit: 1 })
checks.storage = !storageError
} catch { checks.storage = false }
const allHealthy = Object.values(checks).every(v => v === true || typeof v === 'string')
return Response.json(checks, { status: allHealthy ? 200 : 503 })
}
Set Up Alerts
- API Status Check — Get notified via Discord/Slack when Supabase status changes
- Supabase Dashboard Alerts — Built-in alerts for database CPU, memory, and connection limits
- Custom monitoring — Hit your
/api/healthendpoint every minute with UptimeRobot or similar
Common Supabase Error Codes
| Error | Meaning | Fix |
|---|---|---|
PGRST301 |
JWT expired | Refresh auth token |
PGRST204 |
Column not found | Check schema cache, refresh PostgREST |
53300 |
Too many connections | Use connection pooler (port 6543) |
57P03 |
Cannot connect | Database restarting or region outage |
42501 |
Permission denied | Check RLS policies |
ECONNREFUSED |
Connection refused | Full outage or wrong connection string |
FetchError |
Network error | Check DNS, firewall, or platform status |
Supabase vs. Self-Hosted Postgres: The Tradeoff
When Supabase goes down, some teams consider self-hosting. Here's the real tradeoff:
Supabase managed:
- ✅ They handle backups, scaling, security patches
- ✅ Built-in auth, storage, realtime, edge functions
- ❌ You're dependent on their infrastructure
- ❌ Regional outages affect all your projects in that region
Self-hosted Postgres:
- ✅ Full control over uptime
- ✅ Can run multi-region yourself
- ❌ You're now the DBA, security team, and ops team
- ❌ No built-in auth, storage, or realtime
The pragmatic approach: Use Supabase but architect for resilience. Cache aggressively, implement retry logic, and have a read-only fallback mode. The 99.9% uptime you get from a managed service beats the 99.99% you theoretically get from self-hosting but spend all your time maintaining.
Get Notified Before Your Users Do
Stop finding out about Supabase outages from angry user reports:
- Bookmark apistatuscheck.com/api/supabase for real-time status
- Set up Discord/Slack alerts via API Status Check integrations
- Subscribe to status.supabase.com for official updates
- Add the health check endpoint above to your monitoring stack
Supabase outages are rare but impactful. The teams that handle them well aren't the ones with the best monitoring — they're the ones whose apps keep working anyway.
API Status Check monitors Supabase and 100+ other APIs in real-time. Set up free alerts at apistatuscheck.com.
Monitor Your APIs
Check the real-time status of 100+ popular APIs used by developers.
View API Status →