VPS Snaps

Questions & answers

The questions we’d ask before trusting anyone with our backups.

55 answers about how the jobs actually run, where the bytes end up, and what VPS Snaps still can't do. The awkward ones are in here too.

Getting started

What you need in hand before the first job runs, and how far the free plan actually gets you.

What is VPS Snaps, exactly?

A scheduler and a runner. You connect a cloud provider (for snapshots) or an SSH server (for dumps and archives), point the job at your own S3-compatible bucket, and choose a cadence. From then on our worker wakes up on schedule, does the work, writes the result to your bucket or into your provider account, and records what happened. There is no storage product to buy from us and no proprietary archive format to get locked into.

What do I need before I can run my first backup?

For a VPS snapshot: a read/write API token from DigitalOcean, Hetzner, Vultr, Linode, AWS, or Google Cloud. That is the whole list — snapshots stay in your provider account, so they need no bucket at all. For a database, Docker, or file backup: SSH access to the server (private key or password) plus an S3-compatible bucket and an access key scoped to it.

Do I have to install an agent on my servers?

Not for provider snapshots, which are pure API calls, and not for SSH jobs — we run pg_dump, mysqldump, tar, or docker over the SSH connection you already have, and nothing is installed or left behind. The one exception is the Agent, and only if you want it: a Docker container you run yourself on machines we have no inbound route to.

Which providers can you take snapshots on?

DigitalOcean, Hetzner, Vultr, Linode (Akamai), AWS EC2, AWS Lightsail, Google Compute Engine, and Microsoft Azure. Each one goes through that provider's own snapshot API, so the image is created inside your account, stays there, and is billed by them rather than by us. Two caveats worth knowing up front. Linode is the odd one out — its API creates a disk image of a single disk you select rather than a whole-instance snapshot, so a Linode with several disks attached is not fully covered by one job. Azure has no whole-machine snapshot at all, so a run snapshots every managed disk on the VM as a set; unmanaged (classic) VMs cannot be snapshotted and are refused with a message saying so.

My host isn't on that list. Am I stuck?

Only for snapshots. Database, Docker, and file backups do not care who the host is — they need an SSH login and nothing else. An unsupported provider, a bare-metal box in a colo, or a machine under your desk all work identically.

How much can I actually do on the free plan?

One server, one backup job, one storage destination, running daily, with a one-day retention window. VPS snapshots, file backups, Kubernetes, and Agent jobs are all included on Free; database and Docker jobs unlock on Standard. It is not a trial — there is no card and nothing to cancel, and it lasts as long as you use it.

Can I bring my team in?

Team seats open up on Pro and Agency. Free, Starter, and Standard are single-seat. On the plans that allow it, members join a shared workspace as owner, admin, or member — so the backups outlive whoever set them up.

How the backups actually run

The real commands, the real staging directories, and what happens on the night one of them fails.

How does a database backup actually run?

We open an SSH session to your server and run, for PostgreSQL, pg_dump -h <host> -p <port> -U <user> <database> | gzip. The compressed stream is never written to disk on your server and never passes through ours. The server uploads it straight to your bucket in parts as it is produced, with short-lived links we sign for it, hashing it on the way out. MySQL and MariaDB use the equivalent mysqldump pipeline, and the object lands as <database>-<timestamp>.sql.gz. MongoDB is the one that differs: mongodump --archive --gzip compresses and frames the stream itself rather than being piped through gzip, so the object is <database>-<timestamp>.archive.gz and it goes back in with mongorestore rather than a SQL client — from the dashboard like the others, or by hand.

Will the dump lock my database?

pg_dump takes an ACCESS SHARE lock: reads and writes carry on normally, and only schema changes block. mysqldump runs with MySQL's default options, which take a read lock across the tables in the database being dumped for the duration of the dump. So schedule MySQL jobs for a quiet hour rather than your traffic peak.

Can I back up a managed database like RDS or DigitalOcean Managed Postgres?

Yes, indirectly. Set the job's database host and port to the managed endpoint and attach it to any SSH server allowed to reach that endpoint. The dump runs from that box, which means it needs the matching pg_dump or mysqldump client installed and the managed database's firewall has to permit its address. We connect to your server; your server connects to your database.

What is inside a Docker backup?

A single tar.gz containing one archive per named volume you selected — each produced by a throwaway alpine container that mounts the volume — plus a copy of every compose file path you listed and docker inspect output for the containers you named. Volumes are staged in /tmp/vpssnaps-<run-id> on the server first, so you need roughly the compressed size of those volumes free in /tmp. The staging directory is removed when the run finishes.

What happens if one Docker volume fails to archive?

The run fails, and the error names every volume that could not be archived. It used to be recorded as a warning with the run finishing successfully — a green badge over a backup missing a volume, which is the one outcome a backup must never have. Now a successful run always contains every volume you asked for.

How do file backups handle a path that doesn't exist?

It is skipped, logged as a warning, and the run carries on. Only if none of the configured paths exist does the run fail outright. Exclude patterns are passed through to tar --exclude verbatim, and tar strips the leading slash, so an archive of /var/www extracts as var/www — it will not overwrite the root of wherever you unpack it.

What does the Kubernetes backup cover, and what does it miss?

If Velero is already installed in the cluster, we detect it and drive it, and your Velero configuration decides what happens. If it is not, a short-lived Job reads the manifests for the namespaces you chose inside the cluster and uploads them straight to your bucket — or, where the cluster does not let us run one, our worker reads them over the API with your service account token — and we request a CSI VolumeSnapshot for each persistent volume. Volumes whose storage driver has no CSI snapshot support are skipped and logged rather than silently dropped. We do not install Velero for you.

How often can backups run?

Daily on Free and Starter, every 12 hours on Standard, and as often as every 5 minutes on Pro and Agency. The schedule form offers manual, every 5 minutes, hourly, every 12 hours, daily, weekly, and monthly, with a time of day and an IANA timezone for the last three. So a 2am job runs at 2am where you are, not at 2am UTC.

Can I trigger a backup by hand?

Yes. Any job can be run on demand from the dashboard — before a migration, before a risky deploy, before you touch the database — without disturbing its schedule or its retention window.

When things break

Failure handling is where backup products get quietly optimistic. Here is what we do, and the one place we currently do nothing.

What happens when a backup fails?

The run is marked FAILED with the underlying error text — the provider's message or the shell's stderr, not a generic replacement — the failure is written into that run's log, and a notification goes out on every channel you have configured. The job's row in the dashboard flips to a failed state so it is visible without opening anything.

Do you retry a failed backup automatically?

No, not today. A failed run stays failed until its next scheduled slot or until you re-run it by hand from the dashboard. We would rather say that plainly than let you assume a transient SSH timeout heals itself. The error text and the step-by-step log are kept precisely so the re-run is an informed one.

Will you tell me if a job never ran at all?

Yes. If an enabled job is more than 15 minutes past its scheduled run with nothing dispatched, you get an alert on the same channels as a failure. A stuck run from a previous attempt, a disconnected agent, and a scheduler-level outage all trip it, since they all leave the same symptom. It fires once per outage, then again at most once a day if it's still unresolved, so a multi-hour incident doesn't flood your inbox. It rides the same on/off toggle as failure alerts rather than a separate setting, and Slack/Teams/Google Chat/Discord destinations can be pointed at it individually in Settings if you want it routed differently.

Will you tell me if a job stops producing backups?

Yes, even when each run's own alert would not. A job is judged against its schedule and, once it has a history, against how often it has actually succeeded. When it has gone three times that long without a successful backup (a daily job after three days, an hourly one after three hours, never more than six weeks) and has been trying in the meantime, you get one alert saying how old your newest good backup now is and what the latest run said. That covers runs that send no message of their own: one canceled while it waited, or one cut off by a restart of our service. It fires again only if the same span passes with nothing better, stays quiet while a run is in progress or when the never-ran alert already covers the job, and rides the same on/off toggle as failure alerts. It can be routed to its own destinations in Settings.

Where do alerts go?

Email plus Slack, Microsoft Teams, Google Chat, and Discord, on success or on failure, per job. All five are available on every plan including Free — there is no chat-notifications upsell. Arbitrary custom webhook URLs, for routing into something we do not support by name, are the Agency plan's addition.

What do I get to look at after a run?

Status, duration, byte size, MD5 checksum, what triggered it, and a timestamped log of every step in order — the SSH connect, each volume archived, each path skipped, the upload, the retention deletions. Warnings stay in place next to the steps that produced them instead of being rolled up into a summary.

Restoring

The most important section on this page: what restores from the dashboard, what does not, and how you would know a backup works — with the limits spelled out here rather than discovered later.

How do I restore a backup?

From the dashboard, for database, file and Docker runs, Kubernetes runs taken with Velero, and WordPress sites through the plugin: open the run, choose where to restore it, and confirm. A run taken by the agent restores back onto the machine the agent runs on. A detected application — its files and its database — restores in one step from the Recovery page. The exception is a provider snapshot, which you restore from your provider's console, where it already lives. And any archive at all can be restored by hand if you would rather not go through us: gunzip -c mydb-2026-08-31T02-00-00Z.sql.gz | psql mydb. The help centre carries the exact commands for each backup type.

Is there a restore button?

Yes. Open a successful run and pick where to restore it — any server in your workspace, not only the one it came from. It downloads the archive, checks it against the checksum recorded when the backup was taken, backs up whatever it is about to overwrite, and only then applies it — and it refuses to go ahead if that safety backup fails. A check-only mode downloads and verifies without changing anything.

Restoring onto a new server that doesn't have the files yet is one checkbox: with nothing there to back up first, the restore only creates files. It stops before writing anything if a file it would write already exists, and never overwrites one. Two limits worth knowing: a Kubernetes run restores only if it was taken with Velero, and a provider snapshot is rebuilt from your provider's console, where it already lives. One thing to be clear about rather than surprised by: a database restore replaces the tables the backup contains, so a table created after the backup survives it — you get the backup's contents back, not a byte-exact reset. Every artefact also stays an ordinary .sql.gz, .tar.gz or provider snapshot, so the manual path still works whether or not VPS Snaps is online, reachable, or still in business.

Can I move a site to a new server, or to a different host?

Yes, for an application VPS Snaps has detected — WordPress, Laravel, Craft CMS, Ghost or Nextcloud. Pick the new server and it checks both servers first, creates the site's database and user there, takes a fresh backup of the database and then the files, restores them onto the new server — never overwriting a file already there — and counts what arrived against what left. The old server is only ever read, so if anything fails, the live site is exactly as it was. What stays yours: the web server configuration, DNS, the HTTPS certificate, cron and background workers, and anything the old site records after its backup starts, so pause a busy site first. It's included on the Standard, Pro and Agency plans, and the Switching Providers page walks through all of it.

What happens if my server is lost?

You build a replacement. Save a recovery plan on the server's page, and Recover now creates a new server on your DigitalOcean, Hetzner, Vultr, Linode, AWS EC2, AWS Lightsail, Azure or Google Compute Engine account: from the server's newest snapshot there if it has one, which is the whole machine, or otherwise a fresh Ubuntu server with the database engines and Docker installed, each database created with the same name, user and password as before, and the newest backups restored onto it.

A recovery from backups brings back the server's software too. Each database, file or Docker backup over SSH records what the server runs — the packages its admin installed, its web server, PHP and TLS configuration, cron and its own services — with the configuration stored in your own storage, and the recovery installs and starts the same. Repositories it had added (a PPA, NodeSource, Docker's) are added back, moved to the new server's Ubuntu release. A repository that no longer answers, or a PHP version that has moved on, is listed for you; a snapshot has everything. Its data is exactly as old as the backups it was built from, and the page says how old before you press anything.

If the provider the server runs on is down, rebuild it somewhere else. Choose a second cloud in the plan and it's one button, Recover to that cloud; or open the server's Rebuild elsewhere page, which every outage alert links to, and build on a cloud you've connected, one you connect there and then, or any Ubuntu 22.04 or 24.04 server you can reach as root at any host. That is always from backups, since a snapshot only comes back at the provider that took it, and the provider that's down is never asked anything. Traffic then moves by DNS: on Cloudflare, or the summary lists the records to change. A checklist on the server says beforehand whether its backups are kept with a company other than the one running it.

Two options go on top. A warm standby keeps a recovery server built and rebuilt from newer backups, so it is ready at once; it runs, and is billed to your account, all the time. Automatic failover checks the server every minute, and when it hasn't answered for as long as you choose, while our own connection is working — and when a check from inside your account can't reach it either: the warm standby's, or, without one, a small probe machine's, started beside the server for the outage and removed afterwards — moves its reserved IP (a floating IP on Hetzner, an Elastic IP on AWS EC2, a static public IP on Azure, a static external IP on Google Compute Engine, the server's own IP on Linode) to the recovery server — or, with your DNS on Cloudflare, points the records you chose at it, on any of those clouds — after telling you and waiting if you ask it to. Failover moves your traffic to data as old as the last backup, never switches back on its own, and is off again until you re-arm it.

Recovery servers are on the Standard, Pro and Agency plans; the warm standby and automatic failover on Pro and Agency. They need a DigitalOcean, Hetzner, Vultr, Linode, AWS EC2, AWS Lightsail, Azure or Google Compute Engine connection, and failover needs a way to move traffic: the IP your domain points at being one that can move (a reserved, floating, Elastic, static public or static external IP, or on Linode the server's own), or your domain's DNS on a connected Cloudflare account, which works on every one of them. On AWS Lightsail, where no IP moves, automatic failover moves traffic by your DNS on Cloudflare.

Can you back up my DNS?

Yes, for domains on Cloudflare. Connect your Cloudflare account and make a DNS zone backup job for a domain. On its schedule, every record in the zone is stored in your own storage, with the zone as a BIND file that Cloudflare or any other DNS host can import, so the backup is useful without us.

To restore, preview it first: it lists every record that differs from the zone now — changed, deleted, or added since — and changes nothing. The restore writes back only those records, after taking a safety copy of the zone, and if Cloudflare refuses a change partway, what was written is undone from that copy. Records added since the backup are kept unless you choose to remove them too. A zone has no server of yours to run anything on, so our worker reads it through Cloudflare's API and writes it straight on to your storage, in memory only, never keeping it.

More on DNS backups

Can you tell me when my site goes down?

Yes, on the paid plans. Add uptime monitors for your web pages (by the status code, and a word that should or shouldn't be on the page), for ports such as a database or SSH, and for scheduled jobs, which call a URL of their own when they finish. A failure is checked again twice, 20 seconds apart, and only the third in a row is an outage, after we've made sure the fault isn't ours. Then one alert goes to your email or the Slack, Teams, Google Chat, Discord or webhook destinations your backup alerts use, and another when it's back.

A monitor linked to a server puts that server's newest backup in its alert, with Recover now beside it when the server has a recovery plan, and a link to rebuild it on another provider. Every monitored https page is also warned about 14 and 3 days before its certificate expires. Starter checks 10 monitors every 5 minutes; Standard, Pro and Agency check 30, 100 and 300 every minute. Checks come from New York, at 165.227.255.101, and there are no text messages or phone calls yet.

More on uptime monitoring

Can I give my customers a status page?

Yes, on the paid plans. A status page lists the monitors you choose under names you choose, at status.vpssnaps.com/your-name, with each one's state and 90 days of uptime, its outages, and the updates and planned-work notices you post. It never shows your addresses, ports or error messages, and carries no analytics or advertising scripts of ours. Starter has one page, Standard three, Pro ten and Agency fifty; on Agency a page can also be on your own domain, such as status.yourcompany.com, with one CNAME record, and without "Powered by VPS Snaps".

Setting up a status page

How do I know a backup would actually restore?

Turn on test restores for the job. On the schedule you choose, we create a throwaway server on your own DigitalOcean, Hetzner, Vultr, Linode, AWS EC2, AWS Lightsail, Azure or Google Compute Engine account, restore the newest backup onto it through the same pipeline a real restore uses, check that the data arrived — the tables or collections in a database created empty, the files under the job's own paths or inside its Docker volumes — and destroy the server. A test that fails alerts you: a backup that completed, looked healthy, and does not restore.

It covers file and Docker volume backups and PostgreSQL, MySQL, MariaDB and MongoDB, it needs a DigitalOcean, Hetzner, Vultr, Linode, AWS EC2, AWS Lightsail, Azure or Google Compute Engine connection (a Railway or Render database is tested inside your own project or workspace instead), and the server is billed to your account for the few minutes it exists. If the test itself can't run — your connection has lapsed, say — that isn't reported as a failed restore. We retry within hours, and if it still can't run after three tries we tell you the backup hasn't been tested, and why.

Separately, every backup is checked as it uploads: the archive must decompress, a tar archive's headers must be intact, a database dump must reach its completion marker, and the object is read back from your bucket to confirm its size — and, where the upload allows it, its checksum. What none of that proves is that your application runs on the restored data: we count what came back, we don't start your app. A backup you have never restored is a hypothesis.

What happens to my backups if I stop paying?

Nothing happens to them, because they were never ours. Provider snapshots sit in your provider account; archives sit in your bucket. Cancelling stops us scheduling new runs and takes away the dashboard. Everything already written stays exactly where it is, in a format you can open without us.

Storage and retention

Bring your own bucket. That decision shapes the answers below — including one that costs us a feature we would otherwise advertise.

Where does my backup data actually end up?

In the bucket you connected, in the region you chose, under a key of <your prefix>/<job id>/<filename>. Provider snapshots do not move at all — they are created through the provider's API and stay in your account. What we hold is metadata: job configuration, run status, timestamps, byte sizes, checksums, and log lines.

Which storage providers work?

Anything S3-compatible. Amazon S3, Cloudflare R2, Backblaze B2, DigitalOcean Spaces, Wasabi, and UpCloud Object Storage are selectable by name; anything else works by entering a custom endpoint URL. Non-AWS endpoints are addressed path-style automatically, which is the detail that usually breaks S3 clients pointed at R2 or MinIO. Google Drive works too: sign in with Google, and backups go to a folder in your own Drive. So does Box: sign in with Box, and backups go to a folder in your own Box account. And Dropbox or OneDrive (personal or work): sign in with Dropbox or Microsoft, and backups go to a folder in VPS Snaps' own app folder there.

What can VPS Snaps see in my Google Drive?

Only the files it creates. It asks Google for drive.file access, which covers the backup folder it makes and the backups in it, and nothing else in your Drive. Your servers, agents and WordPress sites upload straight to your Drive through a link that can write one file; a restore downloads with a token that lasts under an hour. Backups count against your Google storage, and Google limits uploads to 750 GB a day per account. You can revoke access at any time from your Google Account's permissions page.

What can VPS Snaps do in my Box account?

Box has no narrower permission for an app like Google Drive's, so signing in grants read and write access to all your files and folders. VPS Snaps keeps to the folder it makes for the destination. A server, agent, WordPress site or dump container uploading a backup gets a token Box limits to that job's folder, valid for about an hour; downloads use Box's own download link, which lasts about 15 minutes, never a token. Box takes each backup as one finished file, so whatever makes it needs free disk about the size of the backup, and your Box plan sets the largest file: 250 MB on a free account, more on paid plans. Deleting the destination in VPS Snaps deletes the stored tokens and revokes the grant at Box.

What can VPS Snaps do in my Dropbox?

Only work in its own app folder. VPS Snaps has App folder access, so it can see and write only its own folder inside the Apps folder of your Dropbox, never the rest of it; backups go to a folder you name inside that. A server, agent, WordPress site or dump container uploading a backup gets the destination's own access token, which reaches only that app folder and lasts at most 4 hours, or, for a file up to 150 MB from an agent or site, a one-time upload link with no token. Downloads use Dropbox's temporary link, which lasts 4 hours, never a token.

Dropbox takes backups as they upload, so no spare disk is needed, and it accepts files up to about 2 TB; your Dropbox space is the limit. Retention deletes old backups, and Dropbox's own deleted-files history applies. Deleting the destination in VPS Snaps deletes the stored tokens and revokes the grant at Dropbox.

What can VPS Snaps do in my OneDrive?

Only work in its own app folder. VPS Snaps has app folder access, so it can see and write only Apps/VPS Snaps in your OneDrive, never the rest of it; backups go to a folder you name inside that. It works with a personal Microsoft account or a work or school one, though some organisations need their Microsoft 365 administrator to approve the app first. A server, agent, WordPress site or dump container uploading a backup gets an upload session for that one file, never a Microsoft token, and restores use OneDrive's own short-lived download link.

OneDrive takes each backup as one finished file, so whatever makes it needs free disk about the size of the backup, and a single file can be up to 250 GB; your OneDrive space is the limit. Deleting the destination in VPS Snaps deletes the stored tokens; Microsoft gives apps no way to withdraw a sign-in themselves, so the page links you to where you remove VPS Snaps from your account.

Can one bucket serve every job?

Yes. Each storage destination can carry its own prefix if you want the separation, and every job writes beneath its own job ID inside that. Plans cap how many storage destinations you can register, not how many jobs point at one: Free and Starter allow one destination, Standard three, Pro ten, and Agency effectively unlimited.

How do retention rules work — and what do they not touch?

Retention is a per-job window measured in days, capped by your plan. Anything older is deleted: provider snapshots, Linode images, EC2 AMIs and Kubernetes VolumeSnapshots through the provider's own API, and database dumps and archives out of your bucket. It runs after each successful backup and once a day for every job, so a paused job stops accumulating too. What it will not delete: a job's newest backup, however old — retention prunes history, it never leaves you with nothing — anything a restore is reading, and the safety copy of a restore that didn't succeed. And it deletes only what we wrote: each object by the exact key we recorded when we uploaded it, never by listing your bucket or clearing a prefix. The run record stays, so you can still see that a backup was taken and what it hashed to after its archive has gone.

So my storage bill grows forever?

No. Retention expires archives older than the job's window out of your bucket, so storage levels off at roughly one window's worth of backups per job. A bucket lifecycle rule still works alongside it if you want a hard ceiling of your own — set it longer than your longest retention window, or it will delete backups retention was keeping.

Do you charge for storage?

No. There is no storage add-on, no included-gigabytes allowance, and no per-GB metering from us. You pay your storage provider directly at their rate, and you can walk away with the data at any time precisely because it is kept in your storage, never ours.

Security and privacy

Including the honest version of "do you see my data", which is not a flat no.

Do you see my data?

For provider snapshots and Agent jobs, no: the snapshot is created inside your provider account, and the Agent uploads to your bucket itself. SSH database, Docker, and file jobs don't either: your server uploads the dump or archive straight to your bucket with short-lived links we sign for it, and only sizes and checksums come back to us. A server that can't — no curl, say, or a bucket that refuses it — has that run streamed through our worker instead, held in memory and never retained, and the run's log says so.

Render databases are dumped by a job in your own Render workspace, and Railway ones in a short-lived service in your own Railway project when Railway is connected with admin access, each uploading from there. Without admin access, or when the platform will not run it, the Railway or Render dump runs on our worker and its log says so. Restores and test restores are downloaded by the server being restored, straight from your storage — for a Railway or Render database, by a job in your own project or workspace — and "Verify now" has your server download and check the backup, or asks your storage whether it is unchanged without downloading it. We would rather state that than imply an air gap that is not there.

How are my credentials stored?

Provider API tokens, SSH private keys, database passwords, storage access keys, and TOTP secrets are encrypted with AES-256-GCM before they reach the database — each with its own random 96-bit IV and an authentication tag. They are decrypted only inside a running job. Nothing is written to logs, and nothing is displayed back to you after the first save.

What SSH access do you need?

A host, a port, a username, and either a private key or a password. The account needs to be able to run whatever that job runs — pg_dump, mysqldump, mongodump, tar, or docker — and read the paths you pointed it at. There is no requirement for root, and no requirement for us to be able to reach anything other than that one host on that one port.

My server is behind NAT, a VPN, or a private VPC. Can you still back it up?

Yes, with the Agent. Instead of us dialling in, you run a small Docker container on the machine and it opens an outbound WebSocket to us and waits for instructions. No inbound port, no public IP, no firewall exception. The Agent runs Database, Docker, and File jobs — not provider snapshots or Kubernetes — and uploads straight from your machine to your bucket, so the data never transits our infrastructure at all.

Do you support two-factor authentication?

Yes. TOTP from any authenticator app, with single-use backup codes for recovery. The TOTP secret is stored encrypted and the backup codes are stored as bcrypt hashes.

Can I lock down the storage key I give you?

You should, and the help centre has the policy. It grants seven actions on one bucket and nothing else: s3:PutObject, s3:GetObject, s3:DeleteObject, s3:ListBucket, s3:ListBucketMultipartUploads, s3:AbortMultipartUpload and s3:GetBucketObjectLockConfiguration. The last one only reads whether the bucket has Object Lock turned on, so the dashboard can show how long your backups are locked.

DeleteObject is what lets retention expire old archives, what lets the "test connection" check remove the small probe object it writes, and what removes a partial copy a failed backup left, a day later and only once a later backup of that job has succeeded. Every delete is of an object we wrote, by the exact key we recorded — never a listing, never a prefix.

The two multipart actions clean up after an upload that was cut off, which S3 otherwise keeps, billed and hidden from the bucket's file list. Cancelling one removes only its unfinished parts, never a finished backup. We look for them at the keys our own uploads recorded, and in each job's own folder for uploads started more than a day ago. Leave those two out and backups work the same; interrupted uploads just are not cleaned up.

Is there anything in your security model you'd flag?

One thing: the first connection to a server is taken on trust. Its SSH host key is pinned then, the way ssh records it in known_hosts, and every later connection must present the same key or it stops before any password is sent or command run, until an owner accepts the new key on the server's page. What we cannot know is whether the key we saw the first time was the right one. If that matters to you, compare the fingerprint on the server's page with what ssh-keygen -lf prints for the server's own host key.

Plans and billing

Every ceiling the app enforces, read straight out of the plan records. If a number changes, this table changes with it.

PlanServersJobsStorage destinationsFastest scheduleRetention
Free111Daily1 day
Starter531Daily3 days
Standard15203Every 12 hours14 days
Pro405010Every 5 minutes30 days
Agency150250UnlimitedEvery 5 minutes90 days

Database and Docker jobs unlock on Standard; team seats on Pro; custom webhook URLs on Agency. The pricing page carries prices and the full feature matrix.

What happens when I hit a plan limit?

The next thing you try to create is refused with the exact numbers — "Plan limit reached: 3/3 backup jobs" — and everything already configured keeps running on schedule. Nothing is deleted, nothing is paused, and no backup is skipped because you are sitting at the ceiling.

What happens if my card fails?

Access continues while Stripe retries. A declined card — usually an expired one — should not cost you your backups on day one. If dunning is exhausted and the subscription lands in unpaid or cancelled, paid features switch off. Your snapshots and archives are unaffected either way; they are not stored by us.

What happens to my jobs if I cancel?

Your plan runs to the end of the period you already paid for, then paid features switch off. You can cancel from the billing page at any time — there is no contract and no cancellation step that requires talking to anyone.

Can I get a refund?

Within 14 days of your first payment, yes — email [email protected] and we refund it in full. After 14 days, subscriptions are non-refundable, and cancelling mid-period keeps your access until that period ends. Upgrades take effect immediately and are prorated against the days remaining; downgrades take effect at the start of the next period.

Is the free plan a trial in disguise?

No. It never asks for a card, there is nothing to cancel, and it doesn't expire while you use it. A free account with no sign-in and no successful backup for 60 days is deleted, after we email you at 14, 30 and 45 days; signing in or a successful backup at any point keeps it. Paid accounts are never deleted for inactivity. Paid plans do not have a trial either — the 14-day money-back guarantee stands in for one, which we think is the more honest shape.

Can I have more than one free account?

No: the free plan is one account per person or organisation. A second free account can't add a server, cloud account, storage account or site that another free account already uses. If you need more than Free allows, upgrade: every paid plan has room for more servers, jobs and destinations, and paid accounts are never refused for this.

How do I delete my account?

In the dashboard, under Settings → Delete account: type your email address and your password to confirm. A paid plan has to be cancelled under Billing first. Your account, workspace, servers' settings, jobs and history are deleted from VPS Snaps, and the sign-ins you gave us are revoked where the provider allows it. Backups already in your own storage, and anything on your servers and cloud accounts, are not touched; they stay yours.

Read the awkward answers. Now go break something safely.

Connect one server, point a job at your own bucket, and watch a run finish end to end on the free plan before you decide anything.

Your credentials are encrypted with AES-256-GCM, your backups never live on our storage, and our GDPR data processing agreement is public.

No credit card required. Cancel anytime.