Migrating a standard WooCommerce store to a new host is relatively simple. You copy the files, dump the database, update the DNS, and the site is live.
But if you are running WooCommerce Subscriptions, that standard process is dangerous. Because your WordPress server is acting as the billing engine, a poorly executed migration means you will have two servers running the same cronjobs simultaneously. The result? Your customers will be charged twice for their renewals.
As an agency that has migrated some of the largest WooCommerce subscription stores, we have developed a strict protocol to prevent duplicate charges and data corruption.
Here is the exact checklist you need to safely migrate a WooCommerce Subscriptions site to a new server — and why moving to a headless Stripe setup makes this process obsolete.
The Pre-Migration Checklist (Old Server)
Before you begin copying data, you must ensure that your current live site is prepared for the transition. The goal is to freeze the subscription state so that no renewals occur while the database is in transit.
1. Put the Live Site in Maintenance Mode
You cannot migrate a subscription site while customers are actively signing up or while renewals are processing. Activate a maintenance mode plugin on the live site. This stops new orders and prevents the Action Scheduler from processing scheduled renewals.
2. Check the Action Scheduler Queue
Go to WooCommerce > Status > Scheduled Actions. Verify that there are no renewals currently stuck in the "In Progress" state. If there are, wait for them to complete or fail before proceeding. You want a clean queue before you dump the database.
3. Pause WP-Cron (Optional but Recommended)
To be absolutely certain that no background tasks trigger during the database dump, define DISABLE_WP_CRON as true in your wp-config.php file on the old server.
4. Export the Database
With the site locked down and cron paused, you can now safely export your database. This snapshot represents the final, frozen state of your subscription business on the old server.
The Migration Checklist (New Server)
You have moved the files and imported the database to the new server. Before you point the DNS to the new host, you must secure the new environment.
1. Keep Maintenance Mode Active
The new site should boot up in maintenance mode (because it is an exact copy of the old site). Leave it that way.
2. Disable Emails on the New Server
If the new server accidentally triggers a scheduled action while you are testing, you do not want it sending renewal receipts to customers from a staging URL. Use a plugin like WP Mail SMTP to reroute or disable all outgoing emails.
3. Update Webhook Endpoints in Stripe
If your new server is on a temporary URL (e.g., staging.yourdomain.com), you must update your Stripe webhooks to point to the new URL. Without this, Stripe will send payment confirmations to the old server, and the new server will never know a payment succeeded.
4. Test a Manual Renewal
While still on the temporary URL, run a test transaction. Manually trigger a renewal from the Action Scheduler. Verify that the payment is captured in Stripe and that the subscription status updates correctly on the new server.
The Go-Live Checklist
The new server is tested and ready. Now you need to switch the traffic and ensure the old server does not wake up and start charging people.
1. Kill the Old Server
This is the most critical step. Before you update your DNS, you must ensure the old server can never process another cronjob. The safest way is to simply shut down the old server entirely. If you cannot shut it down, rename the wp-content/plugins/woocommerce-subscriptions folder so the plugin is deactivated.
2. Update DNS
Point your domain to the new server.
3. Re-enable WP-Cron and Emails on the New Server
Remove the DISABLE_WP_CRON rule from wp-config.php and disable your email rerouting plugin. The new server is now fully operational.
4. Update Webhooks (Again)
Log back into Stripe and update your webhook endpoints from the temporary staging URL back to your primary production domain.
5. Lift Maintenance Mode
Turn off maintenance mode. Your site is now live on the new server, and the Action Scheduler will begin processing any renewals that were delayed during the migration window.
The Stripe-Powered Alternative: Why Migrate at All?
The complexity of that checklist stems from one architectural flaw: WooCommerce Subscriptions forces your web server to act as a financial billing engine. If you have two servers, you have two billing engines, which leads to duplicate charges.
When you use Stripe Subscriptions for WooCommerce, server migrations become trivial.
Because our plugin uses a headless architecture, Stripe handles the billing engine. Your WordPress server does not process renewals and does not rely on WP-Cron.
If you need to migrate a site using Stripe Subscriptions for WooCommerce, the process is:
- Copy the files and database to the new server.
- Update the DNS.
That is it. You do not need to freeze cronjobs, you do not need to worry about duplicate charges, and you do not need to lock down the old server. Stripe simply continues billing your customers on its own infrastructure, and sends the webhooks to whichever server the DNS is pointing to.
Ready to decouple your billing engine from your web server?
-
Subscriptions made for WooCommerce
-
100% Headless subscription powered on Stripe
-
Hands down, the simplest subscriptions plugin available
-
Built for scaling businesses
-
Developer friendly
-
Zero cost renewal fee
-
Build a more resilient subscription business