All posts

I replaced Google Analytics with an analytics system I can talk to

6 min read
  • ai
  • analytics
  • build-in-public
  • mcp
  • privacy

I removed GA from my sites and built my own analytics. No cookie banner, no dashboard safari. I ask Claude questions about my visitors and it answers. It also sees the AI bots GA never could, and on one ordinary day they made more requests to my site than every human combined.

On August 1 I removed Google Analytics from my website. Nothing replaced it, because the replacement was already running. It had been collecting alongside GA for weeks, and the numbers matched.

I built it myself. It is called Peeko, and it now runs the analytics for five of my sites: this one, Weirdo, the iOS game I put in the App Store this week, and my product pages. One dashboard, a two kilobyte script per site, and a database I own. It holds this site's full history since July 7, more than 2,600 pageviews from about 1,080 visitors, most of them from the US.

This is not a post about why Google Analytics is bad. It is about what analytics looks like when you design it for how you actually work now.

Why I left

Google Analytics answers questions I never ask, and makes me dig for the ones I do. Every visit to the dashboard was a small archaeology project. Add the cookie banner it forces on your visitors, and the fact that your traffic data lives in someone else's product, and the trade stopped making sense.

The privacy-friendly alternatives are good. But they are still someone else's product, and none of them were built for the thing that changed how I work this year.

What I built instead

Peeko is cookieless by design. No banner, because there is nothing to consent to. It never stores an IP address. Visitors are counted with a hash that rotates daily, so even I cannot follow a person across days. It collects exactly what I need and nothing more.

The all-sites view: Peeko, My Portfolio, Sondo, WEIRDO and Cloco, each with its own sparkline and visitor count.
Five sites, one dashboard. The game went up two days ago.

Adding a site is a paste. When Weirdo went live on August 4, I created its site in Peeko at 19:11 and the first visit landed at 19:13. The game had analytics before it had a second visitor.

That part is table stakes. The interesting part is what sits on top.

The Peeko dashboard showing mahdif.com: 2.6k views, 1.1k visitors, 1.2k sessions, 63.1 percent bounce, a traffic curve from July 7 to August 6 with a spike on July 29, and a world map covering 73 countries.
The whole history of this site since July 7, in one screen.

I stopped opening the dashboard

Peeko has an MCP server. That means Claude Code, Claude Desktop, or any AI tool that speaks the protocol can connect to it and read my analytics directly.

So I do not click through charts anymore. I ask.

"How many visitors this week, and where did they come from?" "Which pages hold people the longest?" "Did the post I published yesterday actually drive anyone to the portfolio?"

The answer comes back in seconds, in plain language, with the numbers pulled live. The connection is read-only and scoped to my account. It cannot run SQL, and there is no IP for it to leak because none was ever stored.

Half my questions now get asked mid-session, while I am building something else. Analytics went from a place I visit to a colleague I interrupt. It even taps me on the shoulder: when people are on the site right now, the little LED screen on my desk lights up and tells me.

One question, eight tool calls, seventeen seconds. I never opened the dashboard.

When I do open it, it shows the visit, not the person

The dashboard still exists, and I gave it the same care I would give a client's product, because the whole point of building your own tools is that nobody makes you settle.

Every human visit reads as a small story: where it came from, the pages it moved through, how long it stayed, on what device, in which country. Every visitor has a profile with a history but no identity. A journey, never a name. No IP was stored, and the hash that counted them expires at midnight.

The machines get the same treatment. Every bot has its own profile: when it first showed up, which pages it reads, what it came back for, how often it returns. Not a log line. A profile, laid out with the same care as the human ones.

Designing an analytics tool where the individual visit is legible but the individual person is unknowable was the most interesting design constraint in the project.

A visitor profile named Obsidian Seal: Canada, mobile, Safari, iOS, first seen August 2, last seen August 5, 4 visits and 4 views, with a journey showing the same blog post opened on four separate days.
Somebody in Canada came back to the same post four days running. I know that, and I will never know who they are.

The visitors Google Analytics has never seen

Here is the part I did not expect. An increasing share of my traffic is not human. Recruiters' assistants, research agents, the crawlers feeding every AI model. JavaScript analytics is structurally blind to all of it, because crawlers do not run JavaScript. GA has never counted a single one.

Peeko tracks them server side. I turned that on for mahdif.com two days ago, and the first full day of data was August 5.

That day, humans made 89 pageviews here. The bots made 232.

ONE DAY ON MAHDIF.COM · AUGUST 5, 2026 · BY HOUR 020406000:0006:0012:0018:0023:00 AI bots · 232 hits a steady stream, all 24 hours Humans · 89 pageviews bursts, then sleep
August 5, hour by hour. More machine traffic than human, around the clock.

More machine than human, on an ordinary Wednesday, and until this week I had no instrument that could see it. Thirteen different crawlers, run by ten companies.

Before that number gets away from me: about a third of those bot hits were robots.txt and sitemap.xml, which is bookkeeping, not reading. Strip those out and it is 151 real page reads against 89 humans. Still more machine than human, on a site I wrote for humans.

WHO READ MAHDIF.COM · AUGUST 5, 2026 232 HITS · 13 BOTS · 10 COMPANIES training the models · 164search index · 65answering someone live · 3GoogleOther · Google88Googlebot · Google44ClaudeBot · Anthropic40Bingbot · Microsoft18meta-externalagent · Meta12Bytespider · ByteDance9CCCBot · Common Crawl8AAmazonbot · Amazon3Applebot · Apple3OAI-SearchBot · OpenAI3ChatGPT-User · OpenAI2DuckAssistBot · DuckDuckGo1GPTBot · OpenAI1
One day of server-side bot tracking, counting every request. A third of these never touched a page. Three were an AI reading one to answer somebody in real time.

Some details I keep coming back to. Anthropic's ClaudeBot hit the site 40 times, but only ten of those were pages. The other thirty were robots.txt and the sitemap, checked over and over. Bing's crawler, with fewer than half the hits, actually read more of my writing. Twice, someone asked ChatGPT a question and it came to read my homepage to answer them. And the essay I published that morning was picked up by crawlers nine times before the day was out.

I rebuilt this site agent-first a few weeks ago. This is the instrument panel for that bet.

The AI page listing thirteen crawlers with their company logos, with ClaudeBot selected showing its user agent string and every page it read, including the essay published that morning.
Every crawler gets a profile too. This is ClaudeBot's, over a seven day window.

Where it reads lower, honestly

Peeko shows about ten percent fewer visitors than my old first-party setup did, because ad blockers drop third-party trackers and I have not worked around that yet. I take accurate-but-lower over inflated.

And it does far less than Google Analytics. No attribution modeling, no audiences, no funnels. If your job is ad spend, this is not your tool. It is deliberately small: it answers a builder's questions about real visitors, and now it answers them in conversation.

The reversal

For fifteen years, analytics meant a dashboard you visit to feel informed. The dashboard was the product.

It is not anymore. The answer is the product. The dashboard is just one way of looking at it, and these days it is not even my main one.