AWStats is a server log analysis tool built into cPanel. Unlike Google Analytics, AWStats needs no JS on the page and sees every visitor, including bots and people who block trackers, because it reads the raw web server access_log instead of browser behavior.
Opening AWStats
cPanel → Metrics → AWStats → select the domain → View. The report is not built instantly: the data updates once a day through the server's cron job, so today's statistics can lag by several hours. Raw access_log files are kept for 12 months on most plans, and already-computed AWStats reports stay available even after the raw logs are removed by rotation — the data is archived month by month into separate statistics files.
What AWStats shows
| Metric | Description |
|---|---|
| Unique Visitors | Unique IPs over the period |
| Visits | Visits (sessions) |
| Pages | Page views (HTML) |
| Hits | All HTTP requests (including images) |
| Bandwidth | Volume of data transferred |
The gap between Pages and Hits is usually 10–30 times: one HTML page of an online store pulls in dozens of product images, CSS files, fonts, and scripts, and AWStats counts every one of those requests as a Hit too. If Hits drop sharply after image optimization while Pages stays the same, that is a good sign — it means browsers are pulling resources from cache more often instead of reloading them from the server.
Useful AWStats sections
- Countries — where visitors come from
- Referrers — which sites they arrive from
- Search Keyphrases — search queries (partial)
- Robots/Spiders — bot activity
- 404 Errors — pages that do not exist
The Search Keyphrases section is nearly empty on modern sites — since 2013 Google and other search engines have passed the search query in the referrer only in rare cases, so AWStats sees just a handful of phrases instead of the full picture. Analyzing the queries that actually bring visitors from search requires Google Search Console, not server logs.
Common problem: traffic behind Cloudflare or another CDN
If the site sits behind Cloudflare, the visitor's real IP never reaches the server — the access_log records the IP of a Cloudflare edge node instead. A log line looks roughly like this:
104.23.98.12 - - [24/Sep/2026:10:12:03 +0000] "GET /catalog/ HTTP/1.1" 200 4821
"https://example.com/" "Mozilla/5.0 ..."
As a result, AWStats shows the Countries section as almost entirely one data-center region, and Unique Visitors is sharply understated — thousands of different people collapse into a handful of edge-server IPs. The fix is to enable mod_remoteip or a similar real-IP restoration option in the CDN settings, so the log captures the CF-Connecting-IP header instead of the proxy address. In practice it looks like this: before enabling the module, the Countries report shows 90% of visits from the US simply because that is where the nearest Cloudflare edge data center to your server sits, and after the fix the country breakdown suddenly matches the site's real audience geography.
AWStats vs Google Analytics
| Criterion | AWStats | Google Analytics |
|---|---|---|
| Data source | Server logs | JavaScript tracker |
| Bots | Sees them | Does not see them |
| AdBlock | Sees it | Does not see it |
| Detail level | Basic | Deep |
| Real time | No (once a day) | Yes |
AWStats numbers are almost always higher than Google Analytics — AWStats counts bots and crawlers as full visits. Analyzing the real behavior of actual people needs GA4, while AWStats is best used as a quick check that "someone is opening the site at all" without setting up a tracker. A solid working approach is to keep both tools running in parallel: GA4 for marketing and sales funnels, and AWStats as an independent source that keeps writing statistics even if a developer accidentally strips the Google tracking code from the page during a theme update.
When AWStats does not fit
- Single-page applications (SPA) — transitions between screens happen through a JavaScript router with no new HTTP requests, and AWStats sees only the one request that loads index.html
- You need goals and conversions (orders, sign-ups) — AWStats only counts the fact of a page request, not a business event
- You need audience segmentation by device, age, or ad source — server logs simply do not contain those breakdowns
- You need to filter out your own test traffic — AWStats cannot exclude developer IP addresses dynamically, only through manual reconfiguration
Verifying the result
# Compare today's homepage request count directly from the log
grep "$(date +%d/%b/%Y)" /home/user/access-logs/example.com | grep -c "GET / HTTP"
If the number from grep is noticeably closer to reality than what AWStats shows for the same day, the AWStats report has most likely not run its cron update yet rather than being broken. More on counting hits from logs manually and finding 500 errors in them is in the article on reading error logs in cPanel.