Moving a website to a new host is stressful enough without worrying about downtime. Every minute your site is offline means lost visitors, lost revenue, and potentially lost search rankings. The good news is that with proper planning, you can migrate your website from one host to another without a single visitor seeing an error page. This guide covers the DNS strategies, content synchronization techniques, and testing procedures that make zero-downtime migration possible.
Whether you are moving to MassiveGRID's high-availability cPanel hosting or any other provider, these techniques ensure a seamless transition that is invisible to your visitors.
Why Traditional Migrations Cause Downtime
In a naive migration, you copy your site to the new server and then change your DNS records to point to the new server's IP address. The problem is that DNS propagation is not instant. After you update your DNS records, the change ripples across the global network of DNS resolvers over a period of hours (sometimes up to 48 hours). During this propagation window:
- Some visitors are served by the old server (their DNS resolver still has the old IP cached)
- Other visitors are served by the new server (their DNS resolver has picked up the new IP)
- If you have already taken the old server offline, visitors reaching the old IP see an error
- If both servers are running but data changes on either one, the two copies can drift out of sync
Zero-downtime migration solves these problems through careful sequencing: you keep both servers running, synchronize content between them, switch DNS with minimal propagation delay, and only decommission the old server after propagation is complete.
The Zero-Downtime Migration Strategy
The overall strategy has five phases:
- Prepare — Set up the new server, reduce DNS TTL, plan the cutover window
- Replicate — Copy all content, databases, and configurations to the new server
- Test — Verify the site works perfectly on the new server without changing public DNS
- Cut over — Switch DNS, synchronize any final data changes, monitor
- Finalize — Confirm propagation is complete, decommission old server
Phase 1: Preparation
Lower DNS TTL (Do This First)
This is the single most important preparatory step. Your domain's DNS records have a TTL (Time To Live) value that tells DNS resolvers how long to cache the record before checking for updates. Default TTLs are often 3600 seconds (1 hour) or even 86400 seconds (24 hours).
At least 48 hours before your planned migration, lower the TTL on all DNS records (A, AAAA, CNAME, MX) to 300 seconds (5 minutes). This means that when you change the DNS records later, resolvers worldwide will pick up the change within 5 minutes instead of hours.
Important: You must wait for the old TTL value to expire before the new TTL takes effect. If your current TTL is 86400 seconds (24 hours), you need to lower it and then wait at least 24 hours before the migration cutover.
Set Up the New Server
- Provision and configure the new hosting account
- Match PHP versions, modules, and server configurations to the old server
- Install SSL certificates (use a Let's Encrypt HTTP validation or DNS validation)
- Note the new server's IP address and temporary access URL
Choose Your Cutover Window
Even with a 5-minute TTL, pick a low-traffic period for the DNS switch. Check your analytics to identify the time of day and day of week with the least traffic. Late night / early morning in your primary audience's timezone is typical.
Phase 2: Content Replication
Initial Full Copy
Transfer a complete copy of your site to the new server using one of these methods:
- cPanel full backup restore — Generate a full backup on the old server, transfer it, and restore on the new server. This is the most comprehensive method for cPanel-to-cPanel migrations.
- cPanel Transfer Tool — If your new host has WHM access, use the Transfer Tool to pull the account directly from the old server over a secure connection.
- rsync over SSH — For command-line users, rsync is ideal for large file sets because it supports incremental transfers.
# Initial rsync of files from old server to new server
rsync -avz --progress -e ssh user@oldserver:/home/username/ /home/username/
Database Replication
For the database, do an initial full export and import:
# On old server: export database
mysqldump -u dbuser -p --single-transaction dbname > dbdump.sql
# Transfer to new server
scp dbdump.sql user@newserver:/home/username/
# On new server: import database
mysql -u dbuser -p dbname < dbdump.sql
Final Synchronization (Just Before Cutover)
Between the initial copy and the DNS cutover, your live site will continue receiving new data (new orders, new posts, new user registrations). You need to synchronize these changes before switching DNS. There are two approaches:
Approach A: Freeze and Sync
- Put the old site into maintenance mode (brief downtime of a few minutes)
- Run a final rsync to copy only changed files
- Do a final database export/import
- Switch DNS
- Take the old site out of maintenance mode (it will still serve some users during propagation)
Approach B: Continuous Sync
- Set up a cron job that runs rsync every few minutes to keep files in sync
- For databases, use MySQL replication to continuously stream changes from old to new server
- Switch DNS when ready — because data is continuously synced, there is no gap
- Stop the sync process after DNS propagation is complete
Approach B is more complex but achieves true zero-downtime for even the busiest sites. For most small to medium websites, Approach A with a 2-5 minute maintenance window is perfectly acceptable.
Phase 3: Testing
Before touching DNS, thoroughly test the site on the new server.
Hosts File Method
Edit your local computer's hosts file to point your domain to the new server's IP:
# Add to /etc/hosts (macOS/Linux) or C:\Windows\System32\drivers\etc\hosts (Windows)
203.0.113.50 yourdomain.com www.yourdomain.com
Now when you open your browser and navigate to your domain, you see the version on the new server. Run through your full test checklist:
- All pages render correctly
- Images and media load
- Forms submit successfully
- CMS admin panel works
- User login/registration works
- eCommerce checkout process works (use test transactions)
- Email sending works (check SPF/DKIM)
- SSL certificate is valid and shows no warnings
- Redirects work (especially www to non-www or HTTP to HTTPS)
- Performance is acceptable (run a speed test)
Automated Testing
If you have automated tests, run them against the new server. At minimum, use curl to check response codes for your key pages:
# Check response code for homepage (using hosts override or direct IP)
curl -o /dev/null -s -w "%{http_code}" --resolve yourdomain.com:443:203.0.113.50 https://yourdomain.com/
Phase 4: DNS Cutover
The Switch
- Do a final content sync (rsync for files, database export/import)
- Update DNS records to point to the new server's IP address
- If using Cloudflare or another DNS provider with fast propagation, the change takes effect almost immediately for new requests
- If using registrar DNS, propagation follows TTL settings (should be 5 minutes if you lowered TTL in Phase 1)
Keep the Old Server Running
Do not shut down the old server after switching DNS. Visitors whose DNS resolvers have not yet updated will still reach the old server. Keep it running for at least 48 hours after the DNS change. If the old site receives write operations (form submissions, orders) during this window, you may need to manually reconcile that data with the new server.
Using Cloudflare for Instant DNS Switching
Cloudflare acts as a proxy between visitors and your server. If your site is already on Cloudflare (or you switch to Cloudflare DNS before the migration), changing the origin IP in Cloudflare's dashboard takes effect within seconds for all visitors going through Cloudflare's proxy. This is the closest thing to truly instant DNS switching available.
| DNS Provider Type | Effective Propagation Time | Notes |
|---|---|---|
| Cloudflare (proxied) | Seconds | Change is instant for proxied requests; origin IP swap in dashboard |
| Cloudflare (DNS only) | ~5 minutes | Respects TTL; Cloudflare's edge caches update quickly |
| Route 53, Google Cloud DNS | Minutes (per TTL) | Fast authoritative updates; propagation depends on resolver caching |
| Registrar DNS (GoDaddy, Namecheap) | Minutes to hours | Depends on TTL and registrar's update speed |
| Nameserver change (at registrar) | 1-48 hours | Slowest method; avoid for zero-downtime migrations |
Phase 5: Finalization
After 48 hours with stable DNS pointing to the new server:
- Verify global DNS propagation using tools like whatsmydns.net
- Check server logs on the old server — if it is still receiving traffic, DNS has not fully propagated for some networks
- Restore your DNS TTL to a normal value (3600 or higher) on the new DNS configuration
- Remove hosts file overrides from your local machine
- Set up monitoring on the new server (uptime monitoring, performance monitoring)
- Verify backups are running on the new host — check that your backup retention policy is configured correctly
- Cancel the old hosting account — but keep a local copy of the backup just in case
Special Considerations for WordPress Migrations
WordPress stores the site URL in the database (wp_options table, siteurl and home values) and sometimes has hardcoded URLs in serialized data. If your migration involves a domain change or URL structure change:
- Use WP-CLI's
search-replacecommand to update URLs in the database - Update
wp-config.phpif the database hostname, name, or credentials differ on the new server - Flush all caches (page cache, object cache, CDN cache) after migration
- Regenerate permalinks (Settings > Permalinks > Save)
For straightforward same-domain migrations (which is most cases), the cPanel backup-and-restore method handles everything correctly without needing database URL replacements.
Special Considerations for eCommerce Sites
eCommerce sites have unique challenges during migration because orders can be placed at any moment:
- Schedule the cutover during your lowest-traffic period
- Consider a brief maintenance page (even 5 minutes) during the final database sync to prevent orders from being placed on the old server after the database has been exported
- Verify payment gateway configurations — some gateways are IP-whitelisted and need to be updated for the new server
- Test the full checkout flow on the new server before switching DNS
- Monitor orders closely for 48 hours after migration to catch any issues
The cost of downtime for eCommerce sites is direct and measurable. Understanding the real cost of website downtime helps justify the extra effort required for a zero-downtime migration.
When to Use Your Host's Migration Service
If the technical steps in this guide feel overwhelming, use your new host's migration service. A good hosting provider will handle the entire migration for you, including content synchronization, DNS strategy, and post-migration verification. MassiveGRID's high-availability cPanel hosting includes free migration assistance where our team manages the entire process, coordinating with you on timing and DNS changes to ensure zero downtime.
Whether you migrate yourself or use a managed service, the principles are the same: prepare thoroughly, test before switching, keep both servers running during propagation, and verify everything before decommissioning the old server. For a broader look at the migration process from specific providers, see our guide on migrating from GoDaddy, Bluehost, or Hostinger.
Frequently Asked Questions
Is true zero-downtime migration really possible?
Yes, with proper planning. The techniques described in this guide — TTL reduction, content synchronization, testing before DNS switch, and keeping both servers running during propagation — eliminate downtime for virtually all website types. The only scenario where brief downtime may be unavoidable is when you need to freeze database writes for a final synchronization, and even then, the window is typically under 5 minutes.
What if I cannot lower my DNS TTL?
If your current DNS provider does not allow TTL changes (rare, but some budget hosts lock this), you need to plan for a longer propagation window. Switch to a DNS provider that gives you TTL control (Cloudflare is free and gives you full control) before starting the migration. Alternatively, accept that propagation will follow the existing TTL and keep both servers running for the full duration.
How do I handle email during a zero-downtime migration?
Email migration is often the trickiest part. When MX records change, some email may be delivered to the old server and some to the new server during propagation. To avoid lost email: keep both servers configured to accept email for your domain during the transition, and check both mailboxes for a few days after the switch. Alternatively, if you use a third-party email service (Google Workspace, Microsoft 365), your email is not affected by hosting migrations at all — only update MX records if your email host is changing.
Can I do a zero-downtime migration on shared hosting?
Yes, though you have less control over server-level configurations. The DNS strategy and testing procedures are the same. The main limitation is that you may not have SSH access for rsync-based synchronization, so you will rely on cPanel backups and manual testing. Using your new host's migration service is especially valuable for shared hosting migrations.
What is the difference between changing nameservers and changing DNS records?
Changing nameservers tells the internet to use a different DNS server to look up your domain's records. This is a bigger change that affects all DNS records and propagates more slowly (up to 48 hours). Changing individual DNS records (like the A record) within your existing DNS provider is faster and more targeted. For zero-downtime migration, changing individual records is preferred because propagation is governed by your TTL setting rather than the slower nameserver delegation process.