Custom domain analytics vs ad blockers, tested on 5 filter lists
Yes, for rules that name the tracker's own domain, but not for every rule. On November 8, 2026, we ran six analytics tools' requests through five of the lists uBlock Origin turns on by default. Every request on insights.example.com loaded, while path rules still caught some requests on stats. and analytics. subdomains.
What does an ad blocker actually match?
A filter list has two kinds of rule. A domain rule, like ||plausible.io^$third-party, blocks every request to that host. A path rule matches part of the URL wherever it is served: EasyPrivacy's /stats.*/event catches any URL with /stats. followed later by /event.
A custom domain only beats the first kind. Your tracker loads from a subdomain of your own site, so a rule naming the vendor's host no longer matches, and rules limited to third-party requests stop applying. Path rules still match, which is why the subdomain's name matters.
What did the test find?
Each cell shows whether the request loads or is blocked, on the vendor's own host and on three subdomains of a site at example.com, with the same path.
| Tool | Request | Vendor host | stats. | analytics. | insights. |
|---|---|---|---|---|---|
| Simplytics | script /track.js |
loads | loads | blocked | loads |
| Simplytics | pageview /track |
loads | loads | blocked | loads |
| Simplytics | custom event /event |
blocked | blocked | blocked | loads |
| Simplytics | outbound click /outbound |
blocked | loads | loads | loads |
| Plausible | script /js/pa-XXXXX.js |
blocked | loads | loads | loads |
| Plausible | pageviews and events /api/event |
blocked | blocked | blocked | loads |
| Fathom | script /script.js |
blocked | loads | loads | loads |
| Simple Analytics | script /latest.js |
blocked | loads | loads | loads |
| Umami Cloud | script /script.js |
blocked | loads | loads | loads |
| Pirsch | script /pa.js |
blocked | loads | loads | loads |
- Five vendor hosts are listed by name.
plausible.io,cdn.usefathom.com,simpleanalyticscdn.com,umami.isandpirsch.ioeach match a domain rule. No list namessimplytics.dev, so its script and pageviews loaded there too. - Beacons to another site are blocked. Simplytics sends custom events and outbound clicks with
sendBeacon, and EasyPrivacy blocks every third-party beacon (*$ping,third-party). On your own subdomain they are first-party and load, except in the CNAME case below. - Avoid
statsandanalyticsas the name./stats.*/eventblocks Simplytics custom events and every Plausible pageview on astats.host, and rules foranalytics.hosts catch more. Plausible's proxy guide gives the same advice for path names. A plain name likeinsightspassed every rule.
These are five lists, not every blocker: Brave Shields, DNS blockers and AdGuard's own lists were not tested.
Can a blocker see through a CNAME?
Some can. uBlock Origin on Firefox looks up a hostname's CNAME and filters the name it points to as well (uBlock Origin wiki). Fathom stopped offering custom domains on March 1, 2023, saying they were "blocked by uBlock and a few others" (Fathom changelog).
Simple Analytics' CNAME target, simpleanalyticsexternal.com, is itself on EasyPrivacy. Simplytics' target, proxy.simplytics.dev, matched no rule in any of the five lists on November 8, 2026, so the script and pageviews still load. Custom events and outbound clicks become third-party beacons to that name, though, and *$ping,third-party blocks them in uBlock Origin on Firefox.
Which analytics tools offer a custom domain?
As of November 8, 2026, from each vendor's own docs:
| Tool | Managed custom domain | Self-run proxy guides |
|---|---|---|
| Simplytics | Yes, one CNAME, every plan | None |
| Plausible | Yes, "Available on Enterprise plans" (docs) | Cloudflare, Vercel, Netlify, Nginx, Apache, Caddy, Laravel |
| Fathom | No, removed March 1, 2023 | None documented |
| Simple Analytics | Yes, a CNAME to simpleanalyticsexternal.com, on a plan that includes it (docs) |
NGINX, Caddy, Netlify, Vercel |
| Umami Cloud | None documented | Your own server-level proxy (docs) |
| Pirsch | Yes, "a Pirsch Plus feature", $12/month at 10,000 pageviews (docs, pricing) | PHP, Go, Cloudflare Workers |
A custom domain for each site is included in every Simplytics plan, at $12/year or $2/month for unlimited sites and pageviews (pricing). Pirsch Plus costs $12 a month for the same feature, and Plausible publishes no Enterprise price; see Simplytics vs Plausible.
How do you set one up in Simplytics?
- In your site's dashboard, press Custom domain in the sidebar.
- Type a subdomain such as
insightsand press Add. - Add the CNAME it shows, from
insights.example.comtoproxy.simplytics.dev, where you manage your DNS. - Wait for Active. It usually takes a few minutes while the certificate is issued.
- Swap your snippet for the one it shows. The snippet already on your site keeps counting meanwhile.
Your subdomain serves only the tracker, its beacons and, if your dashboard is Public, your public dashboard, and it sets no cookies. If your site sends a Content-Security-Policy, add the subdomain to script-src and connect-src. The custom domains docs page has the full steps, and the MCP server can add one for you.
For the script's own weight, see the analytics JavaScript size test.
When another tool fits better
- You want counts no browser blocker can touch: server-side logs, or a self-run proxy with renamed paths as Plausible's guides describe.
- You want a managed custom domain plus custom properties and revenue goals: Plausible Enterprise.
- You already run your own reverse proxy and want to choose every path: the proxy guides from Umami or Pirsch.
Method
Run on 2026-11-08 with @ghostery/adblocker 2.20.3, a network-filter engine that reads Adblock Plus and uBlock Origin syntax. Lists, downloaded the same day, are five of the nine that uBlock Origin enables by default (assets.json):
- EasyList and EasyPrivacy, version 202611081833 (
https://easylist.to/easylist/easylist.txt,.../easyprivacy.txt) - uBlock filters – Ads, modified 2026-11-07 02:04 UTC, and uBlock filters – Privacy, modified 2026-11-06 10:11 UTC (
https://ublockorigin.github.io/uAssets/filters/filters.txt,.../privacy.txt) - Peter Lowe's list, modified 2026-11-07 18:50 UTC (
https://pgl.yoyo.org/adservers/serverlist.php?hostformat=adblockplus&mimetype=plaintext)
Each request was matched from a page at https://example.com/. Script URLs are the ones in each vendor's install docs; Plausible's pa-XXXXX.js is the placeholder from its Cloudflare proxy guide. Plausible's /api/event path is the one its Cloudflare guide proxies. Types follow how each request is sent: script for scripts, xhr for the Simplytics pageview and Plausible's /api/event, ping for Simplytics custom events and outbound clicks. The CNAME case was not re-run in a browser: it follows from the same rules matched against proxy.simplytics.dev as a third-party host. Cosmetic filters were not loaded.
import { FiltersEngine, Request } from '@ghostery/adblocker';
import { readFileSync } from 'node:fs';
const engine = FiltersEngine.parse(
process.argv.slice(2).map((f) => readFileSync(f, 'utf8')).join('\n'),
{ loadCosmeticFilters: false }
);
const blocked = (url, type) => {
const r = engine.match(Request.fromRawDetails({ url, type, sourceUrl: 'https://example.com/' }));
return r.match && !r.exception;
};
console.log(blocked('https://stats.example.com/event', 'ping')); // true
The rules that matched: ||plausible.io^$third-party, ||cdn.usefathom.com^, ||simpleanalyticscdn.com^$third-party, ||umami.is^$third-party, ||pirsch.io^$third-party and *$ping,third-party (EasyPrivacy) on vendor hosts; /stats.*/event$domain=~stats.prisamedia.cl|~stats.uniquetma.com (EasyPrivacy) on stats.; /analytics.*/track and ://analytics.*/event (EasyPrivacy) on analytics..
Last verified: 2026-11-08.