Moving a Supabase project to another project or account
These are three different operations with different names. Restore to another project duplicates data into a new project (paid plans with physical backups). Project Transfers moves a project to a new organization without touching its data. Neither helps a Free-tier project that just needs a clean copy — that is the manual dump/restore path.
Last checked October 12, 2026.
Three operations, easy to mix up
| Name | What it does | Requires |
|---|---|---|
| Restore to another project | Restores a physical backup into a new project, duplicating data | Paid plan with physical backups enabled |
| Project Transfers | Moves an existing project to a different organization, in place | Owner permissions on both organizations |
| Manual dump and restore | supabase db dump (or pg_dump) from the old project, then psql into the new one | Any plan; the project must not be paused |
Sources: Supabase: Migrating within Supabase
The manual path, step by step
Step 1
Create the new project first
Pick the region and plan; you need its connection string before restoring anything.
Step 2
Dump the old project
The Supabase CLI runs pg_dump with the right exclusions for Supabase-managed schemas.
sh export OLD_DB_URL="postgresql://postgres.<old-ref>:<password>@aws-0-<region>.pooler.supabase.com:5432/postgres" supabase db dump --db-url "$OLD_DB_URL" -f roles.sql --role-only supabase db dump --db-url "$OLD_DB_URL" -f schema.sql supabase db dump --db-url "$OLD_DB_URL" -f data.sql --use-copy --data-onlyStep 3
Restore into the new project
"object already exists" errors on the default schemas are expected and safe to ignore; the new project already created them.
sh psql --single-transaction --variable ON_ERROR_STOP=1 \ --file roles.sql --file schema.sql \ --command 'SET session_replication_role = replica' \ --file data.sql --dbname "$NEW_DB_URL"Step 4
Copy Storage buckets separately
Database dumps never include Storage objects, only their metadata rows.
sh supabase storage cp ./downloaded/<bucket> ss:///<bucket> -r --experimental --project-ref <new-ref>
Sources: Supabase: Migrating within Supabase
What the manual path does not carry over cleanly
- Auth users dump along with the rest of auth.users, including password hashes, but Supabase's own CLI dump excludes Supabase-managed schemas by default, so this needs an explicit include or a separate step depending on CLI version — verify auth.users row counts match after restoring.
- API keys (anon, service_role) are per-project secrets; the new project has new ones, so every client and server needs its URL and key updated.
- Realtime publication membership and Storage bucket policies are schema objects, not data, so a schema-only dump does carry them if the dump step above completed without errors on those statements.
Sources: Supabase: Migrating within Supabase
A one-command alternative
Scribase's importer runs the whole move in one step against the old project's connection string: schema, auth users with ids and password hashes preserved, data, RLS policies and Storage objects, ending with a per-table verification report instead of manual row-count checks. Each project is $25 a month.
scribase import supabase --project-ref <old-ref> \
--org acme --project app --env production \
--connection-string "$OLD_DB_URL" --dry-runSources: Scribase pricing
Questions people ask
Can I just click a button to copy a Supabase project to a new one?
Only on a paid plan with physical backups enabled, via Restore to another project. Otherwise it is a manual dump and restore.
Does Project Transfers move my data to a new project?
No. It moves the same project, data and all, to a different organization. It does not create a second copy.
Do I keep my API keys after moving to a new project?
No. A new project gets new anon and service_role keys; every client and server configuration needs the new values.