Backups
Three ways to back up a Supabase database, and what each misses
The dashboard, pg_dump, and a managed service. What each one actually saves, what it quietly leaves out, and which one survives losing the account.
In short
- Supabase's own backups are the easiest to turn on and the worst to rely on: the copy lives inside the account you might lose.
- pg_dump is free and complete, and it only happens when you remember. Remembering is the part that fails.
- None of the three back up your Storage files. That is a separate job whichever route you take.
Everyone building on Supabase eventually asks the same question, usually about a week after launch and usually at two in the morning: if I break something, can I get my data back?
The answer depends entirely on which of three routes you took, and each one misses something the other two cover.
Which one should I use?
Turn on whatever your Supabase plan gives you, and then keep a copy somewhere else. Those are two different jobs, and doing only the first is the mistake this article exists to prevent.
The dashboard backup protects you against your own mistakes. A copy you hold protects you against losing the account: a billing failure, a suspended project, a password you cannot recover. Those are different disasters and they need different answers.
| Supabase dashboard | pg_dump by hand | Managed backups | |
|---|---|---|---|
| Runs without you | Yes | No | Yes |
| You hold the copy | No | Yes | Yes |
| Survives losing the account | No | Yes | Yes |
| Checked before it counts | No | No | Yes |
| Cost | Paid plans only | Free | A subscription |
What a backup actually contains
Your tables, your rows, your indexes and functions, and your Row Level Security rules (the policies that decide who can read what, not just the tables they apply to). That is the whole of it.
What it does not contain is everything that was never in the database:
| In the file | Not in the file |
|---|---|
| Table structure, with every column and constraint | Files in Storage: uploads, avatars, attachments |
| Every row your users created | Auth provider settings, such as your Google or GitHub app |
| Indexes and functions | Edge functions, which live in your repository |
| Row Level Security policies |
The one that catches people is Storage. Every avatar, every uploaded PDF, every image your users added lives in object storage, not in the database. The database only holds the path to each file. Restore a database backup into an empty project and you get a table full of links to files that are not there.
Route 1: the Supabase dashboard
The easiest, and the one most people should turn on first. Supabase takes daily backups on paid plans, and point-in-time recovery is available as an add-on if you need to rewind to a specific minute rather than to last midnight.
What it is good at: it runs without you, it is complete, and restoring is a few clicks in a UI rather than a command you have to get right under pressure.
What it misses: the copy lives inside the account. If the project is suspended, the card on file fails, or you lose access to the login, the backups are behind the same door as the thing they were protecting. It is a fire escape inside the building.
It is also not available at all on the free plan, which is where most freshly-launched apps are sitting.
Which plan you are on decides whether you have this at all, and it takes two minutes to check.
Route 2: pg_dump on your own machine
Supabase is Postgres, so the standard Postgres tool works. pg_dump writes the
whole database to a file you hold.
pg_dump "postgresql://…your connection string…" \
--clean --if-exists --no-owner \
--file backup-2026-08-09.sql
What it is good at: it is free, it is complete, the file is yours, and you can restore it into a brand-new project on a different account. Of the three routes this is the only one that survives losing everything else.
What it misses: it only happens when you remember. That is not a technicality, it is the whole failure. The dump on your laptop is dated from whenever you last thought about it, and the day you need it is never a day you were thinking about it.
There is a second, quieter problem: an untested dump is a guess. A file that was written while a migration was half-applied, or that silently truncated because the connection dropped, looks exactly like a good one until the day you try to use it.
Route 3: managed backups
Something else takes the copy on a schedule, stores it away from your account, and checks that the copy is real before calling it done. That last part is the one that actually matters.
That is what Reeve Care does: several copies a day depending on plan, encrypted and held outside your Supabase account, each one verified by counting what came out against what went in. A backup only counts as taken once it has been verified, which is why the date shown in the dashboard is the date of the last verified copy rather than the last attempt.
The honest trade-off: it costs money, and it is one more service in your stack. If you are disciplined enough to run route 2 on a real schedule and test the restores, you do not need it.
The whole cycle is drawn out on the Supabase backups page — the copy leaving Supabase, the check that follows it, and the button that puts it back.
Have you ever restored one?
That question decides whether you have a backup or a file that has never been opened. A dump nobody has read back is a guess about the future, and the moment you find out it was wrong is the moment you needed it to be right.
A restore test does not have to be dramatic. Make a new Supabase project, load your most recent backup into it, open the app against that project, and check that a row you recognise is there. Half an hour, once a quarter. If the restore fails, you have found out on a Tuesday afternoon instead of during an outage.
If you want the wider list of things worth checking on a newly launched app, the 10-minute security checklist covers backups alongside the rest, and the Supabase safety guide goes through what else is commonly left open.
What to do this week
What to do
- Turn on whatever backup your Supabase plan includes. It is the cheapest thing on this list and takes about a minute.
- Take one
pg_dumptoday and put the file somewhere that is not your laptop. Even a stale copy beats no copy. - Back up your Storage files separately. No database backup on any of these routes includes them.
- Do one restore into a throwaway project, so that the next time you read that file is not the first time.
- Decide how much data you could stand to lose, and pick a schedule from that number rather than from what feels responsible.
Worth reading next: if you assumed your builder's undo covered your data, version history is not a backup is the one to read first. After that, your database is only as private as the keys in front of it, and which API keys are safe in your frontend covers the one that bypasses every rule you set.
FAQ
Does the Supabase free plan include backups?
No. Daily backups start on the Pro plan, and point-in-time recovery is an add-on above that. On the free plan there is no automatic copy of your data anywhere, which surprises most people the first time they need one.
Is a backup the same as version history in my builder?
No, and this is the most expensive misunderstanding in this article. Lovable, Bolt and the rest version your CODE. Your database is a separate service holding your users, their content and their orders. Rolling your code back to yesterday does not roll your data back, and deleting a table in the Supabase editor leaves your code perfectly intact.
How often should I back up?
Ask instead how much you are willing to retype. If losing a day of signups would be annoying, nightly is enough. If losing an hour of orders would mean refunding people, you need something closer to hourly. The honest test is not the schedule, it is whether you have ever restored one.
Do I need to back up if my app has almost no users?
That is the cheapest time to start, because the data is small and the habit is what matters. The painful losses are rarely dramatic. They are a mistyped delete during a late-night fix, on a project with just enough real users that starting over is not an option.