comparison / 07 — updated may 2026

NeonvsPlanetScale

Both rebuilt the database for the serverless era. One bet on Postgres + branching. The other bet on MySQL + Vitess. The bets diverged enough that the choice is now mostly about which engine you want.

engine
NeonPostgres
PlanetScaleMySQL · Vitess
free tier
Neonyes · 191k compute-hr
PlanetScaleno · $39 starting tier
branching
Neoncopy-on-write · cheap
PlanetScaledeprecated · returning
updated
May 2026
verdict.txt — comparisons/neon-vs-planetscale.mdhonest
$cat verdict.txt

Pick Neon if you want serverless Postgres with branching that maps to your git workflow. Pick PlanetScale if you want MySQL with Vitess-grade horizontal scaling and your team is comfortable with the no-foreign-keys constraint.

scoreboard / at a glance

At a glance

One row per dimension, the values side-by-side. The olive dot marks the clear winner for that dimension when there is one — most rows are a wash, and that’s the point.

Neon Inc. · Databricks

Neon

Serverless Postgres with copy-on-write branching, autoscaling compute, and storage that decouples from compute. Postgres-compatible, no proprietary protocol.

PlanetScale Inc.

PlanetScale

MySQL on Vitess with horizontal sharding, deploy requests, and zero-downtime schema changes. Best-in-class for write-heavy workloads at scale.

Database engineDifferent engines. Pick whichever your team and stack prefer.
Postgres · full SQL · extensions
MySQL · Vitess · sharding-aware
Free tierNeon has a real free tier. PlanetScale removed theirs in 2024.
yes · 191 compute-hours/mo · 0.5GB
no · $39 minimum
BranchingNeon's branching is the differentiator. PlanetScale removed theirs and is rebuilding.
copy-on-write · seconds · git-like
deprecated 2024 · returning in beta
Schema migrationsPlanetScale's deploy-request workflow is the gold standard for production schema changes.
standard SQL migrations · pg_dump
deploy requests · zero-downtime · approval workflow
Foreign keysPlanetScale's no-FK constraint is a Vitess limitation. Real friction for teams used to Postgres.
yes · standard Postgres
no · application-level enforcement
Horizontal scaleIf you're at multi-TB scale or millions of writes/sec, Vitess is built for that.
vertical · read replicas · big single instance
horizontal · Vitess sharding
Connection poolingBoth handle serverless connection patterns well.
built-in pgbouncer · pooler URL
built-in · serverless-friendly by default
ObservabilityBoth have credible observability. Different conventions.
metrics · slow query log · explain
Insights tool · query performance · slow log
Pricing modelNeon's pause-on-idle is the cheapest serverless DB pattern. PlanetScale charges per tier.
compute-hours + storage · pause on idle
tier-based · $39 → $99 → custom
Lock-inMigrating off Neon is migrating off a Postgres provider. PlanetScale's workflow is more lock-in.
low · standard Postgres · self-host with Postgres
high · Vitess + deploy-requests not portable
pricing / three scenarios

Pricing at three scales

Three receipts, three scales. The line items are the same; the prices move. Every number is from the public May 2026 pricing page — we round to the nearest dollar but don’t invent.

hobby.txt — 1k MAU · low-write side projectmonthly
LINE ITEMNeonPlanetScale
Databasefree tier · 0.5GB · 191hrfreeHobby tier · 5GB$39
TOTAL · monthlyfree/mo$39/mo
>Neon's free tier covers any small project. PlanetScale starts at $39/mo. At hobby scale Neon is the obvious pick — and many teams stay on Neon as they grow because the free-to-Launch transition is gentle ($0 → $19).
side project.txt — 10k MAU · steady reads · paying customersmonthly
LINE ITEMNeonPlanetScale
DatabaseLaunch tier · $19/mo$19Hobby tier · 5GB · ample$39
Computeincluded · scale-to-zerofreeincluded · always-onfree
TOTAL · monthly$19/mo$39/mo
>At 10k MAU Neon is half the cost. The reason is structural: Neon scales compute to zero on idle (your DB literally pauses), while PlanetScale charges for always-on compute. For a side project that gets traffic in spikes, Neon's compute-hour billing is genuinely cheaper.
scale.txt — 100k MAU · production · steady write loadmonthly
LINE ITEMNeonPlanetScale
DatabaseScale tier · $69/mo + usage$200Scaler tier · $99/mo + usage$250
Storage100GB · within tierfree100GB · within tierfree
TOTAL · monthly$200/mo$250/mo
>At scale the gap closes. Neon's compute-hour pricing pays for itself when load is actually steady (you're paying for the always-on compute on either platform). PlanetScale's premium reflects Vitess sharding capabilities you may or may not be using yet. If you'll need horizontal sharding eventually, PlanetScale's premium is buying that future capability.
features / deep dives

Feature by feature

One row per feature, both tools described in plain language, the honest tradeoff at the bottom. Most rows have legitimate uses for both — the goal is to surface the differences that matter, not to declare a winner on every line.

01

Database engine

the SQL dialect and feature set
Neon

Neon is full Postgres 16/17 with extensions: pgvector for embeddings, PostGIS for geospatial, pg_partman for partitioning, plv8, citext, etc. Anything you can do on a self-hosted Postgres works here. The protocol is standard, so any Postgres client (Prisma, Drizzle, raw pg) connects natively.

PlanetScale

PlanetScale is MySQL 8 on Vitess. Most MySQL features are available, but with Vitess constraints: no foreign keys (enforced application-side), no cross-shard transactions, certain JOINs require care to stay performant. The Vitess query rewriting handles a lot of this transparently, but it's not 100% transparent.

Honest tradeoff

If your team writes Postgres in muscle memory, Neon is the path of least resistance. If you're MySQL-shaped and at scale, PlanetScale's Vitess foundation is genuinely valuable. The choice between Postgres and MySQL is more about ecosystem familiarity than technical superiority.

02

Branching

treating database state like git
Neon

Neon's branching is copy-on-write at the storage layer — creating a branch is essentially free (no data copy, just metadata) and takes seconds. You branch a database, run a destructive migration in the branch to test it, then either merge back or discard. Per-PR database branches are a real workflow at companies using Neon.

PlanetScale

PlanetScale pioneered database branching but deprecated it in 2024. As of May 2026 they're rebuilding it (in beta) but the workflow is currently 'just don't do that.' Most teams that picked PlanetScale specifically for branching have either migrated away or are working around the gap.

Honest tradeoff

Branching is a category-defining feature. Neon's is the only mature implementation in serverless databases right now. If branching is the reason you're choosing here, Neon is the answer.

03

Schema migrations

changing the schema without downtime
Neon

Neon uses standard Postgres migration tools (Prisma migrate, Drizzle Kit, Atlas, raw SQL). For destructive migrations, the recommended pattern is: branch the database, run the migration on the branch, verify, merge. The platform doesn't add migration tooling — you bring your own.

PlanetScale

PlanetScale's 'deploy requests' are the headline feature: you write a schema change, open a deploy request (like a PR), the platform validates it, runs it as a non-blocking online schema change, and rolls back if anything goes wrong. Zero-downtime DDL is genuinely solved here. For high-write schemas, this matters.

Honest tradeoff

PlanetScale's deploy requests are the best zero-downtime migration UX in the industry. Neon's branching gives you safety in a different way (test before you commit). If schema changes are frequent and high-stakes, PlanetScale's tooling is meaningfully ahead.

04

Foreign keys & integrity

enforcing data shape at the DB layer
Neon

Neon supports foreign keys, check constraints, unique constraints, partial indexes, and every other Postgres data-integrity feature. ON DELETE CASCADE works. Composite primary keys work. The relational model is intact.

PlanetScale

PlanetScale doesn't support foreign keys (Vitess limitation). Referential integrity is enforced at the application layer — your ORM or business logic checks that user_id in the orders table refers to a real user. Cascade deletes are application-level cleanup, not database-level.

Honest tradeoff

If your data is heavily relational (B2B SaaS, marketplaces, anything with users/orgs/permissions), Neon's foreign key support is genuinely simpler. PlanetScale's no-FK constraint is workable but it's a real shift in how you reason about data.

05

Horizontal scaling

what happens at multi-TB / millions-of-writes
Neon

Neon scales vertically — bigger compute, bigger storage, read replicas. The largest Neon instance handles workloads in the high-hundreds-of-GB range and tens of thousands of writes/sec. Beyond that, you'd partition the application layer (one Neon per tenant) or move to self-hosted Postgres with Citus.

PlanetScale

PlanetScale on Vitess scales horizontally via sharding. Adding shards is a workflow, not a project — the platform handles resharding, query routing, and cross-shard joins where possible. Companies running multi-TB workloads (Cash App, GitHub, Slack at points) have used Vitess.

Honest tradeoff

If you're going to be at multi-TB or millions of writes/sec, PlanetScale's horizontal scaling is genuinely irreplaceable in this comparison. If you're not, the question is moot — both platforms handle 99% of workloads fine.

06

Connection pooling

the part that matters in serverless
Neon

Neon ships pgbouncer-based pooling. The pooler URL is what you use from serverless functions; the direct URL bypasses the pool for long-running connections. Documentation is clear; failures from using the wrong URL show up early in development.

PlanetScale

PlanetScale handles serverless connection patterns natively — there's effectively one URL, and the platform manages connection multiplexing transparently. You don't think about pooled vs direct; the system does it for you.

Honest tradeoff

PlanetScale's transparency is genuinely friendlier for serverless platforms (Vercel, Cloudflare Workers, Lambda). Neon's pooler URL is a small but real foot-gun. Once you know the pattern, it's fine; the first time you hit a 'too many connections' error in production because you used the wrong URL, you wish for PlanetScale's model.

07

Pricing structure

how the bill moves over a year
Neon

Neon prices on compute-hours (you pay when the database is awake) plus storage (you pay for what you store). Free tier suspends inactive databases. Launch ($19), Scale ($69), and Business tiers add features like multi-region, longer history, dedicated compute. The bill scales with actual usage.

PlanetScale

PlanetScale prices by tier — Hobby ($39), Scaler ($99), Scaler Pro, Enterprise — with each tier including a fixed bundle of storage, IOPS, and rows-read. Overage adds linearly. The bill is more predictable but doesn't drop on idle.

Honest tradeoff

Neon's pricing is more variable but cheaper for small/intermittent workloads. PlanetScale's is more predictable and better-suited to always-on workloads with steady traffic. Both are reasonable; pick based on your traffic shape.

08

Migration story

what it takes to switch
Neon

Neon ━▶ PlanetScale: convert Postgres schema to MySQL (data types differ, foreign keys disappear, sequences become AUTO_INCREMENT), rewrite queries that use Postgres-specific syntax (ARRAY types, JSONB operators, RETURNING), redo any extensions. It's a real project.

PlanetScale

PlanetScale ━▶ Neon: convert MySQL schema to Postgres (mostly mechanical), add foreign keys back where the application was emulating them, handle data types (TINYINT(1) → BOOLEAN, etc.). Slightly easier direction because you're gaining capabilities, not losing them.

Honest tradeoff

Neither migration is a weekend. Both are projects. The hard part is rarely the data — it's the queries, the ORM config, the application code that assumed engine-specific behavior. Plan 2–6 weeks for a real migration.

verdict / pick one

When to pick which

pick / neon

Pick Neon if…

  • Your stack is Postgres-shaped — you write SQL with Postgres syntax in muscle memory.
  • Database branching matches how your team works: feature branches, PR previews, destructive-migration testing.
  • You want a real free tier and gentle growth pricing — pause-on-idle compute matters at small scale.
  • Your scale is in the hundreds-of-GB range — vertical scaling and read replicas are enough.
  • You value avoiding lock-in: standard Postgres, self-hostable as a fallback, no proprietary protocol.
pick / planetscale

Pick PlanetScale if…

  • You're MySQL-shaped, or you're at a scale where Vitess sharding is the actual answer.
  • Zero-downtime schema migrations on production are a frequent operational concern.
  • Your team is comfortable with the no-foreign-keys constraint and willing to enforce integrity at the app layer.
  • Always-on, predictable workloads — your DB doesn't go idle and you'd rather a flat tier than per-hour billing.
  • You're at multi-TB scale or expect to be soon — horizontal sharding is the reason you're shopping.
gotchas / observed

Gotchas, both directions

Common pitfalls visible in public docs and community discussion. None of these will stop you shipping; all of them will cost you an afternoon if you don’t know about them.

  • Neon / pooling

    Pooler URL vs direct URL — wrong one breaks production

    Neon has two connection URLs. The pooler URL is what you use from serverless functions; the direct URL is for long-running processes. Using the direct URL from a Vercel function will exhaust connections under any real load. The docs are clear — people miss it anyway. Set up the pooler URL in your env config from day one.

  • PlanetScale / FKs

    No foreign keys means no ON DELETE CASCADE

    PlanetScale's lack of foreign keys means CASCADE deletes are application-level cleanup. If you're used to declaring ON DELETE CASCADE on a parent table and trusting it, you'll need to write the cascade logic yourself in every code path that deletes a parent row. ORMs help; discipline helps more.

  • Neon / autoscaling

    Cold starts after suspension are 1–3 seconds

    When a Neon database has been idle long enough to suspend, the first query takes 1–3 seconds while compute warms back up. Fine for hobby projects; surprising for a portfolio link sent to a recruiter or a webhook handler that times out. Pin compute to always-on or use the pooled URL with appropriate timeouts.

  • PlanetScale / branching

    Branching was deprecated in 2024 and is still in beta

    If you picked PlanetScale specifically for branching, the feature you came for has been gone for over a year. As of May 2026 it's returning in beta but the workflow isn't where it was. Confirm the current state before betting on it; don't migrate based on screenshots from 2023.

  • Neon / Vercel egress

    Data egress to your app server is metered

    Neon charges for outbound data, separately from storage. A query that returns 1MB of rows once a day costs nothing; a query that returns 1MB per request at 100 RPS costs noticeably. Aggregate in the database when you can; pull less data over the wire.

  • PlanetScale / cross-shard joins

    JOINs across shards are slow or impossible

    Vitess can transparently rewrite many cross-shard JOINs, but not all. If your query plan looks healthy in dev (single shard) and breaks in prod (sharded), it's because the sharded version requires a scatter-gather pattern that wasn't planned for. Test query plans against the production sharding strategy, not just against development.

migration / observed patterns

Migrating between them

Editorial framing only — we have not migrated either way ourselves. What follows is the pattern visible in public post-mortems, GitHub issue threads, and conference talks. Take it as observed-pattern, not lived experience.

Neon ━▶ PlanetScale

Less common pattern: a team realizes their write volume is going to outgrow what vertical Postgres can handle. The migration is a real project — converting Postgres to MySQL means rewriting queries (RETURNING, JSONB, ARRAY types), removing or relocating foreign keys, redoing any Postgres-specific extensions. Plan 4–8 weeks for a clean migration.

The trigger is usually the realization that you'll be sharding within 12 months. PlanetScale's Vitess foundation is the bet for that future. If you're not at that scale yet and not certain you'll be, the migration is premature.

PlanetScale ━▶ Neon

More common pattern: a team picked PlanetScale, hit the no-foreign-keys friction, missed branching when it was deprecated, and decided the Vitess-grade scaling features they're paying for are features they'll never use. Migration is mechanical: schema conversion (MySQL → Postgres), data dump-and-restore, query rewrites for engine-specific SQL.

The motivation is rarely cost — it's that the team realized their workload was Postgres-shaped all along. Plan 2–4 weeks; the data path is straightforward, the query rewrites are the real work.