Development

WooCommerce Settings Backup: What Most Backup Plugins Miss

WooCommerce settings stored across multiple database tables with export to CSV or JSON file for migration and backup

If you ask UpdraftPlus, BlogVault, or Jetpack VaultPress whether they back up your WooCommerce settings, the honest answer is “yes, technically.” Settings live in the database, the database gets backed up, case closed.

Back up the layer every backup plugin misses. SnapSettings exports your WooCommerce configuration — shipping zones, tax rates, core options — to one file and restores it without touching orders or products.

View SnapSettings →

The problem starts the moment you actually need those settings back without bringing the rest of the database with them — pushing tax rates from staging to production, cloning a store template across a multisite agency, or recovering after a contractor wiped your shipping zones. That’s where general backup plugins quietly fall short, and the gap is bigger than most store owners realize.

This post is for developers and store operators who already use a backup plugin and want to know what it actually does — and doesn’t do — with WooCommerce configuration data.

Settings are not one table — they are scattered across at least seven

There is no wp_woocommerce_settings table. WooCommerce configuration is spread across wp_options and a handful of dedicated tables, each with its own primary keys and foreign-key relationships:

What you configured in WooCommerce → Settings Where it actually lives
Currency, store address, weight units, “selling location(s)” wp_options (rows like woocommerce_currency, woocommerce_store_address)
Payment gateway enabled/disabled, ordering, titles wp_options (woocommerce_gateway_order, plus per-gateway option keys)
Email recipient and HTML/plain settings wp_options (woocommerce_new_order_settings, etc.)
Tax rates and tax rate locations wp_woocommerce_tax_rates, wp_woocommerce_tax_rate_locations
Shipping zones, methods, and locations wp_woocommerce_shipping_zones, wp_woocommerce_shipping_zone_methods, wp_woocommerce_shipping_zone_locations
API keys and webhook endpoints wp_woocommerce_api_keys, wp_woocommerce_webhooks
Product attributes (the global ones, not per-product) wp_woocommerce_attribute_taxonomies

A “full database backup” captures all of this. But none of those tables exist in isolation — shipping methods reference zones by zone_id, tax rate locations reference rates by tax_rate_id, and gateway settings reference page IDs from wp_posts. Pull just one of those tables out and you’re holding pointers into the void.

That’s why every selective-restore tutorial you’ve ever read for these plugins says the same thing: don’t try to restore individual tables.

What “back up the whole database” actually means for an active store

The recommended advice from WooCommerce, Jetpack, and most hosting providers is to take a full database snapshot and restore the whole thing if something goes wrong. That works when you’re recovering from a hack or a corrupted upgrade.

It does not work for any of these scenarios:

  • You changed tax rates on staging and want to push them live without overwriting the orders that customers placed during the day.
  • You cloned a store last month as a template, configured the new client’s shipping, and now you want to push your fresh template settings back to old clones without touching their products.
  • A staff member deleted half your shipping zones at 2pm and you’ve taken 40 orders since the morning’s backup.
  • You want a settings-only baseline in version control so a junior dev can spin up a dev environment without 200MB of order history.

In all four cases, the “restore the database” answer either destroys live data, drags in data you don’t want, or simply isn’t precise enough to be safe.

The serialized-data problem

WordPress stores complex options as PHP-serialized strings — strings that include byte-length prefixes for every value. When you migrate a database between environments, any text that contains the old domain has to be replaced and re-serialized with corrected lengths, or the option silently goes unreadable and PHP unserialize() drops it.

UpdraftPlus, Duplicator, and most migration tools handle the obvious cases (the siteurl and home options) with a built-in search-and-replace engine. The cases they tend to miss:

  • Plugin settings that store full URLs to images or webhooks in nested arrays. CCBill webhook callbacks, custom payment gateway “thank you” URLs, MailPoet sender domains.
  • Stripe / payment gateway secrets that include the site domain as part of a webhook ID. After a careless migration, payments still go through but webhooks silently fail and subscriptions stop renewing.
  • Customizer settings stored as serialized arrays under theme_mods_<theme-slug> that include URLs to header images and logos.

The fix isn’t “use a better search-and-replace” — the fix is treating settings as a separate concern from the database dump, exporting them in a format that doesn’t depend on serialization (CSV or JSON), and re-importing them with code that reads the current site’s URL at write time.

What about HPOS?

High-Performance Order Storage (the default for new WooCommerce installs since 8.2) doesn’t change the settings story — it changes the orders story. Orders moved out of wp_postmeta and into custom tables (wp_wc_orders, wp_wc_order_addresses, wp_wc_order_operational_data, wp_wc_orders_meta).

The relevant implication for backups: if you’re still running a backup plugin that snapshotted your store before HPOS migration and you restore that snapshot today, you’ll either get a database where orders live in the wrong place or a synchronization conflict that takes hours to untangle. Run wp wc hpos status after every restore to confirm the authoritative table is the one you expect.

For settings specifically, HPOS is irrelevant. Settings still live in wp_options and the WooCommerce-specific tables listed above.

What “good enough” actually looks like

A useful settings backup workflow has four properties general backup plugins don’t provide:

  1. Selective. It exports settings only — no orders, products, customers, or media. The result is small (kilobytes, not gigabytes) and safe to commit to a private repo.
  2. Portable across environments. It writes site URLs at restore time, not export time. You can take an export from staging.example.com and apply it to www.example.com without a sed pass.
  3. Atomic with rollback. If the import fails halfway through (a missing currency code, a shipping method that no longer exists), the whole thing reverts. You don’t end up with half-applied settings.
  4. Auditable. A log of what changed — old value vs new value, per option — so you can review before approving and trace surprises after the fact.

This is what SnapSettings for WooCommerce was built for. It exports shipping zones, tax rates, and core WooCommerce options as CSV, supports drag-and-drop re-import on the destination site, runs imports atomically with rollback on error, and writes a detailed import log. It deliberately does not touch products, orders, customers, or media — that’s still the job of your full backup plugin.

When you still need a full backup

Nothing in this post argues against keeping UpdraftPlus, BlogVault, Jetpack VaultPress, or whatever full-site backup tool you already trust. You absolutely need full database + files backups for hack recovery, host-level outages, and rolling back a bad plugin update. Real-time backup is genuinely worth the money for an active store — a 24-hour backup window will cost you a day of orders the one time you actually need to restore.

The argument is that a full backup tool is the wrong shape for settings work specifically — for migrations, environment promotion, agency template workflows, and surgical recovery. Pair a full backup plugin with a settings-only tool, and your runbook becomes much shorter.

Quick action checklist

  • Confirm what your current backup plugin actually saves. Run a test restore to a staging environment and check whether shipping zones, tax rates, and payment gateway configs survived.
  • Export your WooCommerce settings to a portable format (CSV/JSON) and store them outside the full backup. Treat them as code, not data.
  • After any database restore, run wp wc hpos status to confirm orders are reading from the expected table.
  • Document the few options that contain hardcoded URLs (webhook endpoints, gateway return URLs, theme mod images) so you have a checklist after every migration.

If your settings drift across environments more often than your orders do — and for most agency teams, they do — it’s worth treating settings as a first-class artifact instead of a side effect of a database dump.

→ SnapSettings for WooCommerce gives you a settings-only export/import pipeline with atomic rollback. It’s $29 once, and it pairs with whatever full-site backup plugin you already run.

Your configuration deserves its own backup. SnapSettings gives you one-click WooCommerce settings backups you can restore on any store, any time.

Get SnapSettings →


Want help applying this?

Tell us your workflow and we'll point you to the right plugin or next step.