The DevOps Daily · Serverless Postgres Benchmarks

Neon vs Supabase, measured.

Every number below is the median of repeated runs against real projects in the same AWS region, timed from a client in the same metro. Raw samples ship in the repo; nothing here is quoted from a pricing page.

region aws eu-central-1client do-fra1-2vcpuplans scale / prosamples 469sessions 3updated 2026-06-11
latency: a tiecreate: neon by 106.4scold start: 593.2ms wakebranching: neon only on free

Read the write-ups: free tiers · operational benchmarks · scaling costs · full comparison

query latency
~32ms
median, both platforms. A tie.
create: neon
5.5s
to first query on scale, p95 6.0s
create: supabase
111.9s
to first query on pro, p95 142.4s
neon cold start
593ms
wake query, p95 1.56s
neon branch
1.7s
writable copy of 100k rows
select 1 · full connect cycle50 runs each

Query latency

Connect + TLS + auth + one query, cold connection each run. Bar is the median, amber tick is p95, the faint line spans min to max. Hover any row for the full spread.

0ms10ms20ms30ms40ms50msNeon · pooler27.6msp95 34.6msNeon · direct33.4msp95 40.3msSupabase · direct (IPv6)26msp95 41.3msSupabase · session pooler29.9msp95 35.4msSupabase · transaction pooler27.3msp95 37.6ms
NeonSupabasep95click to isolate
every sample, ranked50 runs per path

Latency percentiles

The same raw samples as cumulative percentile curves: read p50 and p95 straight off the dashed lines, and how heavy each path's tail is. Hover a curve for its summary.

p50p95minmax20ms30ms40ms50ms
NeonSupabaseclick to isolate
api call → first query10 runs each

Project creation

Time until a brand-new project answers SQL. Every dot is one run; hover for its exact time.

3.3s32.3s61.2s90.2s119.1s148.1sNeon5.49sSupabase111.9s+106.4s
scale-to-zero wake20 runs

Neon cold start

First query against a suspended compute. Docs say 300–500 ms typical.

527.5ms804.4ms1.08s1.36s1.64s1.91s593.2ms
copy-on-write · 100k-row parent10 runs

Neon database branch, to queryable

A writable branch carrying the parent's full dataset. Supabase branching requires a paid plan and starts without data; it will appear here once the paid-tier runs land.

1.6s1.6s1.7s1.7s1.8s1.8s1.70s

Launch / Pro tier · paid plans

The operational benchmarks.

Neon (Scale account, Launch-tier operations) vs Supabase Pro: the operations that unlock when you pay. Same region, same client, same rules.

simultaneous cold connections · transaction pooler5 waves per level

Connection stampede

N clients connect at once, each running one query. Bar is the median wave wall-time; tick is the worst wave. Refusals would appear here; there were none.

0ms500ms1.00sNeon · 50 clients313.4msp95 447.5msSupabase · 50 clients307.9msp95 343msNeon · 100 clients610.3msp95 646.7msSupabase · 100 clients521.6msp95 703.7msNeon · 200 clients1.11sp95 1.38sSupabase · 200 clients1.06sp95 1.31s
NeonSupabaseworst waveclick to isolate
paid-tier branching10 + 10 runs

Branch, to queryable

Neon branches arrive carrying the parent's 100k rows; Supabase branches copy schema and config only (their with-data API path requires pre-existing physical backups and refused every attempt on a fresh project). Every dot is one branch.

1.6s3.4s5.2s7.0s8.9s10.7sNeon (with data)1.70sSupabase (schema only)6.15s
compute resize20 runs

Resize: apply time vs outage

Changing compute size, alternating up and down. Apply is when the API says done; outage is how long SQL actually failed (probed every 250ms).

0ms50.0s100.0sNeon · apply2.38sp95 5.70sNeon · SQL outage0msp95 0msSupabase · apply39.2sp95 139.4sSupabase · SQL outage38.9sp95 38.9s
read replicas13 runs

Replica, to first query

Neon replicas share storage with the primary (compute-only); Supabase replicas clone the database (Small compute minimum). Every dot is one replica.

7.5s44.1s80.8s117.4s154.0s190.6sNeon8.04sSupabase181.4s
point-in-time restore · 100k rows8 runs

Neon restore to 60 seconds ago

Branch restore to a timestamp, timed until SQL answers on the restored state. Supabase PITR is a $100/month add-on with a 7-day minimum window; we document it rather than benchmark it.

4.0s4.4s4.8s5.2s5.6s6.1s5.43s
same op, growing data · 50x size span100k / 1M / 5M rows

Does it scale with database size?

The same branch and replica operations, repeated as the seeded database grows 50x. Copy-on-write architectures should stay flat; physical clones should grow with data.

Branch creation vs database size

Neon branches carry the data; Supabase Pro branches copy schema only, which is why both lines are flat for different reasons.

1.74s3.48s5.23s6.97s100k rows1M rows5M rows

Read replica vs database size

Provisioning dominates replica time at these sizes on both platforms; Supabase grows ~12% by 5M rows while Neon's storage-sharing replicas stay flat.

54.7s109.5s164.2s218.9s100k rows1M rows5M rows
NeonSupabase
list prices, verified june 2026 · open source model5 growth stages

What the same app costs as it grows

One application priced through five growth stages on both platforms. Three regimes: scale-to-zero wins the quiet months, the flat fee wins the middle, and metered auth decides the end game. Assumptions are parameters; rerun the model with your own.

$328$655$983$1,310launch monthfirst customersproduct-market fitgrowthscale
Neon (Launch)Supabase (Pro)

Findings you only get by running it

Supabase free-plan direct hosts are IPv6-only (IPv4 goes through Supavisor), the pooler cluster varies per project, and database TLS chains to Supabase's own CA.

Resize is not one operation

Supabase compute changes restart the database (~39s of measured SQL outage) and are throttled for minutes between changes. Neon resizes applied with zero failed probes across forty cycles.

Data branches have prerequisites

Supabase's with_data branch flag returned 406 "Failed to fetch latest physical backup" on every fresh-project attempt: data-included branches need pre-existing physical backups.

median over time3 sessions

Run history

Median query latency per benchmark session. A flat line is the expected (and boring) result; divergence is news.

29.2ms33.8ms38.4ms06-1006-11
NeonSupabaseclick to isolate

Same region, same metro

Both platforms run in aws eu-central-1; the timing client is a VM in Frankfurt, 1 to 2 ms from each. Network distance never puts a thumb on the scale.

Raw samples, not averages

Every operation runs 10 to 50 times. Charts show medians and p95; every individual sample is committed to the repo and visible on hover.

Reproducible by you

The harness is ~600 lines of TypeScript. Bring your own API keys and rerun the whole thing; if your numbers disagree, open an issue.