At a glance
How many hours have passed since your most recent successful Supabase backup completed. This is your recovery insurance, measured in time. If disaster strikes (a bad migration, accidentalDELETEwithout aWHERE, a corrupted table), this number tells you how much data you stand to lose: everything written since the last good backup. Supabase takes daily logical backups on Pro and above, with Point-in-Time Recovery (PITR) available as an add-on on higher tiers. The Free tier has no backups at all. A healthy Pro project should read under 24 hours; anything over 72 hours means the backup schedule has silently stopped and your recovery window is widening by the minute.
Calculation
The card is a straightforward age computation:- Daily logical backups (Pro and above): Supabase runs a scheduled
pg_dump-style logical backup once per day. The completion time of the latest one sets the age. On a healthy project this number sits between 0 and 24 hours and saws back to near zero each day when the new backup lands. - Point-in-Time Recovery (PITR add-on, higher tiers): PITR continuously ships write-ahead log (WAL) segments, so the effective recovery point is only seconds to minutes old. Where PITR is enabled, the card reflects the edge of the PITR window, which is why a PITR project reads a very low age almost all the time.
now minus a fixed past timestamp, so it increments every second until a fresh backup resets the base. That continuous tick is deliberate, it makes a stalled schedule visible as a number that keeps growing past its normal daily ceiling.
Worked example
A platform team runs the production database for a subscription box service on Supabase Pro (daily backups, no PITR add-on). They expect the age to saw between roughly 0 and 24 hours. Snapshot reviewed on 18 Apr 26 at 08:00 BST.
On the morning of 18 Apr the card reads ~54 hours. The team had been running a long migration each night that held an exclusive lock past 02:00, so the backup could not start and timed out. Two nights in a row the daily backup never completed, and the age has climbed past one full day and is heading for the 72-hour red line.
- Restore the backup schedule first, diagnose second. Move the nightly migration window so it does not overlap 02:00, or run it with a lock timeout so it yields. Get a clean backup tonight to stop the bleed; the migration scheduling fix can follow.
- Take a manual backup now. Do not wait for the next scheduled slot. A manual logical backup immediately resets the age and caps the exposure at the present moment.
- Consider the PITR add-on. For a revenue database, a 24-hour exposure ceiling is the wrong risk posture. PITR drops the realistic loss to minutes. The cost of PITR is far smaller than the cost of replaying 54 hours of orders by hand.
- A failed backup does not reset the clock. The age tracks the last successful completion. A schedule that runs but fails every night looks busy and is silently useless; this card exposes it because the number keeps climbing.
- The daily saw-tooth is the healthy shape. On a daily-backup project the number should rise to roughly 24 hours and drop back to near zero every day. A flat-but-low number means PITR; a number that never drops means a stalled schedule.
- Age is your recovery-point objective in disguise. If your business cannot tolerate losing more than an hour of data, a daily-backup tier cannot meet that RPO no matter how healthy the card looks. The age ceiling is the RPO; if 24 hours is too much, you need PITR.
Sibling cards
Reconciling against the source
Where to look in Supabase’s own tooling:Project Dashboard → Database → Backups for the list of daily logical backups with their completion timestamps and status. The most recent successful entry is what the card measures against. Project Dashboard → Database → Backups → Point in Time (where the PITR add-on is enabled) for the recovery window edge, which is the effective “age” on PITR projects. Project Settings → Add-ons to confirm whether PITR is enabled, since that changes how the age behaves (continuous WAL versus daily snapshots).Why our number may legitimately differ from the Supabase UI:
Cross-connector reconciliation: treat this card as the durability counterpart to your platform availability metrics. A green uptime number tells you the service is reachable; this card tells you what happens if the data inside it is destroyed. Both must be healthy for a true DR-ready posture. If you also run an external backup or DR pipeline, reconcile its last-run timestamp against this card; a gap means one of the two pipelines has stalled.
Known limitations / FAQs
My card reads “no backup” or a very large number. What is wrong? Either the project is on the Free tier (which has no backup mechanism, so there is nothing to measure), or every scheduled backup has failed and there has never been a successful completion to anchor on. Check Database → Backups: if the list is empty or every entry shows an error, the schedule has never produced a good backup. Take a manual backup immediately and, if on Free, upgrade to a tier that includes backups before relying on this card. The age never drops below ~24 hours even though backups run nightly. Is that a problem? No, that is the expected shape for daily logical backups. The age saws up to roughly 24 hours and resets when the new backup lands. If 24 hours of potential data loss is unacceptable for your business, the fix is the PITR add-on, which drops the effective age to minutes, not a tweak to this card. The age keeps climbing past 72 hours. The backup “runs” every night, so why? A backup that runs but fails does not reset the age; only a successful completion does. The most common cause is a long-running migration or batch job holding an exclusive lock through the backup window, so the dump times out. Check the backup status in the dashboard (not just whether one was attempted), move conflicting jobs out of the backup window, and take a manual backup now to stop the exposure growing. Does a read replica count as a backup? No. A replica protects against instance or zone failure by holding a live copy, but it faithfully replicates bad writes too. If you runDELETE without a WHERE, the replica deletes the same rows seconds later. Backups (and PITR) protect against bad data; replicas protect against infrastructure failure. You need both for full coverage, and this card only measures the backup side.
I enabled PITR but the daily backup list still shows day-old snapshots. Which is my real exposure?
With PITR enabled your real recovery point is the PITR window edge (seconds to minutes), and that is what the card reflects. The daily logical snapshots still exist as a coarser fallback, which is why the backup list shows older entries. Trust the PITR window for your true exposure figure.
Can I change the alert threshold from 72 hours?
Yes, in the Alert Rules tab. A project that genuinely cannot take daily backups (rare) might widen it, but most teams should tighten it: on a daily-backup project, alerting at 30 hours catches a single missed backup before it compounds into two. On a PITR project you can set it very low because the age should never exceed minutes.
The backup completed but I am not sure it is restorable. Does a successful completion guarantee a good restore?
A successful completion is necessary but not sufficient. The only way to be confident in a restore is to test it: periodically restore a backup into a scratch project and verify the data. This card tells you a backup exists and is recent; it cannot tell you the restore will succeed. Schedule a quarterly restore drill and treat it as part of your DR routine.