← Blog

How to Audit Cache-Control Headers for Pages With Frequently Updated Prices

2026-10-28 · IndexNowFast Team
How to Audit Cache-Control Headers for Pages With Frequently Updated Prices

Quick Answer

How to Audit Cache-Control Headers for Pages With Frequently Updated Prices starts with a known price change and a comparison of origin and CDN responses. Check the returned prices, Cache-Control directives, Age, and cache status. Find the first layer serving the old price, fix its delivery path, and retest before requesting a Google recrawl.

Key Takeaways

A reliable price-cache audit checks both HTTP behavior and the price customers actually see.

  • Record the correct product price and its update time before testing a cached page.
  • Compare full GET responses from the origin and CDN using the same product, currency, variant, and request context.
  • Read Cache-Control and Age together; a cache HIT does not prove that a price is correct or stale.
  • Use no-cache when stored content must be validated; no-store prevents storage and serves a different purpose.
  • Check whether validators and stale-while-revalidate rules can keep an older price visible after an update.
  • Compare browser prices, pricing APIs, structured data, and merchant feeds when the HTML response appears correct.
  • Retest the fixed delivery path before treating a remaining Google price mismatch as a crawl problem.

The main decision is straightforward. Find where the correct price first becomes wrong. That point usually gives the team its best lead for the repair.

How to Audit Cache-Control Headers for Pages With Frequently Updated Prices

Start with one product, one confirmed price change, and two response paths. Compare what the origin generates with what the public CDN serves. A response header alone is not enough. You also need the price in the response body.

This matters because a cache can follow HTTP rules and still serve an old price. The HTTP caching standard, RFC 9111, defines when stored responses may be reused. It does not decide how quickly your store must publish a new sale price.

Establish the correct price and update time

Use your commerce platform as the starting point. Record the product ID, SKU, selected variant, currency, and expected price. Add the time the price changed, preferably in UTC.

For a U.S. product page, the record might show a price change from $49 to $45. The store could also have a scheduled sale or a regional price rule. Those details affect which price is correct for a given request.

Check the price that actually applies to the test visitor. A logged-in wholesale customer may see a different amount from a guest. Likewise, a product variant or shipping region may change the price. Keep these inputs fixed throughout the test.

Otherwise, you may compare two correct responses for different shoppers and mistake the difference for a cache fault. The checkout price also deserves attention. A product page showing $45 while checkout still shows $49 may point to a wider commerce-data problem.

Capture complete origin and CDN responses

Request the public product URL with GET. Save the headers and response body. This lets you inspect the cache policy and the HTML price from the same response.

The command below uses an example domain. Replace it with a product URL you control.

``bash curl -sS \ -D edge-headers.txt \ -o edge-body.html \ 'https://shop.example.com/products/example' ``

Inspect Cache-Control, Age, Date, ETag, Last-Modified, Vary, and any CDN status fields. Then search the saved body for the relevant price and Product structured data.

A HEAD request can provide a quick header check. But it does not return the response body. Some systems also handle HEAD and GET differently. Use GET for the main audit.

Next, request the same representation from an authorized origin endpoint. Your platform or CDN team may provide an approved origin test route. Do not expose a private origin address or bypass access controls without permission.

Match the host, URL path, query, variant, language, cookies, and other price-related inputs. Keep both responses with their request times. The goal is to compare equivalent representations, not merely two URLs that look similar.

Repeat the test after a known price change

Take a normal public-edge sample after the change. Then compare it with a fresh authorized origin response. Repeat at planned intervals based on your site's allowed price delay.

You can also make a diagnostic request that asks caches to validate stored content:

``bash curl -sS \ -H 'Cache-Control: no-cache' \ -D validation-headers.txt \ -o validation-body.html \ 'https://shop.example.com/products/example' ``

This request is useful, but it does not guarantee an origin bypass. A CDN may apply its own rules. Always record what happened rather than assuming the request forced a fresh response.

If the origin returns $45 while the normal edge response still returns $49, you have a clear direction for further checks. Inspect CDN caching and invalidation before blaming Google.

If both return $49, the stale price may already exist in the origin's output. Review the commerce source, server rendering, template cache, or application-level data cache. Keep the saved bodies and headers. A timestamped comparison is far more useful to an engineer than a screenshot of the wrong price.

Read Cache-Control, Age, and CDN Status Together

The useful question is not simply whether a page was cached. It is whether the cached response could still be reused when its price became outdated. That depends on the effective cache policy, response age, and validation behavior.

A cached response can be valid under HTTP rules yet fail your store's price-freshness goal. That distinction should guide any configuration change.

Compare max-age, s-maxage, and Age

The max-age directive sets a freshness lifetime in seconds. The s-maxage directive sets a lifetime for shared caches, such as a CDN. Where it applies, s-maxage takes precedence over max-age for that shared cache. The Age header gives an estimate of how long the response has aged since generation or validation.

The MDN Cache-Control reference explains these directives and their effect on cached reuse.

Suppose a response has these fields:

``http Cache-Control: public, max-age=60, s-maxage=300 Age: 240 ``

In a simplified case, the shared cache has about 60 seconds of nominal freshness left. That is 300 minus 240 seconds. Actual HTTP age calculations can also involve Date, request delays, and other rules.

The 300-second setting is an illustration, not a recommended price-page TTL. Imagine the product price changed 20 seconds ago. The cache may still consider the old response fresh. Yet your store may require price updates to appear much sooner. The right choice depends on your business's allowed delay.

A store running flash sales may need a different approach from one that updates prices once a week.

Decide between validation and storage policies

Cache directives make different promises. They should not be treated as a single switch between safe and unsafe pricing. The comparison below shows what each directive means for price-page delivery. These are HTTP rules, not universal configuration recommendations.

DirectiveEffectPrice-audit consequence
max-age=NSets freshness lifetime in seconds.Check whether it exceeds the allowed delay.
s-maxage=NSets shared-cache freshness lifetime.Inspect the CDN's effective policy.
no-cacheRequires validation before stored reuse.Storage remains possible.
no-storeInstructs caches not to store the response.Consider where storage is unacceptable.
must-revalidateRestricts reuse once stale.It does not shorten a fresh lifetime.
stale-while-revalidate=NAllows bounded stale reuse during revalidation.An old price may appear during that period.

For many sites, the real choice is between a short freshness window and reliable invalidation. Turning off all storage may solve one concern while raising load or response-time costs. The correct policy depends on the page's design.

Personalized pricing may also require private caching or carefully designed cache keys. Do not share a customer-specific price through a cache meant for all visitors.

Interpret cache status without guessing

CDNs often expose a status field showing how they handled a response. On Cloudflare, the CF-Cache-Status field may report HIT, MISS, BYPASS, DYNAMIC, REVALIDATED, or other states. The Cloudflare cache-response documentation explains these values and the related Age behavior. Other CDN providers use their own headers and meanings.

A HIT shows that cached content was used. It does not show whether the price matched your catalog. A MISS may lead to a newly fetched response, but the origin itself could still supply an outdated value.

Do not use Age as a pass-or-fail score either. A response with a high Age may still contain the correct price. A newly served response can contain an old price if its upstream data is wrong.

Compare the body and the headers as one piece of evidence. The CDN status helps explain how the representation arrived. The returned price tells you whether it was suitable for the shopper.

Locate the Stale Price Across Every Delivery Layer

The first incorrect representation gives the strongest clue about ownership. Compare prices in a fixed order, starting with the authorized commerce source. Move outward through origin, CDN, browser, and Google-facing data. The comparison below separates common symptoms that can look identical to a shopper. Each one needs a different next test.

Observed mismatchLikely area to inspectNext action
Catalog correct; origin wrong.Application or source-data cache.Check rendering and upstream price data.
Origin correct; CDN edge wrong.Edge cache or invalidation.Review TTL, cache key, purge, and validation.
Edge HTML correct; browser wrong.Client-side resources.Inspect JavaScript requests and service workers.
Visible price correct; JSON-LD wrong.Structured-data generation.Compare initial and rendered markup.
Landing page correct; feed wrong.Merchant data sync.Compare feed price and update time.
All current; Google still shows old price.Crawl or processing delay.Check relevant Google reports.

This is a fault-isolation tool, not proof from symptoms alone. A price can be stale in more than one place. Follow the evidence until you can reproduce the mismatch.

Origin wrong versus edge wrong

If the origin has the old price, changing the CDN TTL will not fix the data it receives. Inspect the product database, pricing service, server-rendered templates, and application cache first.

If the origin is correct but the edge serves the old price, check how the CDN stores and refreshes that response. Look for a long shared-cache lifetime, missing purge event, stale cache key, or failed revalidation.

The Vary header may also matter. It tells caches about certain request fields that affect representation selection. CDN-specific cache-key settings can add more variation.

For a U.S. store, currency, region, variant, and shopper type may change the correct price. A cache that mixes those contexts can cause more than a slow update. It may serve a response meant for a different shopper.

HTML correct but browser or structured data wrong

Sometimes the HTML delivered by the CDN is current, but the browser still shows the old price. In that case, inspect the network calls made after the page loads. A JavaScript pricing endpoint may have its own Cache-Control policy. A service worker may serve a stored response. Browser storage or application state can also preserve an earlier value.

Check Product structured data separately. Google recommends placing merchant-listing Product data in the initial HTML where possible. Its merchant-listing structured-data guidance warns about limits with JavaScript-generated markup, especially for fast-changing prices and availability.

Compare the visible price with offers.price, the currency, and any relevant variant. A page showing $45 while its JSON-LD still says $49 is not consistent, even if the CDN served the latest HTML file.

If a variant is missing key product content or renders a faulty page, that may call for a separate product-variant Soft 404 investigation. That problem is distinct from a valid product page carrying a stale price.

Landing page correct but merchant feed wrong

An accurate live page does not guarantee accurate Merchant Center data. The feed may still have an old price, a mismatched currency, or the wrong sale interval. Google's Merchant Center price-mismatch guidance identifies several possible causes. These include timing differences, wrong markup, JavaScript behavior, and differences between what users and Google can access.

The Merchant Center product-data requirements also make accurate price and availability data central to eligible product listings. Check the rules that apply to your product and market.

For a U.S. product, compare the USD price in the feed with the landing page and checkout. Match the variant and sale state. Record when each value last changed.

If the feed is wrong, an edge-cache purge may have no effect. The merchant-data pipeline needs its own repair.

A Worked Price-Change Audit From Symptom to Verified Fix

Consider a fictional U.S. store selling a product for $49. A scheduled update lowers the price to $45. The origin responds with the new price, but shoppers still receive $49 from the CDN. The following case is hypothetical. Its prices, headers, times, and repair results illustrate how an audit can work. They are not measurements from a real store or CDN.

Compare the evidence before the repair

Assume the price changed at 14:00 UTC. The product is a single variant sold to U.S. guest shoppers in USD. Both test paths use the same product and request context. At 14:01 UTC, the origin returns $45. The public edge still returns $49.

The edge response reports a cached HIT with Age: 120 and an effective s-maxage=300 policy. The evidence can be recorded like this:

Check at 14:01 UTCExpectedObservedMeaning
Catalog price.$45.$45.Source is current.
Origin HTML.$45.$45.Origin is current.
CDN-edge HTML.$45.$49.Edge is serving old content.
CDN cache status.Inspect response.HIT.Stored content was used.
Edge Age.Inspect seconds.120 seconds.Response remains within the example TTL.
Product JSON-LD at edge.$45.$49.Edge representation has old markup.

The origin-edge difference is the decisive finding. It rules out an outdated origin response for this specific test. It does not yet prove which CDN setting caused the stale representation.

With s-maxage=300 and Age: 120, the simplified remaining freshness window is 180 seconds. That is enough for a cache to reuse the old content under the assumed policy. The price change and cache lifetime were not aligned. The engineering team now has a clear area to investigate.

Choose the correction and retest

First, inspect the price-update workflow. Does it send a purge event for the product page? Does it refresh all affected variants and locales? Does the CDN cache key match the product's actual pricing rules?

For this fictional case, assume the missing purge event is confirmed. The team repairs that event and purges the affected cached representation. A normal edge request is then repeated at 14:04 UTC. The illustrative retest shows the change:

Retest itemBefore fixAfter fix
Authoritative price.$45.$45.
Origin price.$45.$45.
Public edge price.$49.$45.
Edge structured-data price.$49.$45.
Purge workflow.Event missing.Event runs.
Test result.Stale edge response.Tested edge response is current.

This supports a successful repair for the tested path. It does not prove that every edge location, browser session, or shopper context is current.

Repeat the test from the regions your store serves. Check the normal URL, not only a cache-busted address. A unique query string may fetch a different cache entry and hide the problem.

For future checks, keep a record with the product ID, URL, price-change time, origin result, edge result, key headers, suspected layer, repair owner, and retest result. Add currency, locale, variant, and test region where they can change the response.

This small record can settle an otherwise vague incident. Merchandising can confirm the price. Engineers can identify the layer. The SEO team can then decide whether any Google-side action remains useful.

Verify the Fix Before Requesting a Google Recrawl

A cache fix is complete only after the right price reaches the required public response paths. A deployment log or successful purge command is not enough on its own. Set a clear acceptance rule. It should reflect the store's allowed price delay, not an arbitrary number copied from another site. Then test the same type of price change again.

Run a controlled acceptance test

Use the authorized commerce source as the price reference. Confirm that the origin responds correctly and that normal public-edge requests match it within the allowed delay. A practical post-fix test should cover the paths that can affect shoppers and Google-facing data. The checks below turn the diagnosis into a repeatable process.

  • Confirm the expected price, currency, variant, and update timestamp in the commerce system.
  • Fetch full origin and edge responses using the same request context.
  • Compare the actual HTML prices, HTTP status, Cache-Control, Age, and relevant CDN fields.
  • Inspect browser network calls when the page fetches prices with JavaScript.
  • Check Product structured data against the visible and authorized prices.
  • Compare merchant feed data and checkout prices where applicable.
  • Repeat the test after a fresh price update, not just after a manual purge.

A passing result shows that the tested delivery paths met the store's defined price-freshness goal. Keep the timestamps and responses as evidence. If one path still fails, return to that layer. Avoid marking the incident closed because another path looks correct.

Separate Google delays from site-side faults

Once the page, structured data, and feed agree, a remaining Google-visible old price needs a different investigation. Check the affected Google surface and the reports available for it.

Google's recrawl guidance makes clear that requests do not guarantee immediate crawling or indexing. Crawl timing and visible updates can vary.

Organic search results and Merchant Center listings do not share one simple update process. A Merchant Center warning may require product-data checks. An organic result may depend on later crawling and processing.

For a broader workflow after technical repairs, see the site's guide to requesting and checking a Google recrawl. The site's blog index can help locate other technical troubleshooting articles. The XML sitemap index is a separate site-discovery resource, not a cache-freshness test. Use these crawl resources only after the stale delivery issue is resolved, not as a replacement for fixing it.

No recrawl request can prove that a CDN now serves the correct price. That proof must come from the response tests themselves.

Common Audit Errors That Produce False Conclusions

The easiest way to misdiagnose a price-cache issue is to test two different representations. A product page can vary by currency, location, cookie, login state, or selected variant. If those inputs change, the comparison may be invalid before you inspect any header.

Another common error is relying on a HEAD request. It can show useful headers, but it cannot show the price in the response body. Use a complete GET response to establish what the tested path actually delivered.

A large Age value is not proof of a stale price. Nor is a cache HIT. Both describe delivery behavior. The returned price must still be compared with the expected value and its update time.

Be careful with Cache-Control: no-cache as well. It does not mean that storage is disabled. It calls for validation before reuse. A diagnostic request with that directive also may not bypass every intermediate cache.

Conditional responses need care. The MDN HTTP caching guide explains how ETag, Last-Modified, and conditional requests support validation. A 304 Not Modified response can be correct. But it deserves investigation if the representation should have changed and the validator was not updated.

Finally, do not stop at the HTML response if the page loads price data later. A fresh document can still show an old amount from a cached API call. A service worker may also serve stored data that your origin-and-edge test never touched.

A reliable audit compares the right representation at the right time. It separates what each response header proves from what the price data proves.

Frequently Asked Questions About Price Cache Audits

These answers cover the decisions that often remain after the first header check. They explain storage, validation, stale responses, and shopper-specific pricing. Use them after comparing origin and CDN responses, especially when the headers alone do not explain the price customers see. Each CDN and commerce platform may apply its own delivery rules, so confirm behavior with the actual response and a controlled retest.

Does Cache-Control: no-cache stop a page from being stored?

No. It allows a response to be stored but requires validation before reuse. Use no-store when the response should not be stored by compliant caches. Neither directive should be chosen without considering the page's data, privacy needs, and delivery design.

Is a CDN HIT proof that a price is stale?

No. HIT shows that a stored response was used. Compare the returned price with the authorized commerce value. A cached response may contain the correct price, while an uncached response may still contain old source data.

Can a 304 Not Modified response keep an old price visible?

Yes, if validation incorrectly treats a changed representation as unchanged. But a 304 response is normal when the representation has not changed. Check the origin's validator logic and the actual price before calling it a defect.

Should every frequently updated price page use no-store?

No. Some stores can use short cache lifetimes or event-driven invalidation. The right policy depends on allowed price delay, shopper context, server load, and the risk of showing outdated prices. Personalized prices need special care.

What does stale-while-revalidate mean for a sale price?

It can allow a cache to serve an old response briefly while it checks for an update. The permitted stale period is set by policy. If that delay exceeds the store's price-freshness goal, the policy or update workflow needs review.

Why can Google show the old price after a CDN fix?

Google may have fetched the page before the fix or may still be processing product data. Confirm the affected Google surface first. Then check current landing-page markup, merchant feed information, and available crawl reports.

How should regional or personalized prices be audited?

Test each relevant shopper context separately. Match currency, locale, product variant, cookies, and login state. Shared caching must not mix prices meant for different users. Use approved test accounts and avoid exposing private pricing data.

Is a successful cache purge enough to close the incident?

Not by itself. Fetch the normal public product URL again and inspect the returned price. Repeat from relevant regions and test the next price update. The repair passes only when the observed behavior meets the store's defined freshness goal.

Final Recommendation: Fix the First Incorrect Price Layer

Treat price freshness as a delivery test, not an indexing guess. Begin with the authorized price and its update time. Compare the same product response at origin and edge, then inspect browser behavior, structured data, and merchant feeds where needed.

Repair the first layer that returns an incorrect value. Afterward, run the same controlled test and save the results. A correct origin response does not prove that the CDN is correct. Likewise, a successful CDN purge does not prove that every browser or merchant feed has updated.

The most useful outcome is a clear record of what was wrong, who fixed it, and how the fix was checked. That record also helps prevent repeated incidents during sales and frequent catalog updates.

Only move to Google recrawl or merchant diagnostics once the site-controlled price data is correct. This keeps engineers focused on delivery faults and prevents SEO work from becoming a substitute for a needed technical repair.