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

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?

  1. In your site's dashboard, press Custom domain in the sidebar.
  2. Type a subdomain such as insights and press Add.
  3. Add the CNAME it shows, from insights.example.com to proxy.simplytics.dev, where you manage your DNS.
  4. Wait for Active. It usually takes a few minutes while the certificate is issued.
  5. 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

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):

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.

← All posts