How to back up a Supabase project — every option compared
There are four real answers: the backups Supabase includes, the PITR add-on, doing it yourself with pg_dump, and a service like ours. Each covers different failure modes, and two gaps run through almost all of them. This guide lays out what each option actually protects, with working commands and prices as of August 2026.
What Supabase includes: daily backups on Pro
On the Pro plan ($25/month, as of August 2026) Supabase takes a daily backup of your database and keeps it for 7 days. You restore from the dashboard, in place. Three limits to be clear about:
- Database only. Storage files — user uploads, avatars, documents — are not in the backup.
- Usually not downloadable. Projects still on the older logical backup process can download backups from the dashboard — but projects on Postgres 15.8.1.079 or newer, and any project with PITR enabled, use physical backups, which cannot be downloaded. On the physical backup process, getting a copy you own means running
pg_dumpyourself — the .sql export guide has the exact commands. - Daily granularity. A bad deploy at 5 pm can cost you everything since last night.
For a hobby project where losing a day is survivable, this is genuinely fine. It is the default for a reason. On the Free plan there are no automated backups at all — here is what that means in practice, and what to do about it.
How to download your Supabase backup
The follow-up question to “there is a daily backup” is always “can I have it?”, and the answer depends on machinery you did not choose. Open Database → Backups in the dashboard. If each backup has a download option next to it, your project is on the older logical backup process and you can take the file. If there is no download option, the project is on physical backups — Postgres 15.8.1.079 or newer, or any project with PITR enabled — and those restore in place but are not available for direct download, no setting or support request changes it.
Which means for most projects created recently, downloading a backup of your database is really making one: a logical dump you run yourself against the connection string, which you then own outright. That is the pg_dump command two sections down. The .sql export guide walks the dashboard check and the command in detail.
One nuance so the implication lands correctly. Physical backups are not a dead end inside Supabase: on paid plans the dashboard can restore one into a brand-new project, Auth users included. What they cannot do is leave — there is no file to hold, archive, or replay somewhere that is not Supabase. For a copy that survives an account problem or moves to another host, it still has to be one you made.
The PITR add-on: $100/month per project
Point-in-Time Recovery costs $100/month per project for each 7-day retention window (as of August 2026). In exchange you get second-level recovery points: roll the database back to 14:03:27, right before the bad migration ran. If you need minute-level RPO — a production app where losing even an hour of writes is unacceptable — PITR is the right choice, and nothing else in this guide replaces it.
It is still database only, still lives on Supabase infrastructure, and the price is per project — three projects with PITR is $300/month. We wrote a separate honest comparison of PITR and BackupDrill, including where PITR wins outright.
DIY: pg_dump to storage you own
The classic answer, and a good one if you maintain it. Grab the Session pooler connection string from the Connect button at the top of the dashboard. Do not use the Direct connection string — it runs over IPv6 unless the project has the paid IPv4 add-on, and fails with a network error on IPv4-only networks, which is the single most common DIY backup failure.
# Session pooler string — Connect button at the top of the dashboard
export DB_URL="postgresql://postgres.<project-ref>:<password>@aws-0-<region>.pooler.supabase.com:5432/postgres"
pg_dump "$DB_URL" \
--format=custom \
--schema=public \
--file="backup-$(date +%F).dump"Note the --schema=public: this captures your application schema only. Supabase-managed schemas — auth (your users), storage (file metadata) — are not included, and dumping them as a non-superuser is restricted. Know what your backup does and does not contain before you need it.
That single command is the backup case. One trap worth knowing if you reach for the official CLI instead: the default supabase db dump output contains no rows — schema definitions only. The .sql export guide covers both commands and that trap in detail. If what you want is a one-off export rather than a backup — schema without rows, rows without schema, custom roles, or a copy destined for a different project — the flags differ for each and the export guide has the full parameter set and the clone-to-a-new-project path.
Two things bite people here:
- Version skew. Your
pg_dumpmajor version must be ≥ the server’s — Supabase runs PG 15 or 17. Checkpg_dump --versionagainstselect version(); an older client refuses to dump a newer server. - Use the postgres pooler user. A plain read-only role errors on RLS-enabled tables and misses sequence grants, so the dump dies partway or restores incomplete.
The egress bill nobody mentions
Every backup pulls your data out of Supabase, and that is uncached egress: $0.09/GB beyond your plan’s allowance (Free 5 GB, Pro 250 GB per month; Free overage triggers fair-use restrictions, never a charge). Spend Cap is on by default on Pro: once the quota is exhausted, further egress is blocked until the next billing cycle — your app’s traffic included, not just the backup’s. In practice: a weekly backup of a 10 GB project is roughly free; a daily backup of a 50 GB project is about $112/month — more than PITR. Size × frequency decides everything; the CLI docs include an estimate command that projects your number before you schedule anything.
And after the dump succeeds you still have to schedule it — the GitHub Actions guide walks through a complete weekly workflow — ship it to storage you control (our bucket setup guide covers R2, S3, and B2), rotate old copies, and test restores.
The two gaps in all of the above
Gap one: Storage files. A database restore — built-in, PITR, or pg_dump — only brings back the storage.objects table, which is metadata. The actual files live in a separate S3 backend, so the restored database points at files that may no longer exist. Every URL resolves to a 404 while every SQL query looks healthy. We wrote up the full mechanics and the fix.
Gap two: verification. None of these options ever restores your backup to check it works. A backup you have never restored is a guess — dumps taken with the wrong role, a mismatched pg_dump version, or a half-failed job all look like success until the day you need them. The test is cheap and nothing here runs it for you, so we wrote up how to test that your backup actually restores — by hand in fifteen minutes, or automated.
Where BackupDrill fits
BackupDrill is built around those two gaps. It takes scheduled backups of the database and, once you add its S3 keys, your Storage files, writes them to your own S3, R2, or B2 bucket — never ours — and then runs automated restore drills on your plan’s cadence (weekly on every paid plan; Free gets one drill on its first backup): the latest snapshot is restored into a throwaway Postgres and verified — archive sha256, pg_restore completes, post-data objects (indexes, constraints, triggers) present, table count matches the manifest, no missing tables, populated tables non-empty. If a drill fails, you get an email — before you need the backup, not after. Weighing other hosted backup services? We compared SimpleBackups and BackupDrill honestly, including where they win.
The free plan covers one project with weekly backups; paid plans are $19, $49, and $99/month (as of August 2026). The backup engine itself is open source (MIT) at github.com/backupdrill/cli, so nothing about the format locks you in — restores work with stock pg_restore, with or without us. Start with the quickstart, or read the restore & recovery guide first if you want to see the bad-day path before committing.
Which should you pick
| Your situation | Pick |
|---|---|
| You need minute-level RPO or compliance requires point-in-time recovery | PITR — nothing else on this page recovers to an arbitrary second |
| Hobby project, a day of data loss is survivable, no Storage files that matter | Built-in Pro backups are fine; do nothing extra |
| You want copies in a bucket you own and proof they restore | BackupDrill or DIY pg_dump plus your own scripts |
| Storage files (uploads, avatars, documents) matter | Only DIY-with-extra-work or BackupDrill cover them — see the last section |
These combine. PITR plus BackupDrill is a legitimate setup: PITR for recovery granularity, BackupDrill for off-platform copies, Storage files, and proof that restores work.
FAQ
Does Supabase have automatic backups?
From the Pro plan up, yes: daily automated backups of the database, kept for 7 days (14 on Team). The Free plan has none. Two scope notes people learn late: the backups cover the database only — Storage files are never in them — and projects on the physical backup process (Postgres 15.8.1.079 or newer, or any project with PITR enabled) cannot download them; recovery is a dashboard restore in place or, on paid plans, a restore into a new project. Enabling PITR replaces the daily backups with continuous WAL archiving.
How do I get daily backups of a Supabase project?
On Pro and above, Supabase's own daily backup is automatic — there is nothing to configure. Daily backups in storage you own are a separate thing: schedule pg_dump yourself (a GitHub Actions workflow does it; check the egress math first, because daily frequency multiplies it), or use a service — BackupDrill takes daily backups to your own bucket on paid plans, weekly on Free, with restore drills on top.
How long does Supabase keep backups?
7 days on Pro, 14 on Team, up to 30 on Enterprise (as of August 2026). PITR is priced per 7-day retention window at $100/month per project. And backups live and die with the project: deleting a project deletes its backups too, which is the operational argument for keeping copies in a bucket Supabase cannot touch.
Where do I see my backups in Supabase?
Dashboard → Database → Backups is where the daily snapshots live on Pro and above; projects still on the older logical backup process also get a per-backup download option there. With PITR enabled the daily snapshots stop, and recovery moves to the Point in Time section instead. On the Free plan the page shows nothing — backups are not included on Free, though Supabase has said it currently keeps some free-project backups that only become accessible if you upgrade, with no promise that continues. Backups you take yourself live wherever you sent them — which is rather the point: a copy outside the platform survives anything that happens inside it.
Can you pay Supabase for more backups or longer retention?
For the daily backups, no — retention is fixed by plan (7 days on Pro, 14 on Team, up to 30 on Enterprise). What you can buy is PITR retention, sold in 7-day windows at $100/month each per project — and PITR replaces the daily snapshots with continuous recovery rather than adding more of them. For retention measured in months or years, the answer is backups you own: pg_dump copies in your own bucket keep whatever retention your lifecycle rules allow, at object-storage prices.
How do I back up self-hosted Supabase?
The platform's backup features — daily backups, PITR, the Backups page — are cloud-only. A self-hosted stack is your own infrastructure, so backups are the classic kind: pg_dump on a schedule (or pg_basebackup plus continuous WAL archiving if you need point-in-time recovery — WAL replay requires a physical base backup, not a pg_dump), a copy of whatever backs Storage — local volume or S3 bucket — and your configuration: compose files, secrets, Edge Function sources. A database dump alone does not reconstruct the stack. Hosted backup tools, BackupDrill included, target the cloud platform and do not support self-hosted instances — plan on owning this one yourself.
Sources
- Supabase docs — Database Backups
- Supabase — Pricing
- Supabase docs — Manage PITR usage
- Supabase troubleshooting — Backup accessibility after upgrading
- Supabase docs — Connecting to your database
- Supabase docs — Manage Egress usage
- Supabase docs — Control your costs (Spend Cap)
- PostgreSQL docs — pg_dump
Facts and prices last verified August 9, 2026 against the sources above. Written by the team behind BackupDrill.
Want the backups and the drills without maintaining any of this? Start free — the free plan covers one project — or run the open-source CLI yourself.