Cloudflare publishes zone changes globally in under five minutes. If a change still is not live, something is holding the old answer: a record TTL, a negatively cached NXDOMAIN, or a delegation that never moved.
“DNS propagation” describes something that does not happen. No record is pushed out to the world’s resolvers. Authoritative nameservers hold the current answer and wait to be asked; every other machine in the chain keeps a copy for as long as it was told to. So the delay you are sitting through is never Cloudflare publishing the change — Cloudflare’s own documentation puts that at within five minutes, usually much less. It is a cache expiring, and which cache decides what you should do about it.
Four places the old answer can be sitting
A lookup walks down this stack and stops at the first layer that already has an answer. Restarting your browser fixes exactly one of these layers. Waiting fixes another. The bottom two are not caches at all and never fix themselves — a delegation that points at the wrong nameservers will still be wrong tomorrow.
Start by asking the authoritative nameserver
Before diagnosing anything, find out what Cloudflare is actually publishing. Querying a Cloudflare nameserver directly skips every cache above it:
dig @1.1.1.1 example.com NS +short
dig @hera.ns.cloudflare.com www.example.com AUse whichever nameserver names the first command returns for your zone. The answer splits the problem cleanly in two:
- The new value is there. Cloudflare has done its part. The remaining wait is a cache above it, and the sections below cover which one.
- The new value is not there, or the query fails. The record was not saved as you think it was, the hostname does not match exactly, or your zone is not delegated to these nameservers at all. Skip to the delegation section.
Case one: the TTL has not run out
A resolver holding the previous record keeps it for the TTL it was handed at the time it cached it. That is the single most misunderstood point here: editing the TTL now has no effect on a copy that is already cached. The values Cloudflare allows:
| Record | TTL | Worst-case wait |
|---|---|---|
| Proxied (orange cloud) | Auto, fixed at 300 seconds, not editable | 5 minutes |
| DNS only, Auto | 300 seconds | 5 minutes |
| DNS only, custom | 60 seconds to 1 day (30 seconds on Enterprise) | Whatever you set — up to 24 hours |
| Nameserver (NS) TTL | 86,400 seconds by default | 24 hours |
Two consequences worth internalising. First, proxied records are pinned to five minutes precisely so Cloudflare can move its anycast addresses without stranding anyone — which means an orange-clouded hostname can never be more than five minutes stale. Second, the nameserver TTL is a separate 24-hour figure, so a zone that has just moved to Cloudflare can look inconsistent for a full day even when every record is correct.
Case two: the resolver cached “this does not exist”
This is the failure that sends people in circles. You add a brand-new subdomain, it returns NXDOMAIN, you lower the TTL, you flush your cache, you wait — and nothing changes.
The reason is negative caching. When a resolver is asked for a hostname that has no records, it caches the absence, so it does not have to ask again immediately. If anything queried your hostname before you created it — a monitoring check, a certificate probe, your own impatient browser — that empty answer is now stored. Per RFC 2308, its lifetime comes from the MINIMUM field of your zone’s SOA record, and Cloudflare’s troubleshooting guidance spells out what follows from that:
- Lowering the new record’s TTL changes nothing, because the entry being served is not your record.
- Flushing locally changes nothing, because the entry lives in the resolver upstream of you.
- Different resolvers queried the name at different moments and apply different limits, which is exactly why the result looks like it is “propagating” unevenly.
You can watch the countdown rather than guess at it:
dig +noall +answer +authority newhost.example.comIf the answer section is empty and the authority section returns your SOA, the number beside it is how many seconds remain before that resolver will ask again. To stop waiting on the two big public resolvers, purge the name directly at 1.1.1.1 and 8.8.8.8. The habit that prevents all of this: create the record first, and only then point anything at the hostname.
Case three: the zone is not really delegated to Cloudflare
If the authoritative query in the first step came back empty or failed, no amount of waiting will help. Check what the parent zone publishes, rather than what your registrar’s control panel claims:
dig +trace example.com NS +noall +authority +nodnssecThe usual causes, all of them things you have to go and fix:
- The nameservers do not match exactly. Each zone is assigned a specific pair, and re-adding a deleted domain gets a fresh pair. A previously working set may no longer be the right one, and typos like
cloudfare.comare common enough that Cloudflare calls them out by name. - Extra nameservers are still listed. The registrar should list the Cloudflare nameservers and nothing else.
- A stale DS record is still published. DNSSEC from your previous provider blocks the delegation and produces
SERVFAILuntil the old DS record is removed and its TTL at the parent has expired — commonly 24 to 48 hours for most top-level domains. - The registrar has not published the change yet. Some take up to 24 hours. This one really is a wait — but confirm it with
dig +tracerather than assuming.
A zone sitting in Pending Nameserver Update is Cloudflare telling you it cannot see the delegation either; the zone status reference explains what each state means, including the Moved state that eventually deletes the zone.
When DNS is correct and the site is still wrong
One case looks like a DNS delay and is not one at all. A proxied recordis answered with Cloudflare anycast addresses, never with your server’s address — so if you change the origin IP behind a proxied hostname, the DNS answer does not change. There is nothing for a resolver to re-fetch, and dig cannot confirm the change either way. The new origin takes effect at the edge within the same few minutes Cloudflare needs to publish it.
Toggling proxy status is the opposite case, and it is asymmetric. Turning the proxy off replaces a record whose TTL was pinned at 300 seconds, so it settles in about five minutes. Turning it on has to wait out the DNS-only TTL that was in force before — which, if someone set it to a day, means a day of visitors still reaching your origin directly. Lower that TTL first, then flip the switch. The proxy status reference covers what else changes with it.
Making the next change painless
- Lower the TTL on the records you are about to change to 60 or 300 seconds, and do it at least one old-TTL period in advance.
- Wait out the old TTL. Until it expires, resolvers are still handing out the long one.
- Make the change, then verify against an authoritative nameserver before testing anywhere else.
- Create records before anything queries their hostnames, so no negative cache entry is ever created.
- Once the change is stable, raise the TTL back up — long TTLs are good for everyone the rest of the time.
None of this needs a fourth tool: dig, the record itself, and knowing which of the four layers you are talking to will resolve nearly every “my DNS change is not working” report.
FAQ
How long does a Cloudflare DNS change take to take effect?
Cloudflare publishes the change on its own nameservers globally within five minutes, and usually much less. Everything longer than that is a cache somewhere else expiring — most often a recursive resolver still holding the previous record for the length of its TTL.
Why does my new DNS record still return NXDOMAIN?
Because a resolver asked for that hostname before it existed and cached the empty answer. The length of that negative cache comes from the MINIMUM field of your zone's SOA record, not from the TTL of the record you just created, so lowering the record's TTL does not shorten the wait.
Does lowering the TTL make a DNS change apply faster?
Only if you lower it before making the change. Resolvers that already cached the old record keep it for the old TTL, so the new, shorter value is only honoured once that entry expires. Lower the TTL a day ahead of a planned migration, then change the record.
How do I check whether Cloudflare has the new record?
Query a Cloudflare authoritative nameserver directly with dig @hera.ns.cloudflare.com example.com A, substituting one of the nameservers assigned to your zone. That bypasses every resolver cache, so it shows what Cloudflare is actually publishing right now.
Why does dig still show an old IP address after I changed a proxied record?
It does not — a proxied record is answered with Cloudflare anycast addresses, never with your origin IP. If dig returns your server's real address, that hostname is set to DNS only, or the answer you are looking at came from a cache that predates the change.
Does flushing my DNS cache fix a DNS change that has not applied?
Only when your own machine is the layer holding the stale answer. Flushing clears your operating system and browser caches, but the recursive resolver upstream of you — your ISP's, or a public one — keeps its copy until its own TTL runs out.