Skip to main content
Card class: Non-HeroCategory: Website Performance

At a glance

List of static resources with weak or missing cache-control headers, ranked by repeat-visit cost. Lighthouse’s “Serve static assets with an efficient cache policy” audit identifies images, CSS, JS, and fonts where the Cache-Control header sets a short TTL (under 1 month) or is missing entirely. Repeat-visitors pay these bytes again instead of serving from browser cache. The fix is purely server-side header configuration; no code changes required.
What it countsPer resource: URL, file size, current cache TTL, recommended TTL, byte-savings on repeat visit. Sorted by potential repeat-visit savings.
Why caching matters for ecommerceEcommerce traffic has high repeat-visit rates (returning customers, cart-abandonment recovery, branded search). Brands with weak caching pay full bytes on every visit instead of serving the static portion from browser cache. Strong caching cuts repeat-visit page weight by 60-80 percent (everything except dynamic HTML serves locally).
Cache-Control TTL recommendations(1) Hashed/versioned assets (e.g. app.a3f8b9.js with content hash in filename): Cache-Control: public, max-age=31536000, immutable (1 year). Safe because filename changes when content changes. (2) Non-versioned but stable (logos, fonts that rarely change): max-age=2592000 (30 days). (3) Frequently-changing static files: max-age=86400 (1 day) or must-revalidate for stale-while-revalidate behaviour. (4) HTML: no-cache or short TTL (5-60 minutes); HTML is dynamic.
Common ecommerce caching gaps(1) Theme assets without versioning: BC Stencil bundles *.css and *.js without content hashing; default cache TTL is conservative. (2) Product images served via image CDN: usually well-cached by the CDN, but custom-uploaded merchant images sometimes serve with 1-day TTL by default. (3) Third-party scripts: vendors like Klaviyo, Tidio set their own headers; the merchant doesn’t control these. (4) Font files: should be very long-cached (1 year) since fonts almost never change, but defaults are sometimes 1 day.
Sample typeLab data from Lighthouse audit. Each resource’s Cache-Control header is read from the actual HTTP response.
Why this is the easiest optimisationNo code changes needed. Edit server / CDN / image-CDN configuration to set proper Cache-Control headers. Edits apply within minutes; impact appears immediately for all repeat visitors.
Currencyn/a, list with byte-savings annotations.
Time windowT (current state).
Alert triggertotal cacheable bytes > 500KB shipped on repeat visit.
Sentiment keynull
Rolesowner, operations

Calculation

Calculated automatically from your Website Performance (PageSpeed + CrUX) data. See the At a glance summary above for what the metric tracks and the worked example below for a typical reading.

Worked example

A UK-based BigCommerce fashion store homepage audit, mobile, Wednesday 15 May 26.
RankResourceSizeCurrent TTLRecommendedRepeat-visit savings
1stencil-bundle.js (theme JS)132KB1 day1 year (with hash)132KB
2hero-banner-spring.png2,840KB1 hour30 days2,840KB
3stencil-bundle.css (theme CSS)134KB1 day1 year (with hash)134KB
4inter-regular.woff2 (font)60KB1 day1 year60KB
5inter-bold.woff2 (font)60KB1 day1 year60KB
6product-1234-detail-1.jpeg480KB1 hour30 days480KB
7klaviyo-popup.css28KB(no Cache-Control)(vendor controls)(out of scope)
8tidio-chat.js148KB1 day(vendor controls)(out of scope)
Merchant-controlled total3,706KB3,706KB
What the ranked list is telling us:
  1. 3.7MB of repeat-visit bytes are currently re-downloaded unnecessarily because cache TTLs are too short. A returning customer hits the site, downloads the same theme JS, hero image, fonts, and product images they downloaded yesterday. The browser would happily serve from cache if the headers said it could.
  2. Theme JS + CSS at 1-day TTL is the simplest fix. BC’s default is conservative because Stencil bundles aren’t content-hashed by default, so the browser can’t tell when content has actually changed. Two paths: (a) Add content-hashing to theme bundle filenames so cache TTL can be 1 year safely (bundle.a3f8b9.js); (b) Use etag validation so browsers re-validate efficiently without re-downloading. Path (a) is more performant; path (b) is simpler to ship.
  3. Hero banner image at 1-hour TTL is wasteful. The image rarely changes; the 1-hour TTL forces every repeat visitor to re-download 2.8MB. Set 30-day TTL via the image CDN configuration; if the merchant changes the hero image they’ll need to update the URL or trigger a CDN purge, which is fine for occasional content updates.
  4. Web fonts at 1-day TTL is wrong. Fonts almost never change. Set 1-year TTL with immutable directive; fonts are the canonical case for aggressive caching.
  5. Product images at 1-hour TTL is the same pattern as the hero. Image CDNs typically handle this well but per-merchant configuration sometimes drifts to conservative defaults. Bulk-update via CDN console: set 30-day TTL across product image bucket.
  6. Klaviyo + Tidio scripts (ranks 7-8) are vendor-controlled. The merchant can’t change these. Out of scope for the merchant; raise with the vendor if it becomes a sustained issue.
  7. Cumulative impact: setting proper TTLs across ranks 1-6 saves 3.7MB of repeat-visit bytes. Returning customers experience load times near zero for static content; only the dynamic HTML hits the network. For ecommerce, this is the closest thing to “free” performance: zero code changes, immediate impact, proportional to repeat-visit traffic share (typically 40-60 percent of total sessions).
  8. Industry data: brands with strong caching see 30-50 percent faster repeat-visit LCP than first-visit LCP. The conversion rate impact is smaller than first-visit work (most users are first-visit on a given page) but the cumulative effect across all repeat visitors is meaningful.
Diagnostic flow:
  1. Check Cache-Control headers in DevTools Network tab; the “Cache” column shows TTL.
  2. Identify high-byte resources with short TTL. Concentrate on resources over 100KB with TTL under 7 days.
  3. Configure CDN / server / image-CDN to set proper TTLs.
  4. Re-audit to confirm headers updated as expected.
Rapid-response playbook:
Time horizonAction
First 1 hourIdentify top 3 cacheable resources with weak TTL.
First 24 hoursConfigure CDN / server to set 30-day or 1-year TTL on stable assets.
Re-auditConfirm headers updated.

Sibling cards merchants should reference together

CardWhy merchants reach for it
psi_total_weightFirst-visit page weight; caching reduces repeat-visit weight.
psi_image_optimisationImage format + caching combined cut repeat-visit cost dramatically.
psi_render_blockingCached CSS/JS still parse + execute, but skip the network download.
psi_third_party_costThird-party scripts often have weak vendor-controlled cache headers.
crux_lcp_p75Repeat-visit LCP improves with strong caching.
psi_perf_score_summaryComposite score; caching contributes via LCP improvement.
psi_top_opportunities_bytesComposite byte-savings ranking.

Reconciling against the vendor’s own dashboard

Where to look:
  • PageSpeed Insights, “Serve static assets with an efficient cache policy” opportunity in Diagnostics.
  • Chrome DevTools → Network tab, the “Cache” column shows TTL per resource; “Disable cache” checkbox lets you compare cold-cache vs warm-cache load times.
  • CDN / image-CDN console, usually the right place to configure default cache TTLs for static assets.
Why the Vortex IQ caching opportunities may differ from PSI:
ReasonDirectionWhat to do
CDN edge state. Different CDN edges may cache differently; PSI runs from Google’s infrastructure which may hit different edges than your audit’s region.Either directionUse a single edge for direct comparison.
Recent CDN config change. A recent header update may not have propagated to all edges.Vortex IQ may show stale stateWait 5-10 minutes after CDN config changes; re-audit.
Cross-connector reconciliation: primarily internal (with psi_total_weight, psi_image_optimisation). Quick rule for support tickets: if a merchant says “I set 1-year TTL on my CDN but Vortex IQ still flags the resource”, the most common cause is CDN edge propagation delay or origin-cache vs edge-cache configuration mismatch. Verify the actual Cache-Control header in DevTools Network tab.

Known limitations / merchant FAQs

My theme bundle has 1-day cache. Why is that a problem? It forces every repeat visitor to re-download 130-300KB of theme JS+CSS that almost certainly hasn’t changed since their last visit. Strong caching (1-year with content hashing) makes the browser skip the download entirely and use the local cached copy. For ecommerce sites with 40-60 percent repeat-visit traffic, this is a substantial win. What if I update my theme? Won’t long cache TTLs cause stale content? Only if you don’t use content-hashing. The pattern: when your build process generates bundle.a3f8b9.js (with content hash in filename), every theme update produces a new filename. Old browsers serve the old bundle from cache; new browsers fetch the new bundle. Cache invalidation is automatic via the URL change. Can I just set 1-year TTL on everything? Not on HTML. HTML pages are dynamic (cart state, login state, dynamic pricing) and need short cache TTLs. HTML default: no-cache or 1-5 minute TTL with revalidation. Static assets (images, CSS, JS, fonts) can be aggressively cached. My image CDN says it’s caching, but Lighthouse flags my images. Why? The CDN may be caching at the edge but the Cache-Control header sent to the user’s browser is shorter. Two-tier caching: CDN serves to users, but the user’s browser only caches per the response header. Check the actual response header in DevTools Network tab; the CDN edge cache and browser cache are different layers. What about service workers? Do they handle this? Service workers can cache more aggressively than HTTP Cache-Control allows, including offline support. For ecommerce, service workers are powerful but complex; most merchants achieve adequate caching via standard HTTP headers without the maintenance overhead of service worker code. Can Vortex IQ change my CDN config automatically? Read-only by design. The card identifies what should be cached longer; the merchant or developer configures the CDN. My third-party scripts (Klaviyo, GTM, Tidio) have short TTLs. Can I fix that? Generally no; vendors control their own headers. Workarounds: (a) self-host the script if vendor permits (rare); (b) live with the cost. Most third-party scripts cache reasonably (1-day to 1-week) by default; if you see very short TTLs (under 1 hour), raise with the vendor. Should I worry about caching for first-time visitors? No. Caching helps repeat visits; first visits download everything regardless. First-visit performance is driven by image optimisation, render-blocking fixes, and JS bundle work. Caching is the repeat-visit lever.

Tracked live in Vortex IQ Nerve Centre

Caching Opportunities is one of hundreds of KPI pulses Vortex IQ tracks across Website Performance (PageSpeed + CrUX) and 70+ other ecommerce connectors. Nerve Centre runs the detection layer; Vortex Mind investigates the cause when something moves; Ask Viq lets you interrogate any number in plain English. Start for free or book a demo to see this metric running on your own data.