scribase
How-to

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

Which one actually does what you want
NameWhat it doesRequires
Restore to another projectRestores a physical backup into a new project, duplicating dataPaid plan with physical backups enabled
Project TransfersMoves an existing project to a different organization, in placeOwner permissions on both organizations
Manual dump and restoresupabase db dump (or pg_dump) from the old project, then psql into the new oneAny plan; the project must not be paused

Sources: Supabase: Migrating within Supabase

The manual path, step by step

  1. Step 1

    Create the new project first

    Pick the region and plan; you need its connection string before restoring anything.

  2. 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-only
  3. Step 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"
  4. 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.

sh
scribase import supabase --project-ref <old-ref> \
  --org acme --project app --env production \
  --connection-string "$OLD_DB_URL" --dry-run

Sources: Scribase pricing

FAQ

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.