A backup counts once it restores

Most teams find out their backups are broken on the day they need them. backupd restores yours on a schedule, counts what came back, and tells you when something is missing.

Restore test

app-prod-2026-10-15-0300.pgdump.zst.age
Restorable
Tables
5 of 5
Rows
1,766,383
Took
41s
Sandbox
postgres 16
  1. Fetch the backup612 MB from storage6s
  2. DecryptUnlocked and checksum matched3s
  3. RestoreInto a temporary Postgres 16 database27s
  4. Count rowsEvery table matches the backup4s
  5. Clean upTemporary database deleted1s
Counts per table, backed up against restored
TableBacked upRestoredResult
public.sessions1,402,3771,402,377match
public.order_items241,880241,880match
public.orders96,51296,512match
public.users18,20418,204match
public.invoices7,4107,410match
Integrity
Every backup is read back and checked.
Sandbox
Restored on a sandbox server, never yours.
Counted
Rows and documents, table by table.
Every backup
Pro tests every backup up to 10 GB.

After every backup

The stored file is read back, decrypted and decompressed, both checksums are compared, and the engine’s archive format is checked. A backup that fails this is not counted as good.

Backup

app-prod-2026-10-16-0900.pgdump.zst.age
Succeeded
  1. Dumppg_dump -Fc from an exported snapshot
  2. Compresszstd, 2.9 GB to 612 MB
  3. Encryptage, to 3 keys
  4. Upload10 parts of 64 MiB, nothing on disk
  5. CheckRead back, both checksums match

Took 1m 54s · Scheduled

The restore test

  1. FetchThe backup is fetched from storage like any restore.
  2. DecryptIt is decrypted with backupd’s key and decompressed, and the checksum is matched.
  3. RestoreIt is restored into a temporary database on a sandbox server running the same engine.
  4. CountEvery table or collection is counted and compared with the counts taken when the backup was made.
  5. Clean upThe temporary database is dropped. Your database is never touched.

How often

  • Starter: the latest backup, every day.
  • Pro: every backup up to 10 GB, and the latest larger one every day.
  • Custom: every backup, whatever its size.

Storage

2,317 backup files · 66.5 GB stored

FileSizeRestore testCreated
app-prod-2026-10-16-0900.pgdump.zst.ageapp-prod612 MBPassed12 min ago
billing-2026-10-16-0600.sql.zst.agebilling88 MBNot tested2 h ago
app-prod-2026-10-16-0800.pgdump.zst.ageapp-prod611 MBPassed1 h ago
events-2026-10-16-0300.archive.zst.ageevents1.4 GBPassed9 h ago
marketing-site-2026-10-13-0300.zip.agemarketing-site20 MBPassed3 days ago

Every file opens with Download encrypted, or straight from your own bucket.

When a count is short

The backup is marked as failing its test and an alert goes to your channels. The backup’s page lists each table that came back short, with both counts, and you can rerun the test from there.

#ops-alerts

backupd APP 09:02

Restore test failed · app-prod

A restore test of app-prod failed. Keep an older verified copy until it’s resolved.

Database
app-prod
File
app-prod-2026-10-16-0900.pgdump.zst.age
Tested against
postgres 16 sandbox
Open backupd

Per engine

Postgres counts are exact up to 25 million rows when we can export a snapshot; MySQL and MongoDB counts are always exact. Convex has no temporary deployment to restore into, so its backups get an integrity check and per-table counts instead.

Find out tonight, not on the bad day

Connect a database and its first restore test runs on your plan’s schedule. Starter is free for 14 days.