A CDN cache MISS is not one problem. It is a symptom with several possible causes: cache-control headers, cookies, query strings, request methods, origin behavior, or a vendor rule you forgot was enabled months ago. This checklist gives you a practical workflow for CDN cache miss troubleshooting so you can stop guessing, isolate the variable that matters, and fix the miss without breaking dynamic content that should stay uncached.
Overview
If you are asking why cache miss keeps appearing in your CDN logs or response headers, the fastest path is to troubleshoot in layers. Start with what the client requested, move to what the CDN was allowed to cache, then confirm what the origin actually returned. That order matters. Many teams jump straight into vendor dashboards and miss an obvious blocker such as a Set-Cookie header on an otherwise static asset or a query string variation that turns one cacheable object into hundreds of unique objects.
This article is designed as a reusable checklist. You can use it when a single URL is not caching, when an entire path seems to bypass edge caching, or when cache hit ratio drops after a release.
Before you begin, collect one example request and keep it consistent through the workflow:
- The full URL, including query string
- The HTTP method used
- The response headers from the CDN
- The response headers from the origin, if you can test origin directly
- Any CDN-specific cache status header such as HIT, MISS, BYPASS, EXPIRED, or REVALIDATED
Use command-line or browser tools that show raw headers. For example, a simple curl -I https://example.com/path/file.css request often tells you more than a dashboard summary. If your CDN allows origin override testing, compare the same request at the edge and at origin. The goal is to answer one core question: was the response uncacheable, or was it cacheable but fragmented into too many variants?
A useful mental model is this:
- Not cacheable: the CDN is intentionally skipping storage because headers, methods, or rules say not to cache.
- Cacheable but not reused: the CDN stores responses, but each request differs due to cookies, query strings, headers, geography, device logic, or personalization.
- Previously cached but no longer serving from cache: TTL expired, purge happened, origin changed headers, or a new rule bypasses the path.
If you want a broader explanation of architecture choices, see Reverse Proxy Cache vs CDN: What’s the Difference and When Do You Need Both?.
Checklist by scenario
This section breaks the diagnosis into common scenarios. Work top to bottom. In most cases, the root cause appears in one of these groups.
Scenario 1: A static asset should cache, but always returns MISS
This is the cleanest case to debug because static assets usually have predictable behavior.
- Confirm the request method is GET or HEAD. Most CDNs will not cache POST responses by default, and some do not cache other methods without explicit rules.
- Inspect origin headers. Look for
Cache-Control: no-store,private, ormax-age=0. Also checkPragma: no-cacheon older stacks. - Check for
Set-Cookie. A stylesheet, JavaScript file, or image that sends a cookie often gets treated as dynamic. This is a common cause of “CDN not caching response” reports. - Check content type and file path rules. Some CDN policies cache only certain extensions or paths unless you define broader rules.
- Repeat the same request twice. The first request may be a MISS because the object is filling the cache. The second should be a HIT if the response is cacheable and the cache key is stable.
- Verify the URL is exactly the same. A versioned file path is good. Random query strings are not. If your build process appends changing parameters, you may be creating a new cache key each time.
For a deeper static asset strategy, review How to Cache Static Assets for Faster Core Web Vitals.
Scenario 2: HTML pages are missing unexpectedly
HTML is where edge caching gets complicated. Many teams want better TTFB, but pages include sessions, personalization, or commerce logic.
- Identify whether the page is supposed to cache at all. Logged-in pages, carts, checkout flows, account areas, and personalized dashboards are typical bypass candidates.
- Check for cookies on the request. CDNs commonly bypass cache when session or authentication cookies are present. A harmless-looking analytics or A/B test cookie can also split the cache depending on vendor settings.
- Look at response directives.
private,no-store, and low TTL values reduce or disable edge caching. Some applications set these globally for all HTML, even when many pages could be cached safely. - Inspect query strings. Marketing parameters like
utm_sourcemay create unnecessary variants. If the CDN includes the full query string in the cache key, one page can fragment into many misses. - Review edge rules. A page rule, cache rule, worker, or reverse proxy config may bypass specific paths, cookies, or header patterns.
- Check whether your framework sends varying headers.
Vary: Cookieor broadVaryrules can effectively eliminate reuse.
If your site runs WooCommerce or similar commerce logic, be especially careful. Product listing pages may cache well, but cart, checkout, account, and session-aware fragments usually need bypass rules. See WooCommerce Caching Rules: What to Cache and What to Bypass.
Scenario 3: The first request misses, but repeat requests still do not turn into HITs
This usually means the cache key is unstable or the object is not being stored.
- Compare request headers between attempts. Are cookies appearing on one request but not another? Are different authorization headers being sent?
- Check for varying query strings. Even parameter order can matter in some setups if normalization is not configured.
- Look for revalidation behavior. A CDN may store the object but revalidate frequently due to short TTL or stale directives. Statuses such as REVALIDATED or EXPIRED are clues.
- Confirm cache-fill is not blocked by response size or status code. Some vendors do not cache responses above certain thresholds or skip non-200 responses unless configured.
- Inspect origin latency and conditional responses. If the CDN is repeatedly asking origin with
If-None-MatchorIf-Modified-Since, your TTL may simply be too short.
When your issue is not a full bypass but poor reuse, this becomes a cache hit ratio problem. See How to Improve Cache Hit Ratio on a CDN.
Scenario 4: MISS started after a deployment or plugin change
When cache behavior changes suddenly, assume configuration drift before assuming traffic patterns changed.
- Diff response headers before and after the release. A new plugin, middleware, or framework update may have added
Set-Cookieor changedCache-Control. - Check application-level caching plugins. On WordPress, security, optimization, and membership plugins often modify headers in ways that affect CDN caching.
- Review CDN rules changed during the rollout. New bypass rules, bot rules, or worker logic may override origin intent.
- Confirm purges were expected. A broad purge can temporarily raise MISS rates. That is not necessarily a problem unless objects fail to refill afterward.
- Test from multiple regions. Some edge networks refill per location, so behavior may differ briefly by geography.
WordPress users should also review their local stack. A page cache plugin, host cache, and CDN can interact in confusing ways. For plugin-side context, see Best WordPress Caching Plugins Compared.
Scenario 5: API responses are missing
API caching is possible, but it requires discipline around methods, auth, and cache keys.
- Confirm the endpoint is safe to cache. Public GET endpoints are easier candidates than authenticated or highly personalized responses.
- Check Authorization headers. Many CDNs bypass cache when auth is present unless you explicitly configure behavior.
- Review
Cache-Controland surrogate headers. Some stacks use separate edge-oriented directives for CDN behavior. - Reduce unneeded cache key inputs. If every request carries unique headers or tokens, the CDN sees every call as a separate object.
- Validate stale and purge behavior. APIs often fail because teams fear staleness but never define a purge or TTL model.
If you rely heavily on origin pull behavior and cost predictability, this is also a good point to review broader platform fit and estimate tradeoffs before changing vendors. See CDN Pricing Comparison Calculator Inputs: What Costs to Estimate Before You Choose.
What to double-check
Once you find a likely cause, slow down and verify it with a few targeted checks. This prevents the classic mistake of changing three settings at once and not knowing which one fixed the issue.
1. Cache-Control and related headers
These headers are still the first place to look. Check both edge and origin responses.
no-storeusually means do not cache anywhere.privateusually means not for shared caches.max-agecontrols freshness for clients and often influences shared caches.s-maxagemay be used specifically for shared caches such as CDNs.must-revalidatecan increase origin checks depending on your setup.
Make sure the header values match the content type. Static assets should usually get longer lifetimes than HTML.
2. Cookies on request and response
Cookies are one of the most common hidden blockers in edge caching. Double-check:
- Does the request send session, auth, cart, or preview cookies?
- Does the origin send
Set-Cookieon cacheable pages or assets? - Do your CDN bypass rules trigger on any cookie, or only specific names?
If you need a focused guide on this area, see CDN Cache Bypass Rules Explained: Cookies, Query Strings, and Headers.
3. Query string handling
Ask whether the query string changes the content. If not, it may not belong in the cache key.
- Marketing parameters often should be ignored for caching.
- Search, filter, and sort parameters may need selective caching, not full bypass.
- Cache-busting parameters can help during deployment but destroy reuse if overused.
4. Vendor-specific cache mode or rules
Most CDN cache miss troubleshooting eventually reaches a vendor setting. Review:
- Default cache level for static vs HTML
- Bypass rules by path, method, header, or cookie
- Edge worker logic that rewrites requests or headers
- Origin shield or tiered cache settings
- Status code caching behavior
This is especially important on platforms with flexible rules engines such as Cloudflare caching or edge compute layers. A rule intended to protect one path can quietly affect a much larger pattern.
5. Origin consistency
Make sure all origin servers return the same cache-related headers. In multi-origin or load-balanced setups, one inconsistent backend can create intermittent MISS behavior that is hard to spot.
6. Purge and TTL expectations
Do not diagnose a fresh purge as a broken cache. A temporary MISS after deploy is expected. The real question is whether the object becomes a HIT on subsequent requests. If you are actively invalidating content, use a safe purge process. See How to Purge CDN Cache Without Breaking Your Site.
Common mistakes
These are the errors that make debugging slower than it needs to be.
- Treating one MISS as proof of failure. The first edge request often fills the cache. Test repeated identical requests before concluding the CDN is not caching.
- Ignoring cache key fragmentation. A stored response can still behave like a miss problem when every visitor generates a unique variant.
- Testing while logged in. Authenticated sessions often bypass cache by design. Always test with a clean client as well.
- Assuming the CDN obeys only origin headers. CDN rules can override origin intent, for better or worse.
- Purging too broadly during diagnosis. This resets the evidence and creates more misses.
- Forgetting intermediate layers. Browser cache, reverse proxy cache, host cache, and CDN can each return different clues. Map the request path clearly.
- Changing headers globally. Removing
privateor cookies site-wide may improve hit ratio while breaking user-specific pages.
If DNS or routing changes are part of the incident, review infrastructure assumptions too. Start with DNS Performance Guide: How DNS Choice Affects Website Speed and Best DNS Providers for Speed, Uptime, and Managed Features.
When to revisit
This checklist is worth revisiting whenever the inputs behind caching change. In practice, that means more often than many teams expect.
Review your cache miss checklist:
- Before seasonal traffic spikes. Promotions, content launches, and holiday campaigns often introduce new query parameters, cache rules, or bypass logic.
- After framework, plugin, or middleware updates. Small header changes can have large edge-caching effects.
- When adding personalization, experiments, or bot controls. New cookies and request headers can quietly reduce cache reuse.
- After migrating CDN, hosting, or reverse proxy layers. Defaults rarely match your old environment exactly.
- When hit ratio drops or origin costs rise. A cache miss problem is often first visible as higher origin load and worse TTFB.
A practical maintenance routine is simple:
- Keep one test URL for static assets, one for anonymous HTML, and one for a dynamic page.
- Record the expected cache headers and expected CDN status for each.
- Retest them after releases and infrastructure changes.
- Document which cookies, query strings, and paths must bypass cache.
- Review purge rules and TTL policy quarterly.
If you do only one thing after reading this article, make it this: build a short internal runbook from the checklist above and attach example headers from your own stack. Generic caching advice is useful, but your real leverage comes from knowing exactly which requests should be HIT, which should be BYPASS, and which should never be cached at all.