Plugin

Freshet Backup

The gripe

A backup that quietly stops running looks exactly like one that works, until the day you need it.

The plugin

Should prove each copy arrived, and say so out loud when one is missing.

WordPress runs scheduled tasks only when someone visits the site, and a page cache answers most visits before WordPress loads. So a scheduled backup can stop for days with nothing on screen to say so, and a backup that failed halfway can sit in the list looking like any other.

Freshet Backup copies the WordPress database to your Dropbox on a schedule. A copy only counts once Dropbox confirms it arrived complete, and when a backup fails or does not happen on time, a notice in wp-admin says which, and what to do. Connect Dropbox in three steps, choose how often, and it takes care of the rest.

Free, and the whole plugin

One job, done carefully, and all of it free. Nothing in the download is locked, limited or time-barred.

Connect Dropbox in three steps
Press Connect Dropbox, press Allow, paste the code. No developer account and no API keys. Then choose how often: every hour, every 6 hours, every day or every week, and press Run backup now for the first one. Nothing runs before Dropbox is connected. The plugin talks only to Dropbox and to your own site, and it only sees its own folder in your Dropbox. Getting started is in the docs.
A backup counts once Dropbox has proven it
When an upload finishes, Dropbox reports a fingerprint of the file it stored. The plugin compares it with the file on your server. Only when the two match is the backup verified and the local copy deleted. If they differ, or the upload fails, the local copy is kept and sent again on the next run. Dropbox keeps the newest 7 of each site's backups, in a folder named after the site. Where backups go is in the docs.
A missed backup is reported, not only a failed one
A run that fails says why. A run that never happens is the harder case, because nothing records it. So the plugin watches for that too: a backup a whole interval overdue is made the next time an administrator opens wp-admin, after the page has loaded, and if nothing has worked for twice the interval, a notice appears on every wp-admin page. It names the likely culprit: WP-Cron has stopped, or the runs themselves are failing. For a quiet or heavily cached site, the docs give the cron line that takes visitors out of it. Schedule and missed backups are in the docs.
Private while it waits on your server
A backup is written to a folder on your server first: next to the website's folder where the server allows it, inside wp-content where it does not, or wherever FRESHET_BACKUP_DIR says. When that folder is somewhere a URL could reach, the plugin checks before every backup that it really cannot be downloaded. If the check fails, or cannot finish, no backup is written: it makes none rather than one that might be public, and says so. The download check is in the docs.
Safe on copies of your site
The Dropbox connection is saved in wp-config.php, not in the database, and only applies on the site's own addresses. A copy of the site on a staging or development server, or a database pulled into a migration tool, carries no access to your Dropbox and does not back up into it. Disconnect removes the site's access at Dropbox and takes the lines out again. Everything beyond the schedule is an optional wp-config.php constant. The constants are in the docs.
What it does not do
It backs up the database only: not files, not uploads. It reads the database through WordPress, a few rows at a time, so it needs no shell access and little memory. There is no restore button. Restoring is downloading the file from Dropbox and importing it with your host's database tool, or one gzip -dc … | mysql line; the docs show both.

Needs WordPress 6.5 and PHP 8.1 or newer, and a Dropbox account. Freshet Backup is coming to wordpress.org and is not listed there yet. Setup, where backups go, the schedule and every constant are in the Backup docs.