Analytics that lives where the bots live.
Google Analytics fires in the browser, so anything that never runs JavaScript - which is every crawler - is invisible to it. Viz hooks requests inside WordPress itself and classifies each one before your page even finishes loading.
Every request, sorted before the page finishes loading.
Viz identifies each request on arrival - no external calls, no JavaScript, about 2ms of total overhead. More than 60 named bots are recognized out of the box, and the catalog keeps growing as new crawlers appear.
Your stack has four places to count from. They disagree.
A request to your site passes through up to four observation points: the CDN edge, the web server, the application (WordPress), and the visitor's browser. Each sees a different subset of reality. The browser sees only visitors who execute JavaScript - no crawlers at all. The CDN sees everything but understands nothing about your site, and its analytics stay locked in another dashboard with its own bot taxonomy. Raw web-server logs see every request that reaches the origin but leave you to parse and classify them yourself, assuming your host exposes them at all.
Viz measures at the application layer - inside WordPress - which is the deepest point that still sees bots and the only one that knows your site's structure: which URL is a product, which is a post, who is logged in, what should be excluded. That context is what turns raw hits into questions you can actually answer, like “which AI companies read my pricing page this month?”
The honest caveat: a full-page cache serving a bot at the edge can answer without WordPress ever running. Viz doesn't pretend otherwise - its blocking probe exists precisely to detect that case and hand you the edge rules to close it. Knowing the limits of your measurement point is part of measuring well. If you want the deeper argument, read why Google Analytics can't see AI bots.
What a week of honest data usually reveals.
Day one: the ratio
The first surprise is usually the split itself. Site owners who assumed bots were a rounding error discover automated traffic rivaling their human numbers - and that “direct traffic” they could never explain in GA4 starts making sense as the human-shaped residue of a machine-heavy reality.
Day three: the names
By midweek the leaderboard has structure. A handful of AI crawlers dominate, each with a different rhythm: training bots sweep the archive in long runs, retrieval bots spike on the pages people ask questions about, and uptime monitors tick like clocks. Once traffic has names, it has explanations.
Day seven: the decisions
A week of data is enough to see which sections machines value, whether anything is hitting you at abusive volume, and what a sensible retention window looks like for your traffic. The dashboard stops being a curiosity and starts producing the block, allow, and content decisions the rest of Viz exists to execute.
Everything inside wp-admin. Nothing to log into.
Category breakdown
A donut of your real traffic mix - how much is human, how much is AI, how much is search - for any date range your retention allows.
Daily trend
Watch AI crawl volume rise and fall day by day. Spot the moment a new model vendor discovers your site.
Top AI bots
A leaderboard of the bots hitting you hardest, so you know exactly who is consuming your content - and how often.
Request log
A filterable, paginated log of individual requests: URL, time, user agent, and classification. Audit any visit, human or machine.
An Unknown bucket beats a confident guess.
User agents are self-reported, which means user-agent analytics is a trust exercise. The good news: the operators that matter most - OpenAI, Anthropic, Google, Perplexity, Meta - identify their crawlers plainly and publish documentation, because being identifiable is how they demonstrate robots.txt compliance. The bad news: scrapers with something to hide claim to be Chrome, and no user-agent tool on earth can catch all of them.
Viz's response to that reality is a design choice: never guess silently. A request either gets a precise, named label, or it lands in an explicit Unknown category you can see, trend, and investigate in the request log. A tool that claims a clean 100% classification rate is telling you about its assumptions, not your traffic.
See the humans AI sends you, too.
Connect Google Analytics 4 and Search Console (read-only) and Viz adds an AI Traffic view: sessions, engagement, and conversions from visitors who arrived via ChatGPT, Perplexity, and other AI assistants. Crawl data tells you what the machines read; this tells you what that reading earns you.
Local-first by design
Every event lands in your own WordPress database first. Cloud sync is a separate, explicit step - and Google OAuth tokens never touch your WordPress server at all.
Controls that fit your site
Toggle human logging, exclude admins, set proxy trust for accurate IPs behind Cloudflare, and control your retention window.
No bloat, ever
Plain PHP and vanilla JavaScript. No npm, no webpack, no external scripts on your pages. Your visitors never know it's there.
Analytics questions, answered plainly.
How is this different from looking at my server access logs?
Access logs contain the raw material but none of the answers. They are unclassified text lines, often rotated away after days, and on managed WordPress hosting frequently not accessible at all. Viz captures the same request-level truth inside WordPress, classifies it on arrival, and turns it into charts and a searchable log you can actually use.
Can a bot lie about being a browser?
Yes - a client can claim to be anything, and no analytics tool can catch a determined impostor. What matters is how a tool handles the ambiguity: Viz gives precise, named labels to bots that identify themselves, and puts everything else in an explicit Unknown bucket instead of silently guessing. The major AI operators identify themselves honestly, so the picture for the traffic that matters most is accurate.
What about requests my CDN serves from cache?
A full-page cache hit at the edge can be answered without WordPress running, and no WordPress plugin can observe a request that never reaches PHP. In practice, bots crawl broadly and cache hit rates on long-tail pages are low, so crawler activity shows up clearly. For blocking specifically, Viz's probe detects when a cache is serving blocked bots and gives you edge rules to close the gap.
Does Viz slow down my site?
The full pipeline adds roughly 2 milliseconds per request. There are no external calls in the request path and no JavaScript added to your pages.
Who can see my analytics data?
It lands in your own WordPress database first, and stays there unless you explicitly opt into cloud sync. There is no external script, no ad network, and no third-party beacon on your pages.
Why do my Viz numbers disagree with GA4?
Because they are counting different things at different places, and both are right about what they see. GA4 counts sessions from browsers that ran its tag; Viz counts requests that reached your server, machines included. Expect Viz totals to be much higher and the human subset to track GA4 loosely, not exactly - ad blockers and consent banners remove humans from GA4 that Viz still sees, while cached pages can serve humans Viz never sees. The disagreement is not an error; it is the measurement gap made visible.