And why should you use it?
Supabase is one Postgres platform - the operational and AI backend that replaces a stack of vendors. It’s now the backend AI app-builders plug into.
Sources: Series F announcement
The open-source Postgres development platform
| Product | What it does |
|---|---|
| Database | Fully managed Postgres + Row Level Security |
| Auth | Email, OAuth, magic link, SSO/SAML |
| Storage | S3-compatible object store + CDN |
| Realtime | WebSocket subscriptions (presence, broadcast, CDC) |
| Edge Functions | Deno runtime, globally distributed |
One platform. One bill. Tightly integrated.
Sources: Architecture · Database · Auth · Storage · Realtime · Edge Functions
Every product is a Postgres primitive - and each replaces a vendor you’d otherwise stitch in.
One control plane, one bill - fewer vendors, less integration work, faster to ship.
Open Source
Postgres-Native
No Lock-in
pg_dump anytimeSources: GitHub (106K+ stars) · Self-hosting · Extensions · pg_dump / migrate out
Row Level Security - authorization enforced by Postgres, not your app code
| Clause | Applies to | Guards against |
|---|---|---|
USING |
SELECT, UPDATE, DELETE | Reading or deleting someone else’s rows |
WITH CHECK |
INSERT, UPDATE | Writing a row with the wrong owner - or reassigning ownership to another user |
If USING doesn’t check ownership you can reach rows you don’t own; without WITH CHECK you can write (or reassign user_id on) a row so it belongs to someone else.
Both together = you can only touch rows you own, and you can’t transfer ownership.
Sources: Row Level Security · Postgres RLS
Scale
AI-native
$500M Series F · $10.5B valuation · >$1B raised since 2020
Sources: Series F announcement · PR Newswire · TechCrunch · accurate as of 4 Jun 2026
| Pattern | Example | Why Supabase |
|---|---|---|
| Startup greenfield | Chatbase - $10M+ ARR, bootstrapped | Zero to $10M on one stack |
| DB + Auth consolidation | Good Tape - 60% cost cut | Auth0 + Fly → Supabase |
| Multi-tenant SaaS | Kayhan Space - 8x dev speed | RDS + Auth0 → DB + Auth, RLS per tier |
| AI / vector | Humata - 75% vector-cost cut | Pinecone → one pgvector instance |
| EU compliance | GDPR + residency | 6 European regions (4 in the EU), SOC 2, DPA |
Sources: Chatbase · Good Tape · Humata · Kayhan Space - Supabase customer stories.
What
Why
Who
paste.erfi.ioA production pastebin - every Supabase surface used deliberately.
| Feature | What I used |
|---|---|
| Data + search | Postgres, 21 migrations, FTS via tsvector + GIN index |
| Access control | 9 RLS policies - public read, owner write, burn-after-read |
| Auth | Email, magic link, GitHub OAuth with PKCE in a CF Worker |
| Live feed | Realtime broadcast from a Postgres trigger |
| Scheduled cleanup | pg_cron - replaces Lambda + EventBridge entirely |
| Config as code | supabase/config.toml + config push |
381 tests - including race-condition tests under 100 concurrent hits.
Live demo: paste.erfi.io
Search, scheduling, realtime, edge compute - each would normally be a separate vendor. Here they are part of the platform.
Search that understands language - not just exact word matching.
| Step | What happens |
|---|---|
| 1. Write a paste | Postgres converts title + language to root words: "running tests" → run test |
| 2. Store the index | The root words are stored in a tsvector column - automatically kept in sync |
| 3. Build a GIN index | A lookup table maps every root word to which rows contain it |
| 4. Search | User types "run" - Postgres checks the index, returns matching rows in milliseconds |
No Elasticsearch. No separate search service. Built into Postgres.
Sources: Full-Text Search
Run SQL on a schedule, from inside the database. No extra services.
| AWS Lambda + EventBridge | pg_cron | |
|---|---|---|
| Where it runs | Separate serverless service | Inside Postgres |
| Deployment | Deploy function + create rule | One SQL statement |
| Logs | CloudWatch | cron.job_run_details table |
| Cost | Per invocation + rule | Included with Postgres |
Sources: Cron
A browser receives an update the moment a row is written - no polling.
User saves a paste
↓
Postgres commits the row
↓
AFTER INSERT trigger fires
↓
realtime.send() → Realtime server → all subscribed browsers
Two functions:
realtime.send() - you control the payload (Pasteriser: strips private columns)realtime.broadcast_changes() - sends the full row change (a multi-tenant notes feed)Sources: Realtime · Broadcast · Postgres Changes
Serverless TypeScript/JavaScript on a globally distributed Deno runtime - for logic that doesn’t belong in the database.
| Property | Detail |
|---|---|
| Runtime | Deno (TypeScript/JS, Web-standard APIs, WASM) - not Node |
| Deploy | supabase functions deploy - no container, no cold-start config |
| Where it runs | Distributed to the region nearest the user (pin DB-heavy functions near the DB region) |
| Property | Detail |
|---|---|
| Auth | Receives the caller’s JWT - can call the DB as that user (RLS applies) |
| Secrets | supabase secrets set - env vars injected at runtime |
| Good for | Webhooks, third-party API calls, payments, LLM calls, custom auth hooks |
Rule of thumb: data-local work (triggers, scheduled jobs) stays in Postgres (pg_cron, triggers); network-facing / third-party glue goes in an Edge Function.
Sources: Edge Functions · Function secrets
Postgres is the OLTP source of truth; analytics and AI read from it - no separate warehouse or vector vendor required.
Postgres is the OLTP source of truth - analytics and AI read FROM it, not replace it.
flowchart LR APP[App / users] -->|writes| PG[(Supabase Postgres<br/>OLTP source of truth)] PG -->|Pipelines · CDC| WH[(Warehouse<br/>BigQuery / Snowflake)] PG -->|Read replica · matviews| BI[Dashboards / BI] WH --> BI DOCS[Documents] -->|embeddings| VEC[pgvector] PG --- VEC Q[User question] -->|embed + search| VEC -->|top-k context| LLM[LLM] --> ANS[Grounded answer] classDef core fill:#2f6f4e,stroke:#8fdab5,color:#fff; classDef analytics fill:#2b6cb0,stroke:#8fc3ef,color:#fff; classDef ai fill:#6d4aa6,stroke:#c3a8e8,color:#fff; classDef neutral fill:#33333d,stroke:#777,color:#fff; class PG core; class WH,BI analytics; class VEC,LLM,ANS ai; class APP,DOCS,Q neutral;
The same Postgres feeds both buying waves - analytics and AI read from it, neither replaces it.
Sources: Read replicas · Pipelines (CDC) · pgvector / AI · Wrappers (FDW)
Keep Postgres as the SQL front door; tier cold data into open Iceberg - not a second OLAP vendor.
| Approach | Product | Status | What it does |
|---|---|---|---|
| Isolate reads | Read replica | GA | Offload heavy reads (optional 2nd region) |
| In-Postgres | Matviews, partitioning, pg_partman |
GA | Pre-aggregate / prune scans, zero infra |
| Tier cold data | Analytics Buckets | Alpha | Iceberg/Parquet on S3; query via Iceberg FDW |
| Replicate out | Pipelines (CDC) | Alpha | Rust ETL → external warehouse (BigQuery) |
| In-DB OLAP | pg_duckdb (Hydra) |
Roadmap | ~600x faster scans, in-Postgres |
Today (GA): read replica + Postgres-native. The open-Iceberg lakehouse is direction, not shipping - not a petabyte-OLAP replacement.
Sources: Read replicas · Analytics Buckets · Hydra · Pipelines.
The FDW makes cold Iceberg-on-S3 look like a Postgres table - so one SQL statement spans both tiers, and it runs both directions.
-- Cold history is Parquet/Iceberg on S3, exposed as a foreign table.
-- Join it to live Postgres rows in a single statement:
SELECT u.email, count(*) AS events_90d
FROM auth.users u
JOIN iceberg.events e -- foreign table -> Analytics Bucket (S3)
ON e.user_id = u.id
WHERE e.ts > now() - interval '90 days'
GROUP BY u.email;The same FDW mechanism runs two ways - tier cold data out to open storage, or query an existing warehouse in place.
| Direction | What | Status |
|---|---|---|
| Tier out | hot Postgres -> Analytics Buckets (Iceberg/Parquet on S3), query via Iceberg FDW | Alpha |
| Query in place | an EXISTING warehouse (BigQuery, ClickHouse, Snowflake) as foreign tables | GA (Wrappers; connector maturity varies) |
Postgres stays the SQL planner; the warehouse is just another table - no second query engine for the app to learn.
Sources: Wrappers (FDW) · Analytics Buckets
Same hot/cold tiering as the warehouse slide, for embeddings - Postgres stays the front door.
| Tier | Product | Status | When |
|---|---|---|---|
| Hot | pgvector in Postgres |
GA | Latency-sensitive, transactional |
| Cold | Vector Buckets (S3-backed) | Public Alpha | 50M vectors/index, durable, sub-second |
One DB, two tiers - not a separate vector vendor.
Sources: Vector Buckets (Public Alpha, 1 Dec 2025) · limits · Humata.
pgvector (Hot) |
Vector Buckets (Cold) | |
|---|---|---|
| Where | inside your Postgres table | S3-backed Storage bucket |
| Status | GA | Public Alpha (1 Dec 2025) |
| Latency | single-digit ms (tuned HNSW) | sub-second (not ultra-low) |
| Scale | RAM-bound | 50M vectors/index |
| Distance ops | <=> cosine, <-> L2, <#> neg. inner product (per query) |
one <==> operator; metric (cosine/euclidean/l2) fixed at index creation |
-- Cold vectors via the S3 Vector FDW, JOINed to live relational rows:
SELECT v.key, d.full_text, embd_distance(v.data) AS similarity
FROM s3_vectors.documents_openai v
LEFT JOIN public.documents d ON v.metadata->>'doc_id' = d.id::text
WHERE v.data <==> '[ ...query embedding... ]'::embd -- similarity search
AND d.category = 'articles' -- metadata filter
ORDER BY embd_distance(v.data) ASC LIMIT 50;One DB, two tiers, one query - not a separate vector vendor.
Sources: pgvector / AI · Vector Buckets · Vector limits
Email, magic link, phone OTP, SSO/SAML, and a full suite of OAuth providers - plus Supabase can itself be an OAuth 2.1 / OIDC provider.
| Feature | Free | Pro | Team | Enterprise |
|---|---|---|---|---|
| MAU included | 50K | 100K | 100K | Custom |
| Custom Access Token Hook | ✅ | ✅ | ✅ | ✅ |
| Send SMS / Email Hook | ✅ | ✅ | ✅ | ✅ |
| SAML SSO | ❌ | ✅ | ✅ | ✅ |
| SSO MAUs included | ❌ | 50 | 50 | Custom |
| MFA Verification Hook | ❌ | ❌ | ✅ | ✅ |
| Dashboard SSO | ❌ | ❌ | ✅ | ✅ |
| SOC 2 Type 2 (report Team+) | ✅ | ✅ | ✅ | ✅ |
| ISO 27001 certificate | ❌ | ❌ | ✅ | ✅ |
| Uptime SLA (99.9%) | ❌ | ❌ | ❌ | ✅ |
| 24/7 Sev-1 support | ❌ | ❌ | ❌ | ✅ |
| BYO Cloud | ❌ | ❌ | ❌ | ✅ |
Each enterprise customer gets their own SAML connection. sso_provider_id scopes the JWT.
Sources: SAML SSO
Supabase Auth can be an OAuth 2.1 / OIDC provider - for third-party apps and AI agents (not just consume one).
| Capability | Detail |
|---|---|
| Be an IdP | OAuth 2.1 auth-code + PKCE; OIDC (ID tokens, discovery, JWKS) |
| AI agents / MCP | OAuth discovery + dynamic client registration for MCP clients |
| Tokens | Standard Supabase JWTs - RLS + Access Token Hooks apply; per-client aud |
| First-party apps | Issue tokens to your own mobile / desktop clients |
| Consent | You host the approval UI; Supabase issues the tokens |
Make your app an identity provider - RLS-scoped, MCP-ready.
Sources: OAuth 2.1 Server · MCP auth
Free during the beta, but not yet GA - what’s missing today:
openid/email/profile/phone; fine-grained access is RLS, not scopes (custom scopes are roadmap).aud claim + RLS; no first-class per-tenant client isolation.client_credentials or password grant (no user-less machine-to-machine).Access control is RLS-first today; custom scopes + native multi-tenancy are the maturity gaps.
Sources: flows + scopes · token security · getting started
Supabase (BaaS) vs the dev-first field: Clerk, WorkOS (SSO-first), Auth0 (incumbent), Better Auth (OSS library).
| Supabase | Clerk | WorkOS | Auth0 | Better Auth | |
|---|---|---|---|---|---|
| Cost <50K MAU | $25/mo flat | $0-25/mo (50K MRU free) | $0 (free to 1M MAU) | ~$3,500/mo @ 50K | $0 (self-host) |
| Ent. SSO (SAML) | Pro+; $0.015/MAU; no SCIM | 1 free, $75/conn; SCIM incl. | $125/conn; SCIM per-conn | Enterprise; inbound SCIM free | plugin; you run it |
| Data residency | many regions, any tier | US (EU on Enterprise) | WorkOS-hosted | region at signup | your infra, anywhere |
| Open source / self-host | ✅ | ❌ | ❌ | ❌ | ✅ MIT |
| Platform beyond auth | ✅ Postgres + Storage + Realtime | ❌ | ❌ | ❌ | ❌ (library only) |
Sources: Supabase · Clerk · WorkOS · Auth0 · Better Auth
sequenceDiagram
actor A as Admin
participant EF as Edge Function
participant API as Backend APIs
A->>EF: POST /impersonate { target_user_id }
Note over EF: verify admin JWT + is_admin claim
Note over EF: fetch target user via service role,<br/>mint JWT - sub: target · act: admin · exp: +1h
EF-->>A: impersonation token (short-lived, no refresh)
A->>API: request + Bearer impersonation token
Note over API: validates as target user · act claim for audit
One database, many tenants - isolation enforced by Postgres RLS, not application code.
One database, many companies - each seeing only their own data.
-- Every company is a tenant
CREATE TABLE tenants (
id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
name text NOT NULL
);
-- Every user belongs to one tenant
CREATE TABLE profiles (
id uuid PRIMARY KEY REFERENCES auth.users(id) ON DELETE CASCADE,
tenant_id uuid REFERENCES tenants(id)
);
-- Business data carries tenant_id on every row
ALTER TABLE notes ADD COLUMN tenant_id uuid REFERENCES tenants(id);When a new user signs up, a database trigger automatically creates their tenant and profile. No application code needed.
Sources: Row Level Security · Managing user data / triggers
Membership table lookup - look up the user’s tenant at query time
(SELECT auth.uid()) not auth.uid() - caches the ID once per query instead of re-evaluating per rowClaim in the login token - tenant_id baked into the JWT at login
tenant_id into the token at login| Pattern 1 | Pattern 2 | |
|---|---|---|
| Setup | Simple, no hooks | Needs an Access Token Hook |
| Speed | Subquery per query | Single equality check |
| Multi-org | Yes | One org per session |
Sources: Custom Access Token Hook · auth.jwt() in RLS
Moving onto Supabase - from Firebase, Auth0, or an existing Postgres - with minimal downtime.
12 documented migration paths. Two lanes: move the database, move the users.
| Source | Path | Method |
|---|---|---|
| Postgres - Azure Flexible Server, RDS, Heroku, Render, Neon, Vercel | Lift-and-shift | pg_dump/restore (any version), or logical replication → minutes of downtime (PG 10+) |
| MySQL / MSSQL | Engine conversion | Schema convert + load, then dump/restore |
| Firestore | Remodel | Document → relational - the real work |
| Auth0 / Firebase Auth | User import | bcrypt/Argon2 hashes preserved → no password reset; rolling = 0 downtime |
Postgres gotchas: roles, privileges, and RLS-enabled status don’t carry - recreate them. Logical replication skips DDL, sequences, LOBs - freeze schema + sync sequences before cutover, and never re-enable writes on the source (split-brain).
Sources: Supabase migration guides
| Firebase product | What it does | Supabase equivalent |
|---|---|---|
| Firestore | NoSQL document database - nested collections/documents, no SQL | Postgres - relational tables, standard SQL. Biggest conceptual shift. |
| Firebase Auth | Email, Google/Apple login, phone OTP | Supabase Auth - near 1:1 feature parity |
| Firebase Storage | File uploads (photos, videos, docs) | Supabase Storage - S3-compatible, RLS policies on files |
| Firebase product | What it does | Supabase equivalent |
|---|---|---|
| Cloud Functions (HTTP) | Serverless code triggered by HTTP calls | Edge Functions - Deno runtime, same idea |
| Cloud Functions (events) | Code triggered by DB changes, new users, etc. | Database triggers - SQL functions that fire on row changes |
| Cloud Functions (scheduled) | Code on a cron schedule | pg_cron - SQL on a schedule, inside Postgres |
| FCM | Push notifications to phones/browsers | Edge Function + DB webhook → calls FCM or Expo - FCM still delivers, Supabase is the trigger |
Residency, vendor access, and jurisdiction - and where BYOC versus self-host actually help.
| Managed Cloud | Self-Hosted | |
|---|---|---|
| Officially supported deployment | ✅ | Docker Compose only |
| Kubernetes / Helm | - | Community (supabase-community/supabase-kubernetes) |
| Support | Enterprise SLA / Team email | Community only (GitHub Discussions, Discord) |
| Uptime SLA | ✅ Enterprise | ❌ None |
| Branching, PITR, metrics, ETL | ✅ | ❌ Unavailable |
| Data in your own infra | ❌ AWS regions | ✅ |
| BYO Cloud (Supabase manages in your cloud) | Enterprise (negotiated) | - |
Sources: Self-hosting
Three distinct requirements buyers conflate. BYOC addresses only vendor sovereignty - the middle row.
| Layer | The question | Solved by |
|---|---|---|
| Residency | Where do the bytes physically sit? | Region selection alone |
| Vendor sovereignty | Can Supabase read / exfiltrate it? | BYOC / self-host |
| Jurisdictional sovereignty | Can a foreign state (US CLOUD Act) compel it - regardless of location or account owner? | Operator outside US jurisdiction - not BYOC-on-AWS |
Calling BYOC-on-AWS “data sovereignty” is a procurement risk. It solves residency and reduces vendor access; it does not escape the CLOUD Act.
Sources: CLOUD Act (18 U.S.C. §2713) · CRS R45173 · Supabase regions
EU Cloud & AI Development Act - proposal, 3 Jun 2026 (needs Parliament + 27 states). Four assurance levels:
| Level | Requirement | US hyperscaler? |
|---|---|---|
| 1 | Data processed/stored on EU infrastructure | ✅ reachable |
| 2 | EU personnel + assets; EUCS cert; prevent third-country data access | ⚠️ structuring |
| 3 | EU owned and controlled; personnel citizenship | ❌ CLOUD Act blocks |
| 4 | No third-country control; no derogation; software supply-chain control | ❌ excluded |
The European Commission’s tech VP, verbatim: “With the USA, with the Cloud Act, it is difficult for their companies to reach Level 3.”
Supabase managed has zero ME regions (verified 2026-06-23) - closest is Mumbai, offshore for every Gulf rule.
| Requirement | Managed Supabase | BYOC → customer AWS | On-prem self-host |
|---|---|---|---|
| UAE residency + DESC (Dubai gov/semi-gov) | ❌ no ME region | ✅ me-central-1 (UAE) + DESC Tier-1 |
✅ |
| Saudi in-Kingdom residency (SAMA, NCA) | ❌ no ME region | ⚠️ needs AWS Riyadh me-central-2 (verify GA); UAE/Bahrain ≠ in-Kingdom |
✅ |
| Saudi sensitive / gov data (sovereign control) | ❌ | ❌ AWS is US-operated | ✅ |
For the Gulf, BYOC / self-host is the only way Supabase runs there at all.
Sources: Supabase regions · AWS Global Infrastructure · SAMA Rulebook
| Residency | Vendor access | Jurisdictional (CLOUD Act) | |
|---|---|---|---|
| Managed Supabase, EU region | ✅ | ❌ Supabase + AWS (US) | ❌ |
| Managed Supabase, ME | ❌ no region | ❌ | ❌ |
| BYOC → vanilla customer AWS | ✅ | ⚠️ control-plane caveat | ❌ still AWS = US |
| BYOC → AWS Sovereign Cloud + EU control plane | ✅ | ✅ | ⚠️ US-parent debated |
| On-prem self-host (control plane too) | ✅ | ✅ | ✅ |
BYOC is a delivery mechanism, not a sovereignty guarantee. Sovereignty comes from which jurisdiction the target sits in and who runs the control plane - never from BYOC itself. The honest answer for jurisdictional sovereignty is a sovereign operator or on-prem.
Observability, backups, and the roadmap for scaling Postgres out and up.
Every layer is inspectable without bolting on a third-party APM.
| Surface | What you get |
|---|---|
| Logs Explorer | SQL over structured logs from every layer - Postgres, Auth, Storage, Edge, API (Logflare-backed) |
| Reports | Built-in dashboards - DB load, API traffic, auth, storage |
| Query Performance | pg_stat_statements surfaced in-dashboard - slowest / most-frequent queries |
| Metrics | Prometheus-compatible metrics endpoint |
| Grafana | Official dashboards on top of the metrics endpoint |
| Alerts | PromQL-based alerting (Grafana / Prometheus) |
The Postgres-native win: diagnostics are pg_stat_statements + EXPLAIN, not a proprietary APM.
Sources: Logs · Metrics / Grafana
The operational resilience story - and its honest limits.
| Mechanism | What you get | Plan / caveat |
|---|---|---|
| Daily backups | Restore to any of the last 7 / 14 / 30 days | Pro / Team / Enterprise. Free tier: none - self-export via CLI |
| PITR | Restore to any point, RPO 2 min (WAL archived every 2 min) | Pro+ add-on; needs ≥ Small compute; replaces daily backups |
| Read replicas | Read scaling + redundancy; geo-routed load balancer | Pro+; GET REST + read-only RPCs only; not Auth/Storage/Realtime |
| Failover | No one-click promote today - restore backup → re-point app | Promote-to-primary on roadmap; no auto-failover below Enterprise SLA |
Cross-region recovery = a replica elsewhere, or a manual restore - PITR clone stays in-region.
Sources: Backups · Read replicas
“Vitess for Postgres” - an operating system for Postgres. v0.1 alpha shipped 4 Jun 2026.
| Capability | v0.1 alpha - today |
|---|---|
| HA / failover | Consensus-based, split-brain-safe (no lost commits), on unmodified Postgres replication; automatic failover + gateway query-buffering |
| Durability | User-defined policies (e.g. survive a single-AZ loss) - not locked to majority quorum |
| Connection pooling | Context-aware (no transaction/session mode choice); per-user pools, no SET ROLE; prepared-statement dedup across gateways |
| Capability | v0.1 alpha - today |
|---|---|
| Backups | pgBackRest, taken from replicas; full / incremental / differential; S3 |
| Deploy | Kubernetes operator (EKS / local Kind) |
| Sharding | Not yet - the flagship feature, a future release |
Apache 2.0 · Go · open-source only today - Multigres for Supabase coming soon.
Companion track: OrioleDB - the storage-engine fix underneath Multigres (next slide).
Sources: Multigres v0.1 alpha · Series F announcement
OrioleDB - a drop-in Postgres storage engine (pluggable storage) replacing Heap. Public Alpha, available self-hosted; targeting GA this year.
| Property | OrioleDB vs Heap |
|---|---|
| No VACUUM | undo-log MVCC removes bloat + the VACUUM maintenance burden |
| Throughput | up to 5.5x faster under load |
| Compression | ~5x built-in |
| WAL | row-level (groundwork for active-active) |
| Roadmap | decoupled storage/compute on S3; columnar indexes (hybrid OLTP/OLAP); multi-master |
Multigres scales out (HA, pooling, eventual sharding); OrioleDB fixes the engine underneath (bloat, VACUUM, throughput) - complementary tracks, both pre-GA.
Sources: OrioleDB docs · Series F announcement
What it costs to run - and the honest cases where Supabase is not the right tool.
How Supabase pricing actually works - and the footgun.
| Plan | Base compute | Connections | The catch |
|---|---|---|---|
| Free | Nano - shared, 0.5 GB RAM, 500 MB DB | 60 direct / 200 pooled | 2 projects max; paused after 7 days idle; no managed backups |
| Pro - $25/mo | 1x Micro included, full-time | 60 direct / 200 pooled | Compute is per-project, 24/7 |
Scaling = bigger compute, not more projects: Micro (1 GB) → Small (2 GB) → … → 16XL (256 GB) → custom. Upgrades incur downtime; never automatic.
Footgun: “$25 Pro” is $25 plus per-project compute. 3 Micro projects ≈ $45/mo, not $25. The 60-direct-connection ceiling on Micro is the wall that pushes you to pooling: Supavisor (the GA pooler) today, Multigres per-user pooling on the roadmap.
Indicative pricing as of June 2026 - re-check supabase.com/pricing.
Supabase isn’t the right fit for every requirement - here’s where another tool wins.
| If the requirement is… | Better answer |
|---|---|
| Auth only, Azure-native shop | Entra External ID - free ≤ 50K MAU, first-party .NET |
| Hard jurisdictional sovereignty (CLOUD Act) | Sovereign operator or on-prem self-host - not managed |
| Heavy OLAP / warehouse analytics | A warehouse (BigQuery / Snowflake) - Supabase feeds it, isn’t it |
| Middle East data residency (managed) | BYOC / self-host - no managed ME region |
| Deep B2B org modelling, SSO-first | Auth0 has the richer org / enterprise model |
I’d rather point you to the right tool than force a fit.
Two motions: consolidate several vendors (Auth0 + RDS + Pinecone) onto one platform, or migrate a Firebase app. Either way, migrate incrementally - Auth first (users are portable), then data, then functions.
The biggest conceptual shift is Firestore → Postgres: document collections become relational tables. Everything else maps 1:1.
| Firebase | Supabase | |
|---|---|---|
| Firestore (NoSQL docs) | biggest shift → | Postgres (SQL tables) |
| Firebase Auth | 1:1 → | Supabase Auth |
| Firebase Storage | 1:1 → | Supabase Storage |
| Cloud Functions (HTTP) | → | Edge Functions |
| Cloud Functions (events) | → | Database Triggers |
| Cloud Functions (scheduled) | → | pg_cron |
| FCM (push notifications) | more setup → | Edge Function + DB webhook calls FCM/Expo |
SAML assertion in - enriched JWT out. The IdP authenticates; Supabase issues the token.
The Access Token Hook runs before the JWT is signed, injecting custom claims (tenant_id, role, plan) without a round-trip to the application.
sequenceDiagram
actor U as User
participant IdP as Company IdP
participant Auth as Supabase Auth
participant Hook as Access Token Hook
participant DB as Postgres + RLS
U->>IdP: Sign in with company account
IdP-->>Auth: SAML assertion
Auth->>Hook: Raw JWT payload
Hook-->>Auth: + tenant_id, role
Auth-->>U: Signed JWT
U->>DB: API request + JWT
DB->>DB: RLS policy filters rows
DB-->>U: Filtered rows only
Supabase Auth as a standalone identity layer - any backend validates the JWT via a standard JWKS endpoint.
No Supabase SDK required server-side. RS256-signed JWT; standard library support in .NET, Go, Java, Python, Node.
sequenceDiagram
actor U as User
participant Auth as Supabase Auth
participant Hook as Access Token Hook
participant API as Customer API (any backend)
participant DB as Customer DB (SQL Server / DB2 / etc.)
U->>Auth: Sign in (email / SAML)
Auth->>Hook: Raw JWT payload
Hook-->>Auth: + tenant_id, role
Auth-->>U: Signed JWT
U->>API: Request + Bearer JWT
API->>API: Validate via JWKS endpoint
API->>DB: Query (tenant-scoped)
DB-->>API: Rows
API-->>U: Response
Row Level Security enforces tenant isolation at the database layer - authorization that can’t be bypassed by application code.
Two patterns: JWT claim (fast, single-tenant-per-session) or membership table (flexible, multi-org users).
erDiagram
auth_users {
uuid id PK
text email
}
tenants {
uuid id PK
text name
}
profiles {
uuid id PK
uuid tenant_id FK
text full_name
}
notes {
uuid id PK
uuid user_id FK
uuid tenant_id FK
text content
}
auth_users ||--|| profiles : "trigger on signup"
tenants ||--o{ profiles : "belongs to"
tenants ||--o{ notes : "belongs to"
auth_users ||--o{ notes : "creates"
What is Supabase?