Skip to content
New storyWe built Skald to count visitors. It caught an AI-key thief.
SkaldEvery visit, truly told.

Server log analytics · read from access.log

Server log analytics: every request your server answered, in five groups

Server log analytics reads the line your web server already writes for every request. Skald sorts each line into one of five groups, and the five add up to the whole log.

Server log analytics is web analytics read from your web server's access log, the record it keeps of every request it answers, instead of from a script tag in the page. A script tag counts the browsers that run it. The log also holds the AI assistants, search engines and bots that never run a script.

30-day free trial · no card · we set it up within one working day · free to self-host

/var/log/nginx/access.log · sample6 lines · 0 unsorted
  1. 09:14:02 203.0.113.24 "GET /pricing/" 200 "GPTBot/1.2"AI · training
  2. 09:14:03 198.51.100.7 "GET /" 200 "google.com" Chrome/130people
  3. 09:14:05 203.0.113.66 "GET /blog/" 200 "Googlebot/2.1"search
  4. 09:14:06 198.51.100.140 "GET /docs/" 200 "ChatGPT-User/1.0"AI · live fetch
  5. 09:14:10 192.0.2.14 "GET /.env" 404 "zgrab/0.x"bots · probe
  6. 09:14:13 198.51.100.2 "GET /healthz" 200 "curl/8.5.0"ours · deploy check

Sample lines. Each one lands in exactly one of five groups. A script tag would have run for the second line only.

[01] what the log holds

What your access log records that a script tag never sees

A script tag runs only in a browser that runs JavaScript. Your server writes a line for every request anyway. Pick a group to see who is in it, and whether a script tag would have counted them.

pick a group

People

A browser that drew the page: it fetched the page's own scripts or styles, or sent an event from it. Skald shows visits as at most this many people, never requests passed off as people. A person who clicked a link in an AI answer is counted here too, with the assistant kept as the visit's source.

198.51.100.23 "GET /docs/setup/" 200 "https://chatgpt.com/" Safari/605 → people · source ChatGPT

Script tag sees it: yes, when the browser runs the tag and the visitor accepts it.

[02] nothing left over

Five groups that add up to the whole log

Every request lands in exactly one group. Before Skald reports a day, it checks that the five groups sum to the lines it read.

Lines are not visits. One page view loads many files: the page, its scripts, its styles, its images. Skald counts visits from pages, and the server load view on Site > Health shows every file your server answered, split into the same five groups.

A browser-like visit is people only when it loaded the page's own files. One that opens 6 or more pages within 2 seconds is too fast to be a person, and goes to bots.

Sample day · lines by group
GroupLinesShare
People41522.5%
AI assistants32217.4%
Search engines1478.0%
Bots and scanners94050.9%
Your own traffic241.3%
The whole log1,8480 unsorted

Sample data. The 940 lines from bots and scanners are counted, in their own group, and none of them as people.

[03] from lines to visits

From log lines to visits, sources and places

The log holds an address, a time, a page, a status, a referrer and a user agent. That is enough for visits, sources, campaigns, countries and returning visitors, read in plain words.

  1. Visits and sources

    One address and browser, with no gap over 30 minutes, is one visit. Coming back from ChatGPT, a search or a campaign starts a new visit, so the real source shows. No referrer reads "Direct". A value the log lacked reads "Not recorded".

  2. Campaigns and ad clicks

    UTM tags, referring sites and ad networks from their click IDs, never the ID's value: Google Ads on iPhone (gbraid, wbraid), TikTok and X too. The ChatGPT and Claude phone apps count as AI; YouTube, WhatsApp and Telegram as social.

  3. Countries and cities

    From the log's own country field (Cloudflare's, or nginx's cc=), or from a free DB-IP GeoIP file on Skald's server. With neither, a country stays "Not recorded". It is never guessed.

  4. Real pages only

    A page view is a page your server answered with 2xx or 304. Images, scripts, redirects and calls under /api/ never are. A page shown from the browser's cache (304) counts, and keeps the visit's source.

  5. Next.js clicks

    A click inside a Next.js site sends no HTML request. One field at the end of the log format lets Skald count every such click as a page view, and never a prefetch. Caddy's log already holds it.

  6. Returning visitors

    Skald recognises a returning visitor over 30 days with a keyed hash, so the figure never depends on keeping the address. How long addresses are kept is your setting.

[04] where your site runs

Which web servers, CDNs and hosts Skald reads

Skald needs to see your site's requests. A web server's log, a CDN's log or a host's log drain all work. Without any log, only the script tag is left, and it sees people only.

Your site runs onHow Skald gets the requestsAI crawlers and bots seen
nginx or Apache, on your serverThe access log. One command on the server sends it, with or without Docker. nginx · ApacheYes
Caddy, on your serverCaddy's JSON access log. CaddyYes
Cloudflare, any planThe Skald Worker posts a record of each request, cached pages too. CloudflareYes
Vercel Pro or EnterpriseA log drain: Vercel posts its request logs. VercelYes
CloudFront or FastlyThe CDN's own log, synced to Skald's server. CloudFront · FastlyYes, but the audit does not recount these logs yet, so their days are withheld
Shopify, Webflow, SquarespaceNo log and no drain: the script tag and webhooks onlyNo

What server log analytics does not do

  • Without a server or CDN log (Shopify, Webflow, Squarespace, or the script tag alone), AI crawlers, search crawlers and bots are not seen at all. They do not run scripts.
  • A user agent is a claim. People is an upper bound, never a count of humans: a scraper that drives a real browser and loads the page's files looks like a reader.
  • A person who blocks scripts and styles is not counted as a person.
  • Referrers are often stripped, so clicks from AI answers are a floor. A click from a Google AI Overview arrives as plain google.com; Google AI Mode is told apart only when the click carries udm=50.
  • Behind a CDN, read the CDN's log, never the origin's as well: a cache miss is in both.
  • It does not replace Search Console for queries and rank, or Google Analytics for ad spend. It sits beside them.

questions

Server log analytics FAQ

Straight answers, including what Skald does not do.

What is server log analytics?

Server log analytics counts your website's traffic from the web server's own access log: one line for every request the server answered. It sees people, and also AI crawlers, AI assistants fetching a page for someone, search engines and scanners, none of which run a script tag. Skald sorts every line into five groups that add up to the whole log.

How is server log analytics different from Google Analytics?

Google Analytics counts the browsers that run its script and accept it. A server log records every request, script or not, so it also holds AI crawlers, search crawlers, bots and people who block scripts or decline a consent banner. Skald does not replace Google Analytics: it sits beside it and shows what a script cannot see. A Google Analytics alternative that reads logs.

Do I need to add a script or a cookie to my pages?

No. Counting from the log needs nothing in your pages and no cookie. Skald's script tag is optional: it adds what a log cannot see, such as a form started, a phone link clicked or a booking made inside a widget. The analytics script tag.

Which web servers and hosts can Skald read?

nginx and Apache (the combined format, or Skald's extended one), Caddy's JSON log, the Skald Worker for Cloudflare on any plan, Cloudflare Logpush, a Vercel log drain (Vercel Pro or Enterprise), CloudFront standard logs and Fastly JSON logs. Shopify, Webflow and Squarespace give no log, so there Skald sees people through the script tag only.

Are bots counted as visitors?

No. Every request lands in exactly one group, and bots and scanners have their own. A browser-like visit counts as people only when it loaded the page's own files, and a visit that opens 6 or more pages within 2 seconds is filed as a bot. Visits are an upper bound on people, never a count of requests. How server log analytics works.

Does the server log hold personal data?

Yes: an access log holds each visitor's IP address. Skald keeps addresses in full, shortened or not at all, as you choose in Settings > Data retention. If you self-host, the log and the figures stay on your own server.

$ tail -f access.log | skald

See what AI does with your site. Free for 30 days.

No card. We set up hosted Skald for you within one working day, or you self-host it free. Every line of your log, sorted and added up.

Start free trial Live demo