DNS Propagation Troubleshooting Guide

“DNS propagation” is one of those phrases that sounds precise until you spend enough time troubleshooting it. Then you realize most people use it as shorthand for several different problems: recursive caches hanging onto old answers, wrong nameserver delegation, negative caching after a missing record, local operating system cache, browser cache, CDN edge behavior, or simply editing the wrong zone.

When someone tells me “DNS has not propagated yet,” I do not treat that as a diagnosis. I treat it as a starting point.

Most of the time there is no mysterious global broadcast happening in the background. DNS changes become visible because caches expire and resolvers ask authoritative servers again. That is why I prefer to explain it as cache expiration, not propagation. The word propagation is convenient, but it leads people to expect instant global synchronization once they hit save.

This guide is the process I use when a record change seems stuck, inconsistent, or invisible from part of the internet.

If you need deeper record-type background, the DNS record types guide is the right primer. If you run your own authoritative server, pair this article with the BIND DNS setup guide because half of “propagation” problems turn out to be authoritative configuration mistakes.

What DNS propagation actually is

What most people call propagation is usually this sequence:

  1. you change a record on the authoritative DNS side
  2. recursive resolvers continue serving cached old answers until TTL expires
  3. once the cached entry expires, they ask the authoritative server again
  4. clients begin seeing the new answer through those refreshed caches

That is it.

There is no DNS control plane pushing the update to every ISP resolver worldwide in real time. Resolvers just stop trusting the old cached answer and fetch a new one when the timer runs out.

Why the word propagation is misleading

Propagation makes administrators think changes move outward automatically like a file copy syncing across nodes.

In practice, the important variables are:

  • the old TTL value before the change
  • whether the right authoritative nameservers were updated
  • whether the delegation itself changed
  • whether clients or resolvers are caching negative answers
  • whether you are actually looking at DNS or a layer above it

I have seen teams lose hours blaming propagation when the root issue was that they updated the zone at the registrar but not the DNS host, or updated one provider while delegation still pointed somewhere else.

TTL is the planning lever you control

TTL determines how long recursive resolvers are allowed to cache an answer.

Example output:

dig example.com A

If you see something like this in the answer section:

example.com.    300    IN    A    192.0.2.20

that 300 is the remaining TTL in seconds for that cached response at the server you asked.

Lower TTL before planned changes

If I know I will move a website, mail server, or validation record, I lower the TTL ahead of time while the old record is still in place.

For example, if the record currently uses a TTL of 86400 seconds, I do not change it at the same time as the IP and expect rapid cutover. The old 24-hour cache may already be sitting in resolvers everywhere.

My usual sequence:

  1. one day or more before the change, lower TTL from something high like 86400 to 300
  2. wait for the original high TTL to age out
  3. make the record change
  4. confirm traffic moves correctly
  5. raise TTL again later if appropriate

That timing discipline saves a lot of stress.

Raising TTL again after the cutover

I do not leave every record at 300 forever. Low TTLs are useful during changes, but they increase query volume and can make upstream problems more visible.

For stable records, I often move back to a longer TTL once I am confident the new answer is correct.

Start by asking the authoritative path, not random checkers

The first thing I want to know is whether the authoritative side is correct.

Use dig +trace to follow delegation

dig +trace example.com A

+trace walks from the root downward. It shows which nameservers are responsible at each stage and helps answer basic questions fast:

  • is the domain delegated where I think it is?
  • which authoritative nameserver is answering?
  • does the chain stop or misdirect somewhere?

I do not rely on +trace for everything, but it is one of the quickest ways to expose delegation confusion.

Query the authoritative nameserver directly

Once I know which nameservers should be authoritative, I ask them directly.

dig @ns1.example.com example.com A

Or, if I want to avoid relying on its own resolution path:

dig @192.0.2.10 example.com A

If the authoritative server is still returning the old record, there is no propagation problem yet. There is an origin problem.

Query public resolvers individually

After confirming the authoritative answer, I check what major public resolvers are serving.

dig @8.8.8.8 example.com A

dig @1.1.1.1 example.com A

dig @9.9.9.9 example.com A

I usually compare at least three public resolvers because one stale cache does not prove much by itself.

When these resolvers disagree, I compare:

  • returned answer
  • remaining TTL
  • authority section
  • whether one is serving NXDOMAIN while another has a valid record

That usually tells me whether the issue is simply cached old data or something deeper.

Check the SOA record and serial

The SOA record is often overlooked during DNS troubleshooting.

dig example.com SOA

This shows the zone serial plus timing values such as refresh and retry.

Example:

example.com. 300 IN SOA ns1.example.com. hostmaster.example.com. 2026072202 3600 900 1209600 300

If you run secondaries, the serial is critical. If the primary has the new record but the serial did not increase, secondaries may keep serving the old zone. That is not propagation. That is a zone management error.

In environments where I control BIND, I cross-check the serial against the zone file directly and re-run validation tools. The BIND setup article goes deeper on that workflow.

Understand negative caching

A missing record can be cached too.

That surprises people the first time they add a record and it still comes back NXDOMAIN after creation.

NXDOMAIN does not always disappear immediately

If a resolver asked for a name before it existed, it may cache the negative answer based on SOA-related negative TTL behavior.

So this sequence is common:

  1. client queries new.example.com
  2. resolver gets NXDOMAIN and caches it
  3. you create new.example.com
  4. some resolvers keep returning NXDOMAIN until the negative cache expires

This matters a lot for ACME DNS validation, newly created subdomains, and rushed cutovers. If you need wildcard issuance or TXT changes, the Let’s Encrypt wildcard guide is useful because DNS timing is usually the hard part there.

Verify NS delegation separately from records

I split DNS troubleshooting into two different layers:

  • delegation: who is authoritative for the zone
  • zone content: what records that authority serves

To check NS delegation:

dig example.com NS

To see parent-side delegation more explicitly, ask a parent nameserver when appropriate. For a .com domain:

dig @a.gtld-servers.net example.com NS

That helps confirm whether the TLD delegation points to the nameservers you think it does.

Glue records matter when nameservers live inside the same zone

If your nameservers are ns1.example.com and ns2.example.com, glue records at the parent are important. Without them, bootstrapping resolution gets messy.

I check them with:

dig @a.gtld-servers.net example.com NS +additional

If the additional section is missing the expected addresses, or the registrar-side host records are wrong, you may have a delegation issue disguised as propagation.

Dig is better than nslookup for this work

nslookup still exists, and I still see it on troubleshooting calls. It is okay for quick manual lookups. It is not what I choose for serious DNS debugging.

I prefer dig because it shows:

  • TTLs clearly
  • authority and additional sections
  • trace output
  • specific control over which resolver is queried
  • better scriptability

nslookup is not useless. It is just not the tool I reach for when answers differ across providers.

Compare results from different geographic locations

Public resolvers are useful, but sometimes I want eyes from actual systems in different regions.

I keep small VPS instances in more than one location for exactly this kind of check. When that is not available, I ask teammates on other networks or use reputable DNS checker sites as a sanity check.

Use multiple DNS checkers, but do not trust them blindly

Browser-based global DNS checkers are convenient because they show a broad view quickly. I use them to spot patterns, not as the final authority.

What I look for:

  • do all locations still show the old record?
  • do only a few stubborn resolvers lag behind?
  • are some nodes showing SERVFAIL instead of the old value?

If the checker disagrees with direct dig queries to known resolvers, I trust my direct queries more.

Flush local DNS cache when testing from your own machine

Sometimes the problem is only on the machine you are sitting at.

Windows

ipconfig /flushdns

macOS

sudo dscacheutil -flushcache
sudo killall -HUP mDNSResponder

Linux with systemd-resolved

sudo resolvectl flush-caches

Older Linux systems might use other caching layers like nscd or dnsmasq. If I am unsure, I check the active resolver stack first instead of assuming.

Local browser caches and OS caches can make it look like DNS is stale even when public resolution is already correct.

When records seem stuck, separate DNS from other caching layers

This is a big one.

People say “DNS is not updated” when what they really mean is “the website still goes to the old place.” That might be DNS, but it might also be:

  • CDN edge caching
  • application redirects
  • browser HSTS behavior
  • reverse proxy configuration
  • stale upstream health-check decisions

I have seen Cloudflare and other CDN setups blamed for DNS issues when the A record was already correct everywhere and the old content was coming from cached application behavior or proxy routing.

So I separate questions carefully:

  1. what IP does DNS return?
  2. what host answers on that IP?
  3. what content or certificate does that host serve?

If step one is correct, the problem may have moved up the stack. The SSL monitoring guide is useful for this because a certificate mismatch often reveals that traffic is still landing on the wrong endpoint even after DNS looks right.

Common mistakes that look like propagation

Changing a record without lowering TTL first

This is the classic cutover mistake. The change is right, but users keep hitting the old endpoint because resolvers are still honoring the old long TTL.

Updating the wrong DNS provider

This happens when registrar delegation points to one provider and the admin edits records in another portal that is no longer authoritative.

Wrong nameserver delegation

The zone on the provider looks perfect, but the parent still delegates to old nameservers.

Missing or broken glue records

Especially relevant when child nameservers live inside the zone they serve.

Looking at local cache only

A workstation, browser, or internal DNS forwarder may still have stale data even though the public internet does not.

Ignoring negative cache behavior

A newly created record can remain invisible on some resolvers because they cached NXDOMAIN earlier.

A practical workflow I use under pressure

When a DNS change is supposed to be live and something looks wrong, I work in this order:

1. Confirm the intended change

Write down the exact record, type, expected value, and when it was changed.

2. Ask the authoritative server directly

dig @ns1.example.com example.com A

If wrong here, stop and fix the source.

3. Check delegation

dig +trace example.com A

dig @a.gtld-servers.net example.com NS

4. Check public resolvers

dig @1.1.1.1 example.com A

dig @8.8.8.8 example.com A

5. Check SOA and serial

dig @ns1.example.com example.com SOA

6. Flush local cache and re-test from the client side

Use the OS-specific commands from earlier.

7. Verify the application or certificate layer

If DNS is correct but behavior is still wrong, inspect what the target endpoint is actually serving.

That process keeps me from jumping around randomly.

TTL versus SOA refresh: two timers people confuse constantly

I see admins mix up record TTL and SOA refresh all the time.

  • TTL controls how long a resolver may cache an answer.
  • SOA refresh tells a secondary authoritative server how often to check the primary for zone updates.

Those are different mechanisms.

A high SOA refresh value does not explain why a recursive resolver is still serving an old A record. That is a TTL issue. On the other hand, if your primary was updated but a secondary still serves old data, the SOA serial and refresh behavior are exactly where I look first.

This distinction matters when you run your own nameservers. If public resolvers are seeing different answers from different authoritative servers, that is not “the internet being slow.” That is usually a primary/secondary sync problem.

Registrar changes are a separate category of waiting

Changing an A record inside an existing zone is one thing. Changing the domain’s delegation at the registrar is another.

When you change nameservers at the registrar, I expect a different troubleshooting path:

  1. check the parent zone for new NS records
  2. confirm glue if child nameservers are involved
  3. query both old and new authoritative servers directly
  4. confirm the new provider is serving the full intended zone

That kind of change often feels slower because resolvers may still know the old delegation for a while, and because mistakes on the new provider side are very common. I try not to combine delegation changes and major record cutovers at the same time unless there is no alternative.

Troubleshooting SERVFAIL versus old answers

Old answers usually mean cache. SERVFAIL usually means something else.

When I see SERVFAIL, I suspect:

  • broken DNSSEC validation
  • lame delegation
  • unreachable authoritative nameserver
  • firewall issue on UDP/TCP 53
  • syntax or loading errors on the authoritative side

That is a different branch of troubleshooting than stale A records. If DNSSEC is enabled, go straight to the DNSSEC setup and validation guide because broken signatures frequently surface as SERVFAIL on validating resolvers.

Final thoughts

DNS propagation is mostly a human shorthand for cache expiry, and that distinction matters because it changes how you troubleshoot. Instead of waiting passively and hoping the internet catches up, you can ask very specific questions: what do authoritative servers say, what do major recursive resolvers say, what does the SOA serial show, is delegation correct, and are you actually looking at DNS rather than some other cache layer.

The practical lesson is simple. Plan TTLs before changes. Query authoritative nameservers directly. Use dig, not guesswork. Check delegation and glue when things seem inconsistent. Remember negative caching. Flush your local cache before declaring victory or failure. And once DNS is confirmed, do not keep blaming propagation for problems that really belong to CDNs, proxies, or applications.

That approach has solved far more “propagation” incidents for me than waiting another hour ever did.

Scroll to Top