Neon. A branch is a copy-on-write clone of your database that's ready in seconds. It shares storage with its parent until you write to it, so you can test a schema change against the full production data shape without paying to duplicate the dataset.

How copy-on-write branching works

When you create a branch, Neon doesn't copy any data. The branch points at the parent's storage and diverges only as you write. The branch runs on its own compute, so a CREATE INDEX, ALTER TABLE, or full migration on the branch doesn't touch production data or add load to the parent's compute (Branching).

Create a branch from the CLI:

neon branches create --name migration-test
neon connection-string migration-test

Without --parent, the branch comes from your project's default branch (production for projects created in the Console, main for projects created with the CLI or API). Run your migration against the connection string the CLI prints. If it works, apply the same migration to production. If it breaks something, delete the branch and try again:

neon branches delete migration-test

Branches included per project: 10 on the Free plan and Launch plan, 25 on the Scale plan. On paid plans, extra branches cost $1.50/branch-month, metered hourly (about $0.002/hour), so a migration branch that lives for a few hours adds less than a cent in branch fees. The Free plan doesn't allow extra branches. See Plans.

Compared with dump and restore

A pg_dump and pg_restore of a large database takes time proportional to its size, and the copy takes full storage. A branch is ready in seconds whatever the database size, and you pay only for the data the migration writes. To run this on every pull request, use the Neon GitHub Actions to create a branch per PR and delete it when the PR closes.

tip

If the test environment can't see production data, use a schema-only branch (beta). It copies the schema without any rows, and you load test or anonymized data yourself.

How other providers compare

CapabilityNeonSupabaseAurora (Postgres)RDS for Postgres
Test copy with prod dataYes, a copy-on-write branchPreview branches start from migrations and seed.sql; dashboard branches (public alpha) can copy data with the PITR add-onYes, a copy-on-write clone (up to 15 per source before clones become full copies)Restore a snapshot or point in time to a new instance
What you getA branch in the same projectA separate branch environmentA new clusterA new DB instance
Storage cost for the copyOnly data written after branchingStorage for the seeded dataOnly pages changed after cloningFull storage of the restored instance

Supabase preview branches start from migrations and seed data and don't copy production data, so testing against real data shapes means maintaining seed files. Dashboard branches (public alpha) have an Include data option that copies production data, and it requires the PITR add-on. Aurora clones share storage with the source much like Neon branches, but each clone is a separate cluster. RDS for Postgres has no cloning; you restore to a point in time or from a snapshot, which creates a new DB instance with its own storage bill.

Vendor details verified on 2026-09-23 against the linked pages.

Try branching on Neon

Sign up for the Free plan and create your first branch in under a minute.