{"id":18982,"date":"2026-03-26T09:36:33","date_gmt":"2026-03-26T09:36:33","guid":{"rendered":"https:\/\/www.20i.com\/blog\/?p=18982"},"modified":"2026-03-26T09:36:35","modified_gmt":"2026-03-26T09:36:35","slug":"how-to-migrate-a-woocommerce-website","status":"publish","type":"post","link":"https:\/\/www.20i.com\/blog\/how-to-migrate-a-woocommerce-website\/","title":{"rendered":"How to Migrate a WooCommerce Website"},"content":{"rendered":"\n<p>Migrating&nbsp;a&nbsp;WooCommerce&nbsp;website can be a daunting task.&nbsp;You want to ensure minimal disruption&nbsp;and prevent loss of new orders during&nbsp;the migration.&nbsp;&nbsp;<\/p>\n\n\n\n<p>WooCommerce stores are dynamic, with customers potentially placing orders at any moment.&nbsp;&nbsp;<\/p>\n\n\n\n<p>That\u2019s&nbsp;why a careful, staged approach is essential.&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 1: Migrate a Copy of Your Website<\/strong>&nbsp;<\/h3>\n\n\n\n<p>By&nbsp;migrating a working copy of the site, you create a safe environment to test functionality without affecting live customers.&nbsp;<\/p>\n\n\n\n<p>With 20i, you can&nbsp;easily migrate&nbsp;WooCommerce&nbsp;websites&nbsp;using our automated&nbsp;<a href=\"https:\/\/docs.20i.com\/ftp\/migrate-site-ftp\">WordPress migration tool<\/a><a href=\"https:\/\/docs.20i.com\/ftp\/migrate-site-ftp\" target=\"_blank\" rel=\"noreferrer noopener\">,<\/a>&nbsp;which securely copies your website files and database directly to your hosting plan, with no downtime.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">\u00a0<strong>Step 2: Test the Website\u00a0and\u00a0Common\u00a0<\/strong><br>Issues<\/h3>\n\n\n\n<p>You can check the website using the&nbsp;<a href=\"https:\/\/docs.20i.com\/web-hosting\/temporary-urls\" target=\"_blank\" rel=\"noreferrer noopener\">temporary URL<\/a>&nbsp;to be sure&nbsp;it is&nbsp;all&nbsp;working before&nbsp;proceeding&nbsp;to the next migration steps.&nbsp;Before going live, test the migrated site thoroughly:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Browse the store and product pages&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Complete a test checkout&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Verify plugin functionality&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check payment gateway settings&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Review theme styling and layout&nbsp;<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Possible&nbsp;Issues&nbsp;After&nbsp;Migration<\/strong><\/h3>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Subpages&nbsp;Return&nbsp;404&nbsp;Errors<\/strong>&nbsp;<\/h4>\n\n\n\n<p>After migration, WordPress sometimes&nbsp;doesn\u2019t&nbsp;refresh its URL&nbsp;rewrite&nbsp;rules. To fix&nbsp;this:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Go to&nbsp;WordPress Dashboard &gt; Settings &gt; Permalinks&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Click&nbsp;Save Changes&nbsp;(no need to&nbsp;modify&nbsp;anything)&nbsp;<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Missing or Corrupted Images<\/strong>&nbsp;<\/h4>\n\n\n\n<p>Product or media library images might not display correctly.&nbsp;Things to check:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm&nbsp;\/wp-content\/uploads\/&nbsp;has&nbsp;transferred fully&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Ensure file permissions are&nbsp;set correctly. We have&nbsp;a&nbsp;<a href=\"https:\/\/docs.20i.com\/web-hosting\/file-permissions-checker\" target=\"_blank\" rel=\"noreferrer noopener\">file permission checker tool<\/a>&nbsp;available in My20i&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Folders:&nbsp;755&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Files:&nbsp;644&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Ensure the full, correct file path&nbsp;to the image folder or individual image files. You can use the inspect element tool in your browser to check this&nbsp;by right clicking on the image in the browser &gt; inspect. This will open the element&nbsp;tool,&nbsp;and you should see the file path to the image.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;img decoding=\"async\" src=\"https:\/\/20i-demo.com\/wp-content\/uploads\/2022\/04\/WordPresss.png\" title=\"WordPresss\" alt=\"WordPresss\" loading=\"lazy\"&gt; <\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>Theme or Plugin Conflicts<\/strong>&nbsp;<\/h4>\n\n\n\n<p>The&nbsp;new&nbsp;hosting&nbsp;environment&nbsp;may use a different PHP version&nbsp;or&nbsp;different memory limits&nbsp;(for example,&nbsp;at&nbsp;20i&nbsp;we&nbsp;set the memory limit to&nbsp;128MB by default, which can be increased up to 2048MB).&nbsp;<\/p>\n\n\n\n<p>If you see any errors,&nbsp;take the following steps:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check PHP version matches&nbsp;the&nbsp;previous&nbsp;host (or use a recommended version like 8.1+ for WooCommerce).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.20i.com\/blog\/wordpress-memory-limit\/\" target=\"_blank\" rel=\"noreferrer noopener\">Increase PHP memory limit<\/a>&nbsp;(we support up to 2048MB on our Reseller and Managed&nbsp;Cloud&nbsp;hosting&nbsp;plans).&nbsp;<\/li>\n\n\n\n<li>Temporarily disable plugins one by one to&nbsp;identify&nbsp;conflicts.&nbsp;You can do this using the&nbsp;<a href=\"https:\/\/docs.20i.com\/wordpress-support\/wordpress-tools\" target=\"_blank\" rel=\"noreferrer noopener\">WordPress Toolset<\/a>&nbsp;if&nbsp;you\u2019re&nbsp;using our WordPress&nbsp;optimised&nbsp;hosting.&nbsp;(You can also do this with&nbsp;<a href=\"https:\/\/www.20i.com\/blog\/get-started-wpcli\/#:~:text=theme%20deactivate%20%3Ctheme%3E-,Plugin%20commands,-In%20the%20same\" target=\"_blank\" rel=\"noreferrer noopener\">WP-Cli<\/a>)&nbsp;<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\"><strong>SSL\/Mixed Content Warnings<\/strong>&nbsp;<\/h4>\n\n\n\n<p>HTTP elements on HTTPS pages can break layout or cause browser warnings.&nbsp;You may find that&nbsp;Some URLs are still loading via HTTP instead of HTTPS.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If&nbsp;you\u2019re&nbsp;using the WordPress&nbsp;Optimised&nbsp;Managed Cloud Server, Managed Hosting or <a href=\"https:\/\/www.20i.com\/reseller-hosting\" data-internallinksmanager029f6b8e52c=\"2\" title=\"reseller hosting\" target=\"_blank\" rel=\"noopener\">Reseller hosting<\/a> you can use the&nbsp;<a href=\"https:\/\/docs.20i.com\/wordpress-support\/search-replace-wordpress-tools\" target=\"_blank\" rel=\"noreferrer noopener\">Search and Replace tool<\/a>&nbsp;which&nbsp;is&nbsp;found in the WordPress toolset.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>If&nbsp;you\u2019re&nbsp;comfortable using SSH, you can run a search and replace using WP-Cli&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code>wp search-replace 'http:\/\/yourdomain.com' 'https:\/\/yourdomain.com' --skip-columns=guid <\/code><\/pre>\n\n\n\n<p><strong>Broken Payment or Shipping Gateways<\/strong>&nbsp;<\/p>\n\n\n\n<p>API credentials might not be valid in the&nbsp;new&nbsp;environment,&nbsp;or sandbox\/live keys mixed up.&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Re-enter API credentials manually (don\u2019t&nbsp;assume they copied correctly).&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Confirm you are using&nbsp;Live keys, not&nbsp;sandbox.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Update webhook URLs to the new domain.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Check&nbsp;firewall&nbsp;isn\u2019t&nbsp;blocking outgoing API calls.<\/li>\n<\/ul>\n\n\n\n<p>If&nbsp;you&nbsp;encounter&nbsp;any issues,&nbsp;our support team&nbsp;are available 24\/7 over ticket and live chat.&nbsp;&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 3: Perform Final Sync Before Going Live<\/strong><\/h3>\n\n\n\n<p>Once&nbsp;you&#8217;re&nbsp;happy with how the site works,&nbsp;it&#8217;s&nbsp;time to prepare for launch.&nbsp;The following steps will ensure&nbsp;that any new orders that have been made&nbsp;or user account changes etc,&nbsp;whilst your website is live with the&nbsp;previous&nbsp;host, are imported to the hosting here.&nbsp;&nbsp;&nbsp;<\/p>\n\n\n\n<p>We\u2019d&nbsp;recommend&nbsp;doing&nbsp;this part&nbsp;during a&nbsp;quiet&nbsp;time for your website.&nbsp;<\/p>\n\n\n\n<ol start=\"1\" class=\"wp-block-list\">\n<li>Place the old website in maintenance mode&nbsp;or temporarily deactivate it to prevent any new orders or data from being missed during the final database copy.&nbsp;You can use a plugin such as&nbsp;<a href=\"https:\/\/en-gb.wordpress.org\/plugins\/maintenance\/\" target=\"_blank\" rel=\"noreferrer noopener\">\u2018Maintenance\u2019<\/a>&nbsp;.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>Export a fresh copy of the&nbsp;live database.&nbsp;You may need to contact your hosting provider for a copy if you do not have access.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>Import the&nbsp;latest database into your new hosting environment to ensure all recent orders, customer accounts, and changes are included.&nbsp;You can import the database using&nbsp;<a href=\"https:\/\/docs.20i.com\/databases\/import-sql-file\" target=\"_blank\" rel=\"noreferrer noopener\">phpMyadmin<\/a>. However, if the file is too large, you may need to import using the command line via SSH or WP-CLI.&nbsp;&nbsp;<\/li>\n<\/ol>\n\n\n\n<p>To import using SSH, you will need to upload the backup .sql&nbsp;file to the&nbsp;webspace, using the&nbsp;<a href=\"https:\/\/docs.20i.com\/managed-cloud-servers\/complete-guide-to-the-20i-file-manager\" target=\"_blank\" rel=\"noreferrer noopener\">file manager<\/a>&nbsp;or&nbsp;<a href=\"https:\/\/docs.20i.com\/ftp\/connect-ftp\" target=\"_blank\" rel=\"noreferrer noopener\">FTP<\/a>&nbsp;and you can import using the following command.&nbsp;&nbsp;You will also be asked for the database password.&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>mysql -u username -p database_name &lt; backup.sql  <\/code><\/pre>\n\n\n\n<p>&nbsp;&nbsp;&nbsp;&nbsp;<br>If your hosting provider supports WP-CLI, you can import using the following&nbsp; command&nbsp;<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>wp db import backup.sql<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Step 4: Prepare DNS&nbsp;and&nbsp;SSL<\/strong><\/h3>\n\n\n\n<p>If&nbsp;you&#8217;re&nbsp;using&nbsp;our nameservers, we recommend:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Pre-setting DNS records (A, AAAA, MX, etc.) within your control panel to match your existing provider.&nbsp;We recommend&nbsp;using&nbsp;our&nbsp;<a href=\"https:\/\/docs.20i.com\/web-hosting\/import-dns-zone-file\" target=\"_blank\" rel=\"noreferrer noopener\">DNS import tool<\/a>&nbsp;if you have a lot of records.&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Once DNS settings are ready,<strong>&nbsp;<\/strong>switch the domain\u2019s nameservers to ours&nbsp;and&nbsp;<a href=\"https:\/\/docs.20i.com\/reseller-hosting\/activate-free-ssl\" target=\"_blank\" rel=\"noreferrer noopener\">install&nbsp;our&nbsp;Free SSL<\/a>&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<ul class=\"wp-block-list\">\n<li>When the Free SSL has installed, you can update the A\/AAAA records to point to the hosting here.&nbsp;You can select the&nbsp;option&nbsp;\u2018Reset to default\u2019 in the DNS management area if all your&nbsp;hosting services are with us. If not, you can find the&nbsp;<a href=\"https:\/\/docs.20i.com\/web-hosting\/ip-address-hosting-package\" target=\"_blank\" rel=\"noreferrer noopener\">IP&nbsp;address&nbsp;information<\/a>&nbsp;in your hosting control panel&nbsp;&nbsp;<\/li>\n<\/ul>\n\n\n\n<p>Since the SSL certificate is already installed, your site will remain secure and free from SSL errors after DNS propagation.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Conclusion<\/strong>&nbsp;<\/h3>\n\n\n\n<p>To conclude, migrating a WooCommerce website using a staged approach significantly reduces risk and protects your orders, customer\u00a0data\u00a0and revenue.\u00a0\u00a0<\/p>\n\n\n\n<p>By first creating a copy of the live site in a staging environment, you can test functionality, payment gateways, and plugins without affecting customers.\u00a0\u00a0<\/p>\n\n\n\n<p>This helps&nbsp;identify&nbsp;and resolve issues before they&nbsp;impact&nbsp;sales.&nbsp;A staged migration also ensures orders&nbsp;aren\u2019t&nbsp;missed or duplicated and allows you to plan the final DNS switch carefully, minimising downtime and disruption.&nbsp;<\/p>\n\n\n<div class='code-block code-block-4' style='margin: 8px 0; clear: both;'>\n<hr>\n<br \/><a href=\"https:\/\/www.20i.com\/wordpress-hosting\" target=\"_blank\"><img decoding=\"async\" src=\"https:\/\/www.20i.com\/blog\/wp-content\/uploads\/2026\/03\/Blog-Ad-WordPress-1200x625-1.png\" loading=\"lazy\" alt=\"Managed WordPress Hosting\"><\/a><\/div>\n\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"Migrating&nbsp;a&nbsp;WooCommerce&nbsp;website can be a daunting task.&nbsp;You want to ensure minimal disruption&nbsp;and prevent loss of new orders during&nbsp;the migration.&nbsp;&nbsp;&hellip;","protected":false},"author":25,"featured_media":18988,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"ub_ctt_via":"","_monsterinsights_skip_tracking":false,"_monsterinsights_sitenote_active":false,"_monsterinsights_sitenote_note":"","_monsterinsights_sitenote_category":0,"csco_singular_sidebar":"","csco_page_header_type":"","csco_page_load_nextpost":"","footnotes":""},"categories":[51,60,47,293],"tags":[],"class_list":{"0":"post-18982","1":"post","2":"type-post","3":"status-publish","4":"format-standard","5":"has-post-thumbnail","7":"category-technology","8":"category-web-design-dev","9":"category-web-hosting","10":"category-wordpress","11":"cs-entry"},"featured_image_src":"https:\/\/www.20i.com\/blog\/wp-content\/uploads\/2026\/03\/woocommerce-no-title.png","author_info":{"display_name":"Ben Perry","author_link":"https:\/\/www.20i.com\/blog\/author\/benperry92\/"},"_links":{"self":[{"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/posts\/18982","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/users\/25"}],"replies":[{"embeddable":true,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/comments?post=18982"}],"version-history":[{"count":4,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/posts\/18982\/revisions"}],"predecessor-version":[{"id":18993,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/posts\/18982\/revisions\/18993"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/media\/18988"}],"wp:attachment":[{"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/media?parent=18982"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/categories?post=18982"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.20i.com\/blog\/wp-json\/wp\/v2\/tags?post=18982"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}