I measured my own site last week and the answer was 48. Forty-eight successful pageviews from 21 unique addresses across 6.15 days and 22,740 logged requests. Filter the same log the usual way, drop declared bots and keep browser user agents, and it reports 4,958 pageviews from 529 visitors. That's what I'd have quoted if I had stopped there.
| What I counted | Raw log count | Verified |
|---|---|---|
| Pageviews, browser UAs | 4,958 | 48 |
| Unique visitors, browser UAs | 529 | 21 |
| Hits on /work-with-victor, all clients | 513 | 1 |
| Externally referred requests | 22 | 1 |
Three things inflate it. The client_ip field in my log is the Cloudflare edge, not the reader, so any unique-visitor count built on it is fiction. The real address sits in Cf-Connecting-Ip. My own tooling wears plain user agents and makes up 36.3% of all traffic, curl alone at 5,578 requests. And the engaged-looking sessions were machines: one address in Singapore hit /work-with-victor three times and my decoder twice inside the same second, and never asked for an asset.
jq -r '.request.headers["Cf-Connecting-Ip"][0] as $ip
| .request.uri as $u
| if ($u|startswith("/_next/static")) or ($u|test("\\.(css|js)$"))
then "\($ip) asset" else "\($ip) page" end' \
/var/log/caddy/access.log \
| sort | uniq -c | sort -rn
# An address with page lines and no asset line is not a browser.Position
A visitor count you have not checked against asset requests is not traffic. Anything that can send an HTTP request lands in it.
- Same log, same six days: 4,958 against 48. A 103x gap changes what you do next.
- A browser that renders a page also pulls its CSS and JS. 1,740 /_next/static requests reached my origin from 278 distinct addresses, so the CDN isn't swallowing assets. An address that wants HTML and nothing else isn't reading.
- Depth gives it away. Of my 27 verified sessions, 20 were one page, 4 were two, 3 were three. The deep ones in the raw log were scrapers.
Strongest counterpoint
The asset test undercounts and I won't pretend otherwise. A returning reader with a warm cache asks for the HTML and nothing else, so my method files that person as a bot. 48 is a floor, not a census. The truth sits above 48 and nowhere near 4,958.
Conclusion
Run the check before you quote the count. If an address's HTML hits never come with asset hits, stop calling it a visitor.