Tracking parameters fragment the key
utm_*, gclid, fbclid and friends create unique cache entries. Clean /pricing HITs; /pricing?utm_source=… MISSes. Campaign traffic looks like cold origin.
CDN cache correctness
CDN on, origin still hammered? CacheProbe is an external, ownership-gated audit that tells you whether cache is actually working on the pages and assets that matter — and why specific paths are MISS, DYNAMIC, or BYPASS.
You prove domain ownership first (DNS TXT, meta tag, or well-known file). Free-tier audits are rate-limited with hard GET budgets.
$ cacheprobe audit example.com
discovered 24 urls · deep-sampled 12 · ownership verified
/pricingHIT confirmed · Age rising on sequential GETs
/blog?utm_source=xutm_* fragments the cache key → MISS every campaign click
/docsHTML DYNAMIC while /assets/* HIT — origin still serves documents
/api/healthCache-Control: private · intentionally uncacheable
HIT
14
MISS
6
BYPASS
4
Illustrative sample · Edge Health deducts from 100 with evidence per finding
Normalizes cache status headers across
Cloudflare · Fastly · CloudFront · Vercel · Akamai · Netlify
The failure modes
Vendor dashboards show aggregate hit ratio. They rarely tell you which URL shapes miss, which HTML documents never cache, or that marketing parameters turned every campaign link into a unique cache key.
utm_*, gclid, fbclid and friends create unique cache entries. Clean /pricing HITs; /pricing?utm_source=… MISSes. Campaign traffic looks like cold origin.
Static CSS/JS looks healthy. Document responses stay DYNAMIC or BYPASS. Dashboards average them together and hide the expensive half.
Pricing, blog, docs, checkout shell, and assets often disagree. One curl on / is not an audit of the product surface.
Hit ratio is a fleet metric. Tickets need: this URL, this status, this Age, this Cache-Control — and a concrete fix.
How it works
Built for platform and SRE engineers who need path-level truth. We discover broadly, deep-audit a smart sample, and report what we actually measured — coverage stated honestly.
DNS TXT, HTML meta tag, or /.well-known/cacheprobe-verification.txt. No non-trivial probe runs until control of the domain is proven.
robots.txt (honored for CacheProbe), XML sitemaps, and a shallow same-origin link crawl. Builds an inventory under hard page/asset caps — not an unbounded site mirror.
Sequential GETs on selected pages and linked assets. Clean vs tracking-param variants. HIT confirmation via Age where possible. Multi-CDN status normalized into one vocabulary.
Score starts at 100 with transparent deductions. Each finding carries URLs, status, Age, and headers. Weak samples are marked Inconclusive — never invented hit ratios.
What we check
Phase 1 is cache correctness only. Capacity / stepped load is not included — when it ships later, it will be explicit and gated, not sneaked into “audit”.
Inventory from robots, sitemaps, and shallow crawl. Optional allowlist paths. Remaining deep slots fill from discovery under budgets.
cf-cache-status, X-Cache, x-vercel-cache, Age, and peers mapped into HIT / MISS / DYNAMIC / BYPASS language you can put in a ticket.
Compares clean URLs with tracking-parameter variants so campaign traffic does not silently destroy hit ratio.
Flags document responses that bypass while static assets HIT — a common origin-cost trap dashboards average away.
Status, Age, request URL, and response headers. Dry engineer language for remediations — no generative guesswork.
Ownership gate, sequential probes, robots honor, hard GET budgets, free-tier rate limits, identifiable User-Agent (see /bot).
What you get
The goal is not another chart. It is a report your team can act on after one ownership-gated run.
01
What failed, on which URLs, with severity grounded in evidence — not a wall of raw headers.
02
Starts at 100. Deductions listed with reasons. Inconclusive when the sample is too weak to score.
03
Normalized cache status, Age, Cache-Control, and CDN-specific headers attached to findings.
04
Engineer-facing fix language: cache keys, headers, and configuration — not marketing fluff.
Edge Health
Every point off is explained. Sample size and confidence matter: when data is weak, we say Inconclusive instead of inventing a hit ratio. Phase 1 scores cache correctness only — not capacity.
cf-cache-status: HIT
x-vercel-cache: HIT
Age: 1842
Cache-Control: public, s-maxage=3600
Vary: Accept-Encoding
x-cache: Hit from cloudfront
Compared to workarounds
Dashboards need a vendor account and show aggregates. Lighthouse is lab/client performance. curl works — but does not systematize discovery, multi-URL sampling, or a shareable score.
| Capability | CacheProbe | Dashboards | Lighthouse | curl |
|---|---|---|---|---|
| URL-level MISS / BYPASS diagnosis | manual | |||
| Multi-CDN status normalization | manual | |||
| Query-param fragmentation checks | manual | |||
| Ownership gate before probes | — | |||
| Evidence-backed Edge Health score | ||||
| Multi-URL sample + assets | manual | |||
| Production-safe sequential GETs | — | — | ||
| Client / lab performance metrics |
FAQ
Vendor dashboards need an account and show aggregate cache hit ratio. CacheProbe is an external, URL-level check that explains why a specific path is MISS, DYNAMIC, or BYPASS — and how to fix the cache key or headers.
You can. CacheProbe discovers a same-origin URL sample (robots, sitemaps, shallow crawl), then systematizes sequential Age checks, clean vs tracking-param URLs, multi-CDN status normalization, and a best-practice checklist into a report you can paste into a ticket.
Lighthouse is lab and client focused. It does not detect query-parameter fragmentation across CDN cache keys or normalize cf-cache-status, X-Cache, and x-vercel-cache into one multi-URL report.
Get started
Create an account, verify ownership, launch a probe. You get findings, Edge Health, and header evidence — not a synthetic load curve.