Most people looking for a Plausible alternative still like the idea behind Plausible. No cookies, no consent banner, one clean dashboard. What sends them looking is usually a number that doesn’t add up.

A blog post suddenly gets hundreds of visits from nowhere, or a campaign page barely moves while the ad platform reports a steady stream of clicks. Two things cause most of this: bots that get counted as people, and people whose ad blocker stops them from being counted at all. So I tested how much the analytics tool itself changes that, with Plausible, Umami and Pirsch.

Test 2 results: Pirsch caught 13 of 16 real bot visits, Plausible 3, Umami 8; a real browser window was counted as a visitor by all three
Real bot traffic, replayed through each tool’s own filter. Pirsch caught 13 of the 16 bot visits, Plausible caught 3.

If your numbers need to hold up in front of a client, I would pick Pirsch. Here’s what each tool caught, the two mistakes Pirsch made, the bot that fooled all three, and what happened when I ran their tracking code past the most popular ad blockers.

How I tested

All three tools publish the code that decides who counts as a bot, so I didn’t have to guess from their feature pages. I ran each tool’s own rules myself, in three tests.

Test 1 gave each filter the same list of 81 known bots and browsers. Test 2 sent real bot traffic at a small test website, using the tools scrapers actually use. Test 3 checked each tool’s tracking code against five popular ad-block lists, freshly downloaded for the test.

How far the test went. I ran each tool’s open-source filtering code myself and captured every bot visit on a test site I built for this. Plausible’s paid cloud version and Pirsch’s hosted service also block traffic from known data centres. That part isn’t public, so I couldn’t test it. Every result below comes from my own runs, and the screenshots show the raw output.

The results at a glance

What matters for clean numbersPirschPlausibleUmami
Known bots caught (out of 61)614355
Real visitors blocked by mistake (out of 20)200
Live bot visits caught (out of 16)1338
Blocked by ad blockers with the standard setupYesYesYes (Cloud)
Getting past ad blockersA few DNS records, or tracking from your serverBuild and maintain your own proxyHost it yourself on your own domain
Starting price$6/mo, 10k page views, 50 sites$9/mo, 10k page views, 1 siteFree tier, then $20/mo

81 bots and browsers

Every browser, crawler and script introduces itself with a short line of text called a user agent. Chrome says it’s Chrome. OpenAI’s crawler says it’s GPTBot. Analytics tools read that line to decide who counts as a visitor.

I gave each tool the same list: 61 bots and 20 browsers real people use today, including the ones built into Instagram and TikTok.

Test 1 results: Pirsch caught 61 of 61 bots, Plausible 43, Umami 55; Pirsch blocked 2 of 20 real browsers by mistake
Test 1: how many bots each tool caught, by type. The last row counts real browsers that were blocked by mistake.

The AI crawlers were easy. All three tools caught all 22 of them, from GPTBot to the bots ChatGPT, Claude and Perplexity send when someone asks them to read a page. If that’s your only worry, any of the three will do.

The differences showed up with bots that don’t introduce themselves honestly. Most scraping is done with basic tools like curl or a few lines of Python. Plausible recognises them, but it files them as “software” instead of “bot”, and it only throws out bots. You can see it in its own code:

Plausible source code: a visit is only removed when it is labelled a bot or Headless Chrome
Plausible removes a visit in two cases only, highlighted in yellow. Everything else gets counted.

Pirsch was also the only tool that caught bots dressed up as old browsers. Plenty of scraping kits borrow a browser’s name once and never update it. One well-known crawler still claims to be Chrome 60, a version from 2017 that nobody browses with anymore.

It wasn’t flawless, though. Pirsch blocked two real browsers: Firefox on iPhone, and DuckDuckGo’s browser on Android. Firefox for iPhone writes its version number in a way the filter mistakes for a fake, and DuckDuckGo’s browser shares its name with DuckDuckGo’s own crawler. Both look like small fixes, but until they’re made, people on those two browsers won’t show up in Pirsch.

Real bots, real visits

A list of names only gets you so far. When a real tool visits a page, it sends a lot more than its name, and a good bot filter looks at all of it.

So I built a tiny test website that writes down everything a visitor sends, and visited it with Playwright (a popular way to run Chrome without a screen), curl, Python, Node, Go and wget. For half the runs I disguised them with a normal Chrome user agent, which is the first thing any scraping tutorial tells you to do. I also opened the page in an ordinary browser window, to make sure real visitors still get counted.

A fake name was enough to fool Plausible and Umami. Once I swapped the headless browser’s name for a normal Chrome one, both counted it as a real visitor.

Headless Chrome still gave itself away. Chrome sends a second, newer ID card along with its user agent. In Playwright’s default mode, that card keeps saying “HeadlessChrome” after you change the name, and the browser leaves out its preferred language, which every real browser includes.

Headers sent by a real browser, headless Chrome with a fake name, and Chrome new headless mode
What three different Chrome setups told my test site. The red parts are the giveaways.

Pirsch reads that second card, which is how it caught this one. Scripts in disguise left clues too. A Python script or curl command dressed up as Chrome still doesn’t say which language it wants, and Node asks for “any language”, which no browser does. Pirsch treats both as bots. Plausible and Umami don’t check.

Pirsch source code: a visit without a preferred language is marked as a bot
The check in Pirsch’s open-source code that caught the disguised scripts.

What fooled all three

Chrome’s newer headless mode, with a fake name, looked just like the real browser window. None of the three tools caught it, Pirsch included. There was one small clue: the fake name said Chrome 140, while the second ID card said 141. None of the tools check whether those two match.

A carefully set-up curl request also got through everywhere. Any bot that copies a browser closely enough will pass a filter that only reads what the visit says about itself, and that’s where blocking known data-centre addresses comes in. The good news: the ordinary browser window was counted as a visitor by all three, so Pirsch’s stricter checks didn’t lock out a real person.

The ad blocker check

A bot filter only matters for visits that reach you. So I took each tool’s standard tracking code and checked it against five of the most widely used blocklists. I added Google Analytics for comparison.

Test 3 results: standard tracking code of Plausible, Umami Cloud, Pirsch and Google Analytics blocked by three of five ad-block lists; own-domain setups pass all five
Which list blocks which setup, and the exact line in the list that does it.

The result was the same for everyone. Plausible, Umami Cloud and Pirsch are each blocked by a single line in EasyPrivacy, the list uBlock Origin switches on by default. AdGuard and HaGeZi block them too, and all three lists block Google Analytics as well. Switching tools won’t bring those visitors back if you keep the standard setup.

Loading the tracking from your own domain does work: every version of that passed all five lists. The difference is how much work it takes. With Plausible, you set up a forwarding proxy on your own server and keep it running. With Umami, you host the whole thing yourself. With Pirsch, you add a few DNS records so that something like stats.yoursite.com points to Pirsch, and there’s nothing to maintain. Because it’s a direct DNS record, blockers that trace a subdomain back to a tracking company, like uBlock Origin on Firefox, have nothing to follow. You can also skip the browser completely and send page views from your own server.

What it costs

Pirsch starts at $6 a month for 10,000 page views across 50 websites, with unlimited team members and no limit on how long your data is kept. At the same traffic, Plausible charges $9 for one site and $19 for ten. If you look after sites for clients, that difference adds up quickly. Custom domains, funnels and A/B testing come with the Plus plan, from $12 a month, and every plan starts with a 30-day trial without a credit card.

Switching over

You don’t have to take my word for any of this. Run both tools side by side and let your own traffic decide.

  1. Start the free 30-day trial. No credit card needed.
  2. Add the Pirsch snippet next to your Plausible script, and don’t remove anything yet.
  3. If you’re coming from Google Analytics, import your history so your reports don’t start from zero.
  4. After two weeks, compare the two dashboards page by page. The pages where the numbers differ most are where your bots and blocked visitors are.
  5. Once you’ve seen enough, point a subdomain at Pirsch or switch to server-side tracking, and remove the old script.

The verdict

Go with Pirsch. It caught every known bot in my test and 13 of the 16 live ones, including disguised scripts the other two counted as visitors. It gets you past ad blockers with a few DNS records instead of a proxy you have to maintain, and it’s priced for people who look after more than one site. Keep an eye on your browser report in the first week, because Firefox on iPhone and DuckDuckGo on Android are undercounted for now.

Two weeks of running it next to your current tool will tell you more about your own traffic than any comparison article can.

Try Pirsch free for 30 days

← Back to all articles