DNS Migration Checklist for Production Teams
A practical DNS migration checklist for moving providers or nameservers without losing records, breaking email, or guessing during rollback.
TL;DR
A safe DNS migration is a record-parity and evidence problem. Inventory the current zone, lower TTLs before the cutover, rebuild the new zone, verify the new authoritative nameservers directly, change delegation only after DNSSEC and rollback are ready, then compare public resolver answers until the migration is boring.
Last updated: July 4, 2026
Use this checklist when you are moving DNS providers, changing authoritative nameservers, consolidating domains, or migrating a production app to a new edge/network provider. If you are only changing one A record, start with how to check DNS propagation. If you are moving a real production zone, use the manifest below.
Before touching nameservers, create a single manifest that captures the old state, the intended new state, the validation method, and the rollback value. This is the part most migration guides skip. It turns "I think DNS is fine" into evidence your team can re-run before, during, and after the window.
| Check | Capture before cutover | Validate after cutover | DNSBuddy tool |
|---|---|---|---|
| Current authoritative nameservers | Registrar NS and live NS answer | New registrar NS and public resolver agreement | DNS Lookup |
| Full zone inventory | A, AAAA, CNAME, MX, TXT, SRV, CAA, NS, SOA | Same records exist at the new provider | Bulk DNS Lookup |
| Registrar ownership | Registrar, expiry, lock status, nameserver delegation | Registrar still points at the intended provider | Bulk WHOIS |
| Email records | MX, SPF, DKIM selectors, DMARC, BIMI if used | Mail records resolve from new authoritative nameservers | Bulk DNS Lookup |
| Certificate records | CAA and ACME validation records | Certificate authority is still allowed to issue | DNS Lookup |
| Reverse DNS | PTR and forward-confirmed reverse DNS for sending IPs | PTR still matches the hostname and IP | Bulk FCrDNS and reverse DNS guide |
| Rollback values | Exact old values and TTLs | Values are still available if you revert | Manifest plus old provider |
For multi-domain moves, paste the domain list into Bulk DNS Lookup and export the results before the change. DNSBuddy accepts up to 256 targets per bulk request, which is enough for most app, staging, webhook, status page, and customer-domain batches.
Your first job is to prove what exists today. Do not rely on the DNS provider UI alone. Provider dashboards are useful, but the resolver-visible state is what users and mail servers actually see.
Capture at least these record types:
| Record type | What to check | Common migration miss |
|---|---|---|
| A / AAAA | Apex, www, app hosts, API hosts, status pages | IPv6 records copied for some hosts but not others |
| CNAME | CDN, SaaS, verification, customer-facing aliases | Trailing dot or provider-specific target formatting |
| MX | Hostnames and priority values | Priority order changed accidentally |
| TXT | SPF, DKIM, DMARC, Google/Microsoft verification | Long TXT strings rewrapped or split incorrectly |
| CAA | Certificate authority allow-list | New certs fail after cutover |
| SRV | Microsoft 365, SIP, service discovery | Record omitted because it is not visible in browser tests |
| NS | Current authoritative nameservers | Mixed old/new nameservers at the registrar |
| SOA | Serial, negative cache behavior, provider defaults | Negative caching makes missing new records look "stuck" |
Run direct lookups for the important records:
dig example.com A
dig example.com AAAA
dig example.com MX
dig example.com TXT
dig example.com CAA
dig example.com NS
dig example.com SOAThen compare the same hostnames with Bulk DNS Lookup. The goal is not to admire a spreadsheet. The goal is to have rollback values that are exact enough to use when everyone is tired.
TTL is the time interval a resolver may cache a DNS record before asking the source again. That definition comes from RFC 1035, and it matters because TTL changes are not retroactive. If a resolver cached your old A record for 86,400 seconds, lowering the TTL now does not erase that resolver's existing cache.
For planned migrations, lower critical TTLs 24-48 hours before the change window. Cloudflare's migration prep guidance recommends lowering critical record TTLs ahead of cutover, with 300 seconds as a common short migration TTL. That is the right default for most production moves: short enough to reduce stale-cache pain, not so low that you forget to raise it later.
Use this timing:
| Before cutover | Action |
|---|---|
| 48 hours | Lower high-risk records to 300 seconds: A, AAAA, CNAME, MX, TXT, CAA |
| 24 hours | Confirm public resolvers are now returning the lower TTL |
| 2-4 hours | Freeze unrelated DNS changes |
| Cutover | Change delegation or record values |
| After stable | Restore normal TTLs, usually 3600 seconds or higher |
Negative answers are cached too. RFC 2308 defines negative caching for answers like NXDOMAIN and NODATA, and ties the cache time to SOA behavior. In practice: if you add a brand-new hostname after resolvers recently cached "that name does not exist," some users can keep seeing NXDOMAIN until that negative cache expires. Check the SOA record when a new hostname looks stuck.
Create the full zone at the new provider before changing nameservers. Do not make the registrar switch first and then fill in records. That is how email, ACME validation, and forgotten subdomains go missing.
For each record, compare:
Query the new provider's authoritative nameservers directly before delegation changes:
dig @new-ns1.example-dns.com example.com A
dig @new-ns1.example-dns.com example.com MX
dig @new-ns1.example-dns.com example.com TXT
dig @new-ns1.example-dns.com www.example.com CNAMEIf the new authoritative nameserver is wrong, public propagation checks are noise. Fix the new zone first. Only move the registrar delegation after the new provider returns the expected records directly.
DNSSEC is where otherwise careful migrations get weird. If the old DNSSEC chain remains at the registrar while the new provider serves unsigned records or different keys, validating resolvers can return SERVFAIL.
Cloudflare's DNSSEC documentation gives the safe rule: if your current provider does not support an active multi-signer DNSSEC migration, remove the old DS record at the registrar and wait for the DS TTL to expire before changing nameservers. Cloudflare notes that changing nameservers before the old DS TTL expires can cause validating resolvers to return SERVFAIL because cached DS records do not match the new provider's keys.
Checklist:
dig example.com DS
dig example.com DNSKEYIf DNSSEC is enabled, choose one migration path:
If disabling DNSSEC, remove the DS record at the registrar and wait for the DS TTL to expire.
Change nameservers only after validating resolvers no longer expect the old DS chain.
Re-enable DNSSEC at the new provider after the delegation is stable.
Do not treat DNSSEC as a checkbox you can clean up later. It is part of the cutover plan.
When the old state is captured, TTLs are lowered, the new zone is verified, and DNSSEC is handled, change nameservers at the registrar.
Immediately record:
Then run the same checks from the manifest:
dig example.com NS
dig @8.8.8.8 example.com NS
dig @1.1.1.1 example.com NS
dig @9.9.9.9 example.com NSUse DNS Lookup to compare Google, Cloudflare, Quad9, and OpenDNS side by side. Resolver disagreement is normal during the TTL window. What is not normal is a new authoritative nameserver returning incomplete records.
DNS answers can be correct while the service is still broken. After the resolver checks pass, verify the systems those records support.
For web traffic:
www resolve to the intended IPs or CNAMEs.For email:
_dmarc.example.com.For domain and registrar state:
Use Bulk WHOIS for domain-fleet moves, and Bulk FCrDNS when mail-sending IPs are part of the migration.
Do not delete the old zone immediately after the registrar update. Some resolvers may still have the old delegation cached, and some users may still reach old infrastructure while caches expire.
Keep the old DNS provider and old backing services available for at least the longest relevant TTL window. For nameserver migrations, a 48-72 hour overlap is a sensible default unless your TLD, registrar, or enterprise resolver environment requires longer.
Rollback should be boring:
The rollback value is not "old DNS." It is the exact record, TTL, and provider state you captured in the manifest.
After the migration is stable, raise TTLs back to normal values. Leaving every record at 300 seconds forever creates extra query volume and makes your DNS setup look permanently in-change.
Before closing the change:
Then schedule a follow-up audit a week later. DNS migrations are famous for "everything worked until certificate renewal" and "marketing email broke Monday morning." A delayed audit catches the records that do not fail immediately.
Use this as the short version in your change ticket:
Pre-cutover
[ ] Export or inventory all DNS records
[ ] Capture registrar, nameserver, WHOIS/RDAP, and expiry state
[ ] Capture rollback values for all critical records
[ ] Lower TTLs 24-48 hours before cutover
[ ] Rebuild the new zone completely
[ ] Verify new authoritative nameservers directly with dig
[ ] Compare A, AAAA, CNAME, MX, TXT, CAA, SRV, NS, and SOA records
[ ] Confirm SPF, DKIM, DMARC, and verification TXT records
[ ] Check CAA records for certificate issuance
[ ] Check DNSSEC DS state and wait for DS TTL if needed
[ ] Freeze unrelated DNS changes
Cutover
[ ] Change registrar nameservers
[ ] Record cutover time and rollback owner
[ ] Query public resolvers for NS and key records
[ ] Verify website, API, redirects, TLS, email, and validation records
[ ] Keep old DNS zone and old services alive
Post-cutover
[ ] Monitor resolver agreement through the TTL window
[ ] Confirm no SERVFAIL or unexpected NXDOMAIN
[ ] Confirm WHOIS/RDAP and registrar state
[ ] Confirm PTR/FCrDNS for sending IPs if applicable
[ ] Restore normal TTLs after stability
[ ] Export final DNS state
[ ] Keep old zone available for 48-72 hours before decommissioning