Step-by-Step Guide WordPress + Static + Custom March 2026

How to Migrate Your Website to a New Host: Complete Step-by-Step Guide

Switching web hosts doesn't have to mean downtime or data loss. This guide covers WordPress, static sites, and custom PHP/database sites — plus email migration, which most guides completely ignore.

0
Target Downtime
10
Steps
2-4 hrs
Typical Duration

Affiliate Disclosure: This article contains affiliate links. If you purchase through our links, we may earn a commission at no extra cost to you. We only recommend products we've personally tested.

Why Trust This Guide
90-day hands-on testing
WordPress 6.4 + PHP 8.2
24/7 uptime monitoring
5 real plugins installed
Last tested: March 2026 · Prices verified monthly Our methodology →

Before You Start: Pre-Migration Checklist

Migrations fail for one reason: people skip the preparation. The actual file transfer takes minutes. Recovering from a botched migration without a proper backup takes days. Run through this checklist before you touch anything.

Hands-On Testing Disclosure

This guide is based on hands-on testing of 17+ hosting providers over 90-day cycles. I maintain active paid accounts on every host featured here, deploy real WordPress sites with production plugins, and monitor performance around the clock. Recommendations reflect actual test results, not marketing claims or affiliate incentives.

Pre-Flight Check
  • Take a full backup — files, database, and emails. Not just one of these. All three. Store the backup somewhere other than either host (your local computer or cloud storage).
  • Document your current DNS records — Screenshot your DNS zone file or export it. You need to know your current A record, MX records, CNAME records, and TXT records (SPF/DKIM). If something breaks, this lets you revert.
  • Note all email accounts and forwarders — Log into cPanel or your email admin and write down every email address, alias, and forwarder. These won't transfer automatically.
  • List installed software versions — Check your PHP version (php -v or cPanel > PHP Selector), MySQL version, WordPress version, and any custom modules. Your new host needs to support the same versions.
  • Verify new host compatibility — Does the new host support your PHP version? Your MySQL version? Does it have enough storage and bandwidth? Does it support the specific features you use (cron jobs, SSH access, specific PHP extensions)?
  • Keep old host active for at least 1 week — Do not cancel your old hosting before migration is fully confirmed. DNS propagation can take 24-48 hours, and you need a fallback if anything goes wrong.
Common mistake: People cancel their old hosting the same day they update DNS. DNS propagation means some visitors will still be directed to the old server for up to 48 hours. If that server is gone, those visitors see an error page. Always overlap both hosting accounts by at least one week.

Once you've checked every item on this list, you're ready to start. The entire migration process takes 2-4 hours of active work for a typical site. Large sites with extensive databases or email archives may take longer.

Step 1: Sign Up with Your New Host

If you haven't chosen a new host yet, prioritize one that offers free migration. A professional migration service eliminates the most error-prone parts of the process — file transfers, database imports, and configuration adjustments — and it costs you nothing.

Hosts with Free Professional Migration

HostPriceRenewalMigration Offer
SiteGround$4.99/mo$27.99/moFree migration via WordPress Migrator plugin + manual migration for non-WP sites
ChemiCloud$2.49/mo$11.95/moFree migration for up to 3 websites, handled by their team
FastComet$1.79/mo$8.95/moFree migration + free domain transfer, white-glove service
Hostinger$3.99/mo$12.99/moAutomated WordPress migration tool (Business plan and above)
Why SiteGround for migrations: SiteGround's migration plugin handles WordPress sites automatically. For non-WordPress sites, their support team performs the migration manually. Their GrowBig plan ($4.99/mo) is the sweet spot — it includes staging environments, which are perfect for testing your migrated site before going live. Read our full SiteGround review.

When signing up, choose a server location closest to your primary audience. If most of your visitors are in the US, pick a US data center. If they're in Europe, pick a European one. Server location affects page load time by 50-200ms, which matters for both user experience and SEO.

After signing up, note down your new hosting account's:

  • Server IP address (found in cPanel > Server Information or your welcome email)
  • FTP/SFTP credentials (usually in cPanel > FTP Accounts)
  • cPanel login URL and credentials
  • Nameservers (e.g., ns1.newhost.com and ns2.newhost.com)

You'll need all of these in the following steps.

Step 2: Backup Everything

This is the most important step. A complete backup means you can always restore your site to its current working state, no matter what goes wrong during migration. Back up using multiple methods — redundancy is your safety net.

Method A: cPanel Full Backup (Recommended First Step)

If your current host uses cPanel, this is the fastest way to get everything at once:

  1. Log into cPanel on your current host
  2. Go to Files > Backup (or Backup Wizard)
  3. Click "Download a Full Account Backup"
  4. Choose "Home Directory" as the backup destination
  5. Wait for the backup to generate (this can take 5-30 minutes depending on site size)
  6. Download the .tar.gz file to your local computer

This backup includes files, databases, email accounts, email forwarders, and cron jobs — everything in one archive.

Method B: WordPress Plugin Backup

If you're running WordPress, use a dedicated backup plugin for the cleanest restoration:

UpdraftPlus (Free):

  1. Install UpdraftPlus from the WordPress plugin directory
  2. Go to Settings > UpdraftPlus Backups
  3. Click "Backup Now" — check both "Include your database" and "Include your files"
  4. Download all five backup components: Database, Plugins, Themes, Uploads, Others

All-in-One WP Migration (Free up to 512MB):

  1. Install All-in-One WP Migration
  2. Go to All-in-One WP Migration > Export
  3. Select "Export to File"
  4. Download the .wpress file
Size limit: All-in-One WP Migration's free version only imports files up to 512MB. If your site is larger, you'll need the paid extension ($69 one-time) or use UpdraftPlus instead, which has no size limit on its free tier.

Method C: Manual Database Backup via phpMyAdmin

For custom PHP sites or as an additional safety measure:

  1. Open phpMyAdmin from cPanel
  2. Select your website's database from the left sidebar
  3. Click the "Export" tab
  4. Choose "Quick" export method and "SQL" format
  5. Click "Go" — this downloads a .sql file

For large databases, use "Custom" export and check "Add DROP TABLE" under Object creation options. This ensures a clean import without duplicate table errors.

Method D: FTP/SFTP File Download

Download your entire website's file structure:

  1. Open an FTP client (FileZilla is free and reliable)
  2. Connect to your current host using SFTP (port 22, not plain FTP on port 21)
  3. Navigate to /public_html/ (or your document root)
  4. Select all files and folders, then download to a local directory
# Estimated download times by site size:
# 500MB  = ~8 minutes  (on 10 Mbps connection)
# 1GB    = ~15 minutes
# 5GB    = ~70 minutes
# 10GB+  = Consider SSH + rsync instead

Method E: Email Backup via IMAP

This is the step most migration guides skip entirely. If you use email through your hosting (e.g., you@yourdomain.com via cPanel), your emails are stored on the server and will be lost if you don't back them up.

  1. Install Mozilla Thunderbird (free email client)
  2. Add your email account using IMAP settings from your current host
  3. Wait for Thunderbird to sync all folders and messages
  4. Right-click your account > Settings > ensure "Keep messages for this account on this computer" is checked
  5. All your emails are now stored locally as a backup
Pro tip: If you use Google Workspace, Microsoft 365, or Zoho Mail for email, your email is independent of your web host. You can skip email migration entirely — just keep your MX records pointed at your email provider.

Step 3: Create a Database on the New Host

If your site uses a database (WordPress, Joomla, Drupal, custom PHP with MySQL), you need to create an empty database on the new host before you can import your data.

Creating a MySQL Database in cPanel

  1. Log into cPanel on your new host
  2. Go to Databases > MySQL Databases
  3. Under "Create New Database," enter a name (e.g., mysite_wp) and click "Create Database"
  4. Under "MySQL Users," create a new user with a strong password
  5. Under "Add User To Database," select the user and database, then click "Add"
  6. On the privileges page, check "ALL PRIVILEGES" and click "Make Changes"
Write these down — you'll need them in Steps 5 and 6:
  • Database name: username_mysite_wp (cPanel prefixes your account username)
  • Database user: username_wpuser
  • Database password: (the password you just created)
  • Database host: localhost (almost always localhost on shared hosting)

For static HTML sites with no database, skip this step and Step 5 entirely.

Step 4: Upload Files to the New Host

Now transfer your website files from your backup to the new hosting account. Choose the method that matches your comfort level and site size.

Option A: FTP/SFTP Upload (Any Site Size)

  1. Open FileZilla (or your preferred FTP client)
  2. Connect to your new host using the SFTP credentials from your welcome email
  3. Navigate to the /public_html/ directory on the remote server
  4. On the local side, navigate to your backup folder
  5. Select all files and drag them to the remote panel
  6. Wait for the transfer to complete
# Estimated upload times (on 10 Mbps upload):
# 500MB  site = ~8 minutes
# 1GB    site = ~15 minutes
# 5GB    site = ~70 minutes
# 10GB+  site = Use SSH + rsync (see Option C)

Option B: cPanel File Manager (Small Sites < 500MB)

If your backup is a single .tar.gz or .zip archive under 500MB:

  1. Log into cPanel on the new host
  2. Go to Files > File Manager
  3. Navigate to /public_html/
  4. Click "Upload" and select your archive file
  5. After upload, right-click the archive and select "Extract"
  6. Verify the files are in the correct directory structure

Option C: SSH + rsync (Large Sites, Fastest)

If both hosts provide SSH access, you can transfer directly between servers:

# SSH into your NEW host, then pull files from the old host:
rsync -avz --progress user@old-host-ip:/home/user/public_html/ /home/user/public_html/

# Or if you only have SSH on the old host, push to the new:
rsync -avz --progress /home/user/public_html/ user@new-host-ip:/home/user/public_html/

Rsync is significantly faster than FTP for large transfers because it compresses data during transfer and only copies changed files (useful if you need to re-run the transfer).

Option D: cPanel Full Backup Restore

If both your old and new hosts use cPanel, and you have a full cPanel backup file (.tar.gz), your new host's support team can often restore it directly. Contact their support and provide the backup file. This is the most hands-off approach — they'll restore files, databases, email accounts, and cron jobs in one shot.

File permissions matter: After uploading, verify that file permissions are correct. WordPress typically needs directories set to 755 and files set to 644. The wp-config.php file should be 600 or 640 for security. Incorrect permissions are one of the top causes of "500 Internal Server Error" after migration.

Step 5: Import Your Database

With your empty database created (Step 3) and your .sql backup file ready (Step 2), it's time to import your data.

Method A: phpMyAdmin Import (Databases Under 50MB)

  1. Open phpMyAdmin on your new host (cPanel > Databases > phpMyAdmin)
  2. Select the empty database you created in Step 3 from the left sidebar
  3. Click the "Import" tab
  4. Click "Choose File" and select your .sql backup file
  5. Leave format as "SQL" and encoding as "utf-8"
  6. Click "Go" and wait for the import to complete

You should see a success message listing all the tables that were created.

Method B: Command Line Import (Large Databases > 50MB)

phpMyAdmin has upload limits (usually 50-256MB depending on the host's PHP configuration). For large databases, use SSH:

# SSH into your new host, then:
mysql -u username_wpuser -p username_mysite_wp < backup.sql

# You'll be prompted for the database password
# For very large databases, add --force to continue past errors:
mysql -u username_wpuser -p --force username_mysite_wp < backup.sql

Method C: BigDump Script (Large DB, No SSH)

If your new host doesn't offer SSH and the database exceeds phpMyAdmin's limit, use BigDump — a free PHP script that imports large SQL files in chunks:

  1. Download BigDump from bigdump.php (free PHP script)
  2. Edit the script with your database credentials
  3. Upload both bigdump.php and your .sql file to your new host
  4. Open yourdomain.com/bigdump.php in a browser
  5. Follow the on-screen instructions to import in chunks
  6. Delete bigdump.php immediately after import — it's a security risk if left on the server
Verify the import: After importing, browse the tables in phpMyAdmin. Check that the table count matches your original database. For WordPress, you should see tables like wp_posts, wp_options, wp_users, etc. If any tables are missing, re-import.

Step 6: WordPress-Specific Adjustments

If you're migrating a WordPress site, the files and database aren't enough — you need to update the configuration to match your new hosting environment. Skip this step if you're migrating a static site or used a WordPress migration plugin that handles this automatically.

Update wp-config.php

Open wp-config.php in the root of your WordPress installation on the new host. Update these four lines with the credentials from Step 3:

// Replace these with your NEW host's database credentials:
define('DB_NAME', 'username_mysite_wp');      // Your new database name
define('DB_USER', 'username_wpuser');          // Your new database user
define('DB_PASSWORD', 'your_new_password');    // Your new database password
define('DB_HOST', 'localhost');                // Usually 'localhost' on shared hosting
Don't change anything else in wp-config.php unless you know what you're doing. The authentication keys, salts, table prefix, and debug settings should stay the same. Changing the table prefix will make WordPress unable to find its data.

Search-Replace URLs (If Domain Is Changing)

If you're changing your domain name during migration (e.g., from olddomain.com to newdomain.com), you need to update every URL in the database. WordPress stores absolute URLs in many places — post content, option values, widget settings, and serialized data.

Using WP-CLI (recommended):

# SSH into your new host, navigate to your WordPress directory:
cd /home/user/public_html

# Dry run first (shows what would change, changes nothing):
wp search-replace 'https://olddomain.com' 'https://newdomain.com' --dry-run

# If the dry run looks correct, run for real:
wp search-replace 'https://olddomain.com' 'https://newdomain.com'

# Also replace the non-SSL version:
wp search-replace 'http://olddomain.com' 'https://newdomain.com'

WP-CLI handles serialized data correctly, which is critical. Manual find-and-replace in phpMyAdmin will break serialized data (used by most plugins and theme settings).

Without SSH access: Install the "Better Search Replace" plugin on your WordPress site, run the replacements from the admin panel, then uninstall the plugin.

Update .htaccess If Needed

Some hosts require specific .htaccess rules. If your old host had custom rewrite rules, PHP version directives, or security headers, verify they work on the new host. A standard WordPress .htaccess looks like this:

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule .* - [E=HTTP_AUTHORIZATION:%{HTTP:Authorization}]
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
# END WordPress

If your site uses a custom PHP version, add this at the top of .htaccess:

# Force PHP 8.2 (adjust version as needed):
AddHandler application/x-httpd-php82 .php

The exact syntax varies by host. Check your new host's documentation for PHP version switching.

Step 7: Test Before Changing DNS (Critical Step)

Do Not Skip This

This is the step that separates a smooth migration from a disaster. By editing your local hosts file, you can view your website on the new server while everyone else still sees the old server. This lets you find and fix every problem before it affects a single visitor.

Edit Your Local Hosts File

Your computer's hosts file overrides DNS lookups. By adding an entry that maps your domain to the new server's IP, your browser will connect to the new host while the rest of the world still sees the old one.

On Windows:

  1. Open Notepad as Administrator (right-click > "Run as administrator")
  2. Open the file: C:\Windows\System32\drivers\etc\hosts
  3. Add this line at the bottom (replace with your actual values):
# Temporary migration test — REMOVE THIS AFTER MIGRATION
123.456.789.0    yourdomain.com
123.456.789.0    www.yourdomain.com

On Mac/Linux:

# Open the hosts file with sudo:
sudo nano /etc/hosts

# Add these lines at the bottom:
123.456.789.0    yourdomain.com
123.456.789.0    www.yourdomain.com

# Save: Ctrl+O, Enter, Ctrl+X
# Flush DNS cache:
# Mac:   sudo dscacheutil -flushcache
# Linux: sudo systemd-resolve --flush-caches

What to Test

Open your website in a browser. It's now loading from the new server. Run through this checklist:

  • Homepage — Does it load without errors? Do images display correctly?
  • Internal pages — Click through at least 10 pages. Check for broken links and missing images.
  • Forms — Submit a test contact form. Does it process? Do you receive the email?
  • WordPress admin — Can you log in at /wp-admin? Can you create and preview a draft post?
  • E-commerce — If you have a shop, add a product to cart, go through checkout (use test/sandbox mode).
  • SSL — Does the site load with https://? Check for mixed content warnings (padlock icon should be solid, not showing a warning).
  • Email — Send a test email from the site (contact form, WooCommerce test order, etc.).
  • Speed — Does the site feel reasonably fast? Significant slowdown may indicate a misconfigured server or missing caching.
Remember to remove the hosts file entry after migration is complete! If you leave it in, your computer will always connect directly to that IP, even if the server changes later. This is the most commonly forgotten step.

If everything passes your test, proceed to email migration and DNS changes. If something is broken, fix it now — you have all the time in the world since the live site is unaffected.

Step 8: Migrate Email

Email migration is where most guides fall short. If you host email with your web host (cPanel email, webmail, etc.), your email data lives on the server and needs to be moved separately from your website files.

First: Do You Actually Need to Migrate Email?

Check which of these applies to you:

  • You use Google Workspace, Microsoft 365, or Zoho Mail — Your email is hosted by a third party, not your web host. No email migration needed. Just make sure your MX records continue to point to your email provider after the DNS change.
  • You use cPanel/host-provided email — Your email is stored on the hosting server. You need to migrate it. Keep reading.
  • You don't use email on this domain — Nothing to do here.

Option A: IMAP Sync via Email Client (Most Reliable)

This method uses an email client as a bridge between the old and new mail servers:

  1. Create the same email accounts on the new host — In cPanel > Email Accounts, create each email address with the same name (e.g., info@yourdomain.com)
  2. Open Mozilla Thunderbird (or any IMAP-capable email client)
  3. Add the OLD email account using IMAP settings:
    • Incoming: mail.yourdomain.com or the old server's hostname, port 993 (IMAP SSL)
    • Outgoing: mail.yourdomain.com, port 465 (SMTP SSL)
  4. Add the NEW email account as a separate account in Thunderbird:
    • Use the new server's IP address or hostname (not the domain, since DNS still points to the old host)
    • Same ports: 993 for IMAP, 465 for SMTP
  5. Wait for the old account to fully sync — all folders and messages should appear
  6. Select all messages in each folder and drag them from the old account to the corresponding folder in the new account
  7. Repeat for every email account

Option B: cPanel Email Backup and Restore

If your new host's support team can restore a cPanel backup, your email accounts and messages will be included automatically. This is the easiest path but requires both hosts to use cPanel.

Option C: Skip Migration, Start Fresh

If your email history isn't critical, simply create new email accounts on the new host and start fresh. Any important emails from the old account can be forwarded to a Gmail/Outlook account as an archive before you switch.

Timing matters for MX records: Only update your MX records after you've confirmed email is working on the new host. MX record propagation takes 2-48 hours, and during that period, some incoming emails will go to the old server and some to the new. This is unavoidable, which is why you should keep the old host active during propagation.

Step 9: Update DNS

Once you've tested your site on the new host (Step 7) and migrated email (Step 8), it's time to point your domain to the new server. You have two approaches.

Option A: Change Nameservers (Simplest)

This is the easiest method. You change the nameservers at your domain registrar, and the new host controls all DNS records.

  1. Log into your domain registrar (Namecheap, GoDaddy, Cloudflare, etc.)
  2. Find DNS/Nameserver settings for your domain
  3. Replace the current nameservers with your new host's nameservers (from your welcome email), e.g.:
    ns1.siteground.net
    ns2.siteground.net
  4. Save changes

Pros: Simple, one change handles everything. The new host manages all DNS records automatically.

Cons: You lose control of individual DNS records until propagation completes. If you have custom DNS records (SPF, DKIM, DMARC, CNAME for third-party services), you'll need to recreate them on the new host.

Option B: Update Individual Records (More Control)

If you want to keep your DNS at your current registrar (or use Cloudflare for DNS management), update records individually:

  • A Record: Change the IP address for @ and www to your new host's IP
  • MX Records: Update only if you're also migrating email to the new host. If you use Google Workspace or Microsoft 365, leave MX records unchanged.
  • CNAME Records: Update any that pointed to old-host-specific hostnames
  • TXT Records: Update SPF record if it references the old host's servers

DNS Propagation: What to Expect

TimeframeWhat Happens
0-2 hoursSome ISPs pick up the new DNS. ~30% of your traffic hits the new server.
2-12 hoursMost ISPs have updated. ~80% of traffic hits the new server.
12-24 hoursNearly complete. ~95% of traffic hits the new server.
24-48 hoursFull propagation. 100% of traffic hits the new server. Some stubborn ISPs (particularly in Asia) can take the full 48 hours.
Monitor propagation in real-time: Use whatsmydns.net — enter your domain and select "A" record type. It shows which DNS servers worldwide have updated to the new IP and which still point to the old one.

During propagation, both servers must work. Some visitors will see the old server, some will see the new one. Since you kept the old host active (as we recommended in the pre-migration checklist), all visitors see a working site regardless of which server they reach.

Step 10: Post-Migration Cleanup

The migration is technically done, but there are several housekeeping tasks that prevent problems in the coming days and weeks.

Immediate (Within 24 Hours)

  • Verify SSL certificate — Go to your site with https://. If the SSL isn't working, install it through cPanel > SSL/TLS or your host's SSL manager. Most hosts auto-install Let's Encrypt within minutes of DNS propagation. SiteGround and Hostinger do this automatically.
  • Test all critical pages — Homepage, contact form, product pages, checkout, login. Do this from a device where you have not edited the hosts file to ensure you're testing through actual DNS.
  • Remove the hosts file entry from Step 7 on your local computer.
  • Check site speed — Run a quick test at GTmetrix or PageSpeed Insights. If the site is significantly slower than before, check if caching plugins are active and the server location is correct.

Within the First Week

  • Google Search Console — Check for crawl errors. Google may temporarily show errors during DNS propagation, but these should resolve within 48 hours. If errors persist, something is misconfigured.
  • Update CDN settings — If you use Cloudflare or another CDN, update the origin IP to point to the new host. Purge the CDN cache to serve fresh content from the new server.
  • Test email deliverability — Send test emails to Gmail, Outlook, and Yahoo. Check that they land in the inbox, not spam. Verify SPF and DKIM records using MXToolbox.
  • Verify cron jobs — If your site relies on scheduled tasks (WordPress cron, custom cron jobs), verify they're running on the new host.
  • Monitor uptime — Use a free uptime monitor like UptimeRobot to catch any outages during the first week.

After One Week: Cancel Old Hosting

Once you've confirmed everything works perfectly on the new host for at least seven days:

  1. Take one final backup of the old host (just in case)
  2. Log into your old hosting account
  3. Cancel the account or let it expire
  4. Keep the final backup stored locally for at least 90 days
Check your billing cycle: Most hosts don't offer prorated refunds. If you just renewed for a year, you'll lose that payment. Time your migration near the end of a billing cycle to minimize waste. Some hosts offer refunds within 30-45 days — check their refund policy before canceling.

Common Migration Problems and How to Fix Them

Even with careful planning, issues can arise. Here are the five most common problems and their solutions.

500 Internal Server Error

The most common post-migration error. Usually caused by one of three things:

  • .htaccess issues — Rename .htaccess to .htaccess.bak. If the site loads, the file has rules incompatible with the new server. Regenerate it by going to WordPress > Settings > Permalinks and clicking "Save Changes."
  • PHP version mismatch — The new host may default to a different PHP version. Check cPanel > PHP Selector and set it to match your old host. WordPress 6.x requires PHP 7.4+ and works best on PHP 8.1/8.2.
  • File permissions — Directories should be 755, files should be 644. Fix via SSH:
    find /home/user/public_html -type d -exec chmod 755 {} \;
    find /home/user/public_html -type f -exec chmod 644 {} \;

Database Connection Error

"Error establishing a database connection" means WordPress can't reach the database. 99% of the time, it's a wp-config.php issue:

  • Verify DB_NAME matches exactly (including the cPanel username prefix)
  • Verify DB_USER matches exactly
  • Verify DB_PASSWORD is correct (re-copy it, don't re-type it)
  • Verify the user has been assigned to the database with all privileges
  • Verify DB_HOST is localhost (some hosts use a specific hostname — check your welcome email)

Missing or Broken Images

If pages load but images show as broken:

  • Check file paths — If your images use absolute paths like https://olddomain.com/wp-content/uploads/image.jpg and you changed domains, run the search-replace from Step 6.
  • Check uploads directory — Verify that /wp-content/uploads/ exists on the new host and contains all your image files.
  • Check case sensitivity — Linux servers are case-sensitive (Windows servers aren't). If Image.JPG is referenced as image.jpg, it'll break on Linux. This is a common issue when migrating from Windows hosting to Linux hosting.

SSL Certificate Issues

If you see "Not Secure" warnings or redirect loops:

  • SSL not installed yet — Let's Encrypt can only issue a certificate after DNS points to the new server. Wait for propagation, then install SSL via cPanel or your host's SSL tool.
  • Mixed content — Some resources (images, scripts) are loading via http:// instead of https://. Run search-replace to change all http:// URLs to https://.
  • Force HTTPS redirect loop — If your .htaccess has an HTTPS redirect but SSL isn't installed yet, you'll get an infinite redirect. Remove the HTTPS redirect temporarily, install SSL, then re-add it.

Email Not Working After Migration

  • MX records still point to old host — Check your MX records at MXToolbox. Update them to the new host's mail server if you're hosting email with the new provider.
  • SPF record not updated — If you changed nameservers, the old SPF record (which authorized the old host's mail server) is gone. Add a new SPF TXT record:
    v=spf1 +a +mx +ip4:NEW_SERVER_IP ~all
  • Emails going to spam — Set up DKIM and DMARC records on the new host. Without proper email authentication, major providers (Gmail, Outlook) may filter your emails as spam.

Migration Tools Comparison

The right tool depends on your site type, technical comfort, and site size. Here's how the major options compare.

ToolBest ForLimitPriceEase of Use
All-in-One WP Migration Small WordPress sites 512MB (free) Free / $69 unlimited Easiest — export + import, drag and drop
UpdraftPlus WordPress backup + restore No size limit (free) Free / $70+/yr premium Easy — backup, download, restore on new site
Duplicator Full WordPress clone 500MB (free) Free / $49.50+/yr Medium — creates a package with installer script
cPanel Transfer Any site (cPanel to cPanel) No limit Free (ask new host) Easiest — host does everything
WP-CLI + rsync Developers, large sites No limit Free Advanced — command line required
Host Migration Service Any site No limit Free with SiteGround, ChemiCloud, FastComet Easiest — professionals handle everything

Our Recommendation by Scenario

  • Small WordPress site (<500MB), non-technical user: All-in-One WP Migration plugin. Export from old host, import on new host. Done in 15 minutes.
  • WordPress site of any size, comfortable with plugins: UpdraftPlus. No size limit on free tier, reliable backup-and-restore workflow.
  • Any site, want zero effort: Choose a host with free migration (SiteGround, ChemiCloud, FastComet) and let their team do everything.
  • Large site (>5GB) or custom PHP site: Manual migration with SSH + rsync + command-line MySQL import.
  • cPanel to cPanel: Full cPanel backup + restore. Contact new host support to restore the backup.
Fastest path for WordPress users: Sign up with SiteGround GrowBig ($4.99/mo) and use their free WordPress Migrator plugin. It handles files, database, URL replacement, and SSL — all in one click. You just change nameservers afterward. Total active time: under 30 minutes. See all hosts with free migration.

Frequently Asked Questions

How long does website migration take?

Active hands-on time is typically 2-4 hours for a standard website. Small WordPress sites (under 1GB) can be done in under an hour using a migration plugin. Large sites with multiple databases, extensive email archives, or custom configurations may take 4-8 hours of work. DNS propagation adds another 2-24 hours of waiting time, but your site remains live throughout — there's no downtime for visitors if you follow this guide.

Will my site have downtime during migration?

No — not if you do it right. The key is to keep your old hosting account active until DNS has fully propagated to the new server. During the propagation window (typically 2-24 hours), approximately half your visitors hit the old server and half hit the new server. Since both servers have a working copy of your site, nobody experiences downtime. Only cancel your old hosting after at least one week of confirmed stable operation on the new host.

Can I migrate without technical knowledge?

Absolutely. The easiest approach is choosing a host that offers free migration. SiteGround, ChemiCloud, and FastComet will migrate your site for you at no cost — their support teams handle the file transfer, database import, and configuration. Alternatively, WordPress plugins like All-in-One WP Migration turn migration into a simple export-and-import process. If your WordPress site is under 512MB, you can realistically do it yourself in under 30 minutes with zero command-line work. See our best hosts with free migration guide for the full list.

What if something goes wrong during migration?

This is exactly why we insist on keeping your old host active throughout the process. If the migration fails, if the new site has broken functionality, or if anything else goes wrong — your original site is still running untouched on the old server. To revert, simply change your DNS back to the old host's nameservers. The most common issues (database connection errors, missing images, PHP version mismatches) are all fixable without affecting your live site. As long as you took a full backup in Step 2, the worst-case scenario is starting the migration over from scratch.

Do I need to migrate email separately?

It depends on how your email is set up. If you use a third-party email service like Google Workspace, Microsoft 365, or Zoho Mail, your email is completely independent of your web host — no email migration is needed. Just ensure your MX records stay pointed at your email provider during the DNS change. However, if you use cPanel email or any email hosting tied to your web host, you must migrate email separately. Your mailbox contents are stored on the server and won't transfer automatically with your website files. See Step 8 for the full email migration process.

Should I change my domain during migration?

We strongly recommend against changing your domain name at the same time as migrating hosts. Each change introduces its own set of potential issues — and when you change both simultaneously, debugging becomes significantly harder because you can't isolate which change caused which problem. Migrate to the new host first. Confirm everything works perfectly for at least one to two weeks. Then, if you still want to change domains, handle it as a separate project with proper 301 redirects to preserve your SEO rankings and link equity. Two clean, tested changes are far safer than one messy combined change.

Bottom Line: You've Got This

Website migration sounds intimidating, but it's really just 10 steps in a logical order. The entire process boils down to three things: copy your files, copy your database, point DNS to the new server. Everything else is preparation and verification.

Here's what to remember:

  • Backup everything first — files, database, and emails. Store the backup locally. This is your safety net.
  • Test before switching DNS — Use the hosts file trick (Step 7) to verify the site works on the new server before any visitor is affected.
  • Keep the old host active for a week — This gives you a fallback and ensures no downtime during DNS propagation.
  • Don't forget email — If you host email with your web host, it needs to be migrated separately.

If you want the simplest possible experience, choose a host that handles migration for you:

  • SiteGround GrowBig ($4.99/mo) — Free WordPress migration plugin + manual migration for non-WP sites. Best overall for performance and support.
  • ChemiCloud ($2.49/mo) — Free migration for up to 3 sites. Best value with lowest renewal rates ($11.95/mo).
  • FastComet ($1.79/mo) — Free migration + free domain transfer. Best intro price with reasonable renewal ($8.95/mo).

All three hosts include free SSL, daily backups, and responsive support — the essentials for a worry-free migration. For the full comparison of hosts that offer free migration, see our Best Hosting with Free Migration 2026 guide. Or if you're still deciding on a host, start with our Best Web Hosting 2026 overall rankings.

For WordPress-specific hosting features (staging, one-click installs, managed updates), our Best WordPress Hosting 2026 guide covers that in detail.

JW
Jason Williams Verified Reviewer
Founder & Lead Reviewer · Testing since 2014

I've spent 12+ years in web hosting and server administration, managing infrastructure for 3 SaaS startups and personally testing 45+ hosting providers. Every review on this site comes from hands-on experience — I maintain active paid accounts, deploy real WordPress sites with production plugins, and monitor performance for 90+ days before publishing.

About our team → Testing methodology →