Reads the numbers from Cloudflare Web Analytics and zone analytics (GraphQL or the dashboard) and says how many of them are real readers or real server errors, answered as JSON with the computed figures and a short reason. Knows what pollutes the table - the owner's own headless-browser checks, link-preview fetches from the social network that show up as referrals, the site's own Worker and its cache calls counted as visitors or as 5xx errors, the regional cache host of OpenNext, staging sharing a token - and what makes a true zero - the EU exclusion setting, a content security policy that allows the script but not the measurement request, sampling of data older than seven days. Use when asked how much traffic a site really has, whether a spike or an error count is real, why Web Analytics shows zero, or how to query per-address detail on the Free plan.
Traffic Reality Check is a tested SKILL.md that reads the numbers from Cloudflare Web Analytics and zone analytics (GraphQL or the dashboard) and says how many of them are real readers or real server errors, answered as JSON with the computed figures and a short reason; an agent buys it once for $0.07 over x402.
Not for
Reading your dashboard or account: it sees only the rows you paste. Not for ranking advice or content planning, and not for other analytics products, whose bot rules differ. It computes the figure from the table; a person still opens the settings it points to, such as the exclusion choice or the content security header.
Tested, honestly
Tested 2026-10-08 with a strong and a weak model.
With and without the skill
Results with and without the skill, for Sonnet and Haiku |
| with | without | with | without |
|---|
| Right figure or setting reading (21 situations) |
| Right figure or setting reading (21 situations) | 21/21 | 14/21 | 20/21 | 11/21 |
|---|
The same request on both sides, JSON-only asked for in both. Read by hand, Sonnet without the skill made seven real errors: it counted the social-network link previews as readers (139 instead of 70), gave no sampling answer for data older than 7 days (null), counted 84 readers under the EU exclusion setting instead of 0, thought a separate API token is needed, threw away 33 real Bulgarian readers who came from the social network (249 instead of 282), and twice called small fresh counts not exact. The other 14 situations it solved, including the cache host, the Worker rows and both policy cases.
Same cases and the same checks with and without the skill. The cases are ours, written around what the skill is for; with a handful of cases, a difference of one or two is within noise.
- SonnetStrong model, claude-sonnet-5-5
- Right in all 21 situations, read by hand: headless checks and one-view link previews at publishing hours were removed (70 readers of 203), real Bulgarian readers from the social network were kept (282 and 54), the cache host answering 504 was not counted as errors (4 real ones; 18 where they were real), the site's own Worker and its Cache API rows were taken out of the outside requests (1995), staging was left out (211), the EU exclusion setting gave zero readers and an incomplete Bulgarian dashboard, both policy cases named the missing directive, data older than 7 days was called sampled (one beacon behind a figure of 10) and newer data exact, six days needed six queries, and no separate token was asked for.
- HaikuWeak model, claude-haiku-5-5
- 20 of 21, with the same figures as Sonnet in every other situation, but it missed one: the small control: for 12 clean page views it wrote that the figure is not exact because the beacon misses visitors who block scripts, and so answered exact false where the sampling rule makes last-week data exact.
Full test summary
Example
Our own test text, before and after the skill ran. Excerpts only.
English · claude-sonnet-5-5
Before
Cloudflare Web Analytics for news.example, last 7 days, 203 page views in total. The owner runs a headless-browser check of every new article from a cloud server.
browser | country | referrer | views | visits | note
ChromeHeadless | US | none | 64 | 64 | the owner's check
Chrome | BG | google.com | 41 | 29 | spread over all days
Safari | BG | none | 17 | 11 | spread over all days…
After
{"readers": 70, "why": "Removed 64 ChromeHeadless views (the owner's own checks) and 69 Facebook link-preview fetches (US 38, SE 22, IE 9: one view per visit, all within publishing hours). Kept 41 Google, 17 direct Safari and 12 BG m.facebook.com views, the last being real readers with 2 to 3 views per visit spread over days. 64 + 69 + 70 = 203."}
What is in the file
- The answer
- Rows that are not readers (remove them, then add up what is left)
- A zero or a round number that is not what it looks like
- Per-address detail with GraphQL on the Free plan
- Work in this order
Languages
Any language. Tried in: English.
License
Perpetual, non-exclusive; use and modify for yourself incl. paid work; no resale or republishing. Holder: Georgi Kalchev, aiskills402.com. Full terms.
Versions
Current version 1.0.1, updated 2026-10-08. Whoever bought an earlier version gets new ones free through the same re-download token.
v1.0.1 · 2026-10-08
The skill text is unchanged. The test summary now states Haiku's one miss with the skill as a caveat (it called a small fresh count not exact), instead of reading as clean.
v1.0.0 · 2026-10-08
First release: turns Cloudflare Web Analytics and zone analytics rows into computed figures as JSON. Removes headless-browser checks, link-preview fetches from the social network, staging hosts, the site's own Worker and its cache calls, and the regional cache host of OpenNext before counting readers or 5xx errors; keeps real readers who share a referrer with the previews. Explains a true zero (EU exclusion setting, a policy that lacks the measurement origin or the script origin), sampling of data older than 7 days, and how to read per-address detail with one-day GraphQL queries on the Free plan.
FAQ
What does it return?
One JSON object with the keys your question names: a computed number such as the readers left after machines are removed, a true or false for a setting or a header, and a short reason that names which rows were removed and which were kept, so a person can audit the sum.
Which rows does it treat as not readers?
Headless browsers, link-preview fetches that arrive at publishing hours with one view per visit, staging hosts that share a token, the site's own Worker and its cache calls, crawlers in zone figures, and the regional cache host of OpenNext. A visitor who shares the same referrer but reads several pages over days stays in, because discarding real readers is also a mistake.
Where does a plain reading go wrong?
The table looks like traffic, and the obvious sum is quick. Three facts cut against it: a cache host that answers 504 on a perfectly healthy site, a Worker that appears in its own zone figures, and an exclusion setting that quietly removes every Bulgarian reader. We measured these on our own sites; the notes give the dates, so a changed Cloudflare screen may call for a new look. Typical examples include sampled older figures, a blocked measurement request and a staging copy counted beside production.
Does it help Claude Sonnet?
Yes, on facts it cannot guess. Across 21 situations Sonnet gave the right figure 14 times without the skill and 21 with it; Haiku went from 11 to 20. The misses without it were real: link previews counted as readers, 84 readers under the EU exclusion instead of none, small fresh counts called inexact, and real Bulgarian readers thrown away.