Aller au contenu
snorklee
Trafic IA Analytics Tarifs À propos Documentation Contact Connexion Essai gratuit 14 jours

De Snorklee-code vanuit uw eigen domein serveren (anti-blokkering)

Chrome 121+, uBlock Origin, Brave Shields, AdGuard en de meeste advertentieblokkeerders blokkeren standaard elke oproep naar een extern domein met het label "analytics" — zelfs wanneer de dienst geen reclame en geen advertentietracking doet, wat bij ons het geval is.

Als u niets doet, worden bezoekers niet geteld bij wie de adblocker of browser meetinstrumenten tegenhoudt. Hun aandeel hangt af van uw publiek, en we kunnen het niet voor u meten: die bezoeken bereiken ons per definitie niet.

De oplossing: de Snorklee-code en de API serveren vanuit uw eigen domein. De browser ziet dan een "1st-party"-oproep, niet te onderscheiden van het laden van een afbeelding of een stylesheet. Blokkeerders die filteren op de naam van het meetinstrument zien hem niet meer.

Deze pagina laat u zien hoe, met first-party configuraties die passen bij een Europese infrastructuur. Kies host en uitvoeringsregio volgens uw behoeften rond compliance, performance en support.

WordPress — ga via de officiële plugin

Waag u op WordPress niet aan Nginx, Caddy of DNS. De officiële Snorklee Analytics-plugin 3.0+ doet al het werk al:

  1. Installeer of update de plugin vanuit het Snorklee-dashboard of via de pagina Snorklee WordPress-plugin.
  2. Open Snorklee in wp-admin.
  3. Controleer het sitedomein en laat de dashboard-URL op https://snorklee.com, behalve bij een self-hosted instantie.
  4. Kies de modus Script geleverd door WordPress (aanbevolen) en sla op. Volledig doorsturen (self-host) ontloopt alle blokkeerders, maar Snorklee verliest dan land, regio en betrouwbare unieke bezoekers.
  5. Start Installatie testen: het resultaat zegt of de tracker vanaf uw eigen domein wordt geleverd. Het controleert dat de tracker op de homepage staat, niet dat bezoeken binnenkomen (zie verderop).

In beide modi serveert de plugin /js/flow.js vanuit WordPress en houdt de JavaScript 1 uur in cache (via de Transients API). Alleen bij Volledig doorsturen stuurt hij ook /api/event en /api/ping door, zonder events in WordPress op te slaan.


Hoe het werkt — algemeen schema

┌──────────────────────────────────────────────────────────────────────────┐
│                                                                          │
│   VOOR (3rd-party, geblokkeerd)                                          │
│   ──────────────────────────────                                         │
│                                                                          │
│   browser ──► <script src="https://snorklee.com/w.js">                │
│               ❌ ERR_BLOCKED_BY_CLIENT                                    │
│                                                                          │
│   browser ──► POST https://snorklee.com/api/event                     │
│               ❌ ERR_BLOCKED_BY_CLIENT                                    │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────────────┐
│                                                                          │
│   NA (1st-party via uw proxy, nooit geblokkeerd)                         │
│   ─────────────────────────────────────────────                          │
│                                                                          │
│   browser ──► <script src="/js/flow.js"> op uwsite.com                   │
│               ✅ geserveerd door uw proxy vanuit snorklee.com         │
│                                                                          │
│   browser ──► POST uwsite.com/api/event                                  │
│               ✅ doorgestuurd door uw proxy naar snorklee.com         │
│                                                                          │
└──────────────────────────────────────────────────────────────────────────┘

U stuurt het script en 2 API-endpoints van uw domein door naar snorklee.com:

Pad op uw domeinDoel bij snorkleeRol
/js/flow.jssnorklee.com/w.jsTrackerscript
/api/eventsnorklee.com/api/eventPaginaweergaven + aangepaste events
/api/pingsnorklee.com/api/pingHeartbeat "live" elke 30 s

De code die u in uw <head> plakt, wordt:

<script defer src="/js/flow.js" data-site="uwsite.com"></script>

Alle paden zijn 1st-party: vanuit de browser gezien verlaat niets het domein. Het is uw proxy die aan de serverzijde ongemerkt de brug slaat naar snorklee.com — de bezoeker merkt er niets van.

Wat doorsturen kost — het adres van de bezoeker: wanneer uw server /api/event doorstuurt, zien wij hém, nooit de browser. Het adres dat u in X-Forwarded-For meegeeft, bereikt ons wel, maar wij weigeren het te verorten: op een openbaar eindpunt kan iedereen elk gewenst adres beweren. Op een doorgestuurde installatie is er daarom geen land en geen regio, en worden de unieke bezoekers onbetrouwbaar (ze worden uit datzelfde adres afgeleid, waardoor verschillende bezoekers samenvallen). Dat is niet de enige meting die eronder lijdt: de bezoeksleutel wordt uit datzelfde adres afgeleid, dus ook de bronattributie, het onderscheid direct/AI, de live bezoekers en de betrokkenheid worden onbetrouwbaar, en de misbruiklimiet (50 verzoeken per minuut per adres) geldt nu in één klap voor uw hele site. Paginaweergaven en robotbezoeken worden wel gewoon geteld. Houd X-Forwarded-For in de recepten hieronder toch aan: daarmee bereikt het adres van AI-robots ons. Tellen landen en regio's voor u zwaarder dan het omzeilen van blokkeerders, stuur dan alleen het script door (zie de FAQ onder aan deze pagina).

Recept 1 — Nginx (de meest universele)

Werkt op: elke Linux-VPS (OVH, Scaleway, Hetzner, Clever Cloud met Nginx-runtime, IONOS, Infomaniak, enz.).

Soevereiniteit: neutraal (afhankelijk van uw hostingprovider; kies EU).

Voeg dit blok toe binnen het server { ... }-blok dat uw site serveert (doorgaans /etc/nginx/sites-available/uwsite.conf):

# snorklee — 1st-party proxy (anti-blokkering)
location = /js/flow.js {
    proxy_pass        https://snorklee.com/w.js;
    proxy_set_header  Host snorklee.com;
    proxy_ssl_server_name on;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  User-Agent      $http_user_agent;
    proxy_set_header  Accept-Language $http_accept_language;
    proxy_hide_header Set-Cookie;
    proxy_read_timeout 10s;
}

location ~ ^/api/(event|ping)$ {
    proxy_pass        https://snorklee.com$request_uri;
    proxy_set_header  Host snorklee.com;
    proxy_ssl_server_name on;
    proxy_set_header  X-Forwarded-For $remote_addr;
    proxy_set_header  X-Real-IP       $remote_addr;
    proxy_set_header  User-Agent      $http_user_agent;
    proxy_set_header  Accept-Language $http_accept_language;
    proxy_set_header  Origin          $http_origin;
    proxy_hide_header Set-Cookie;
    proxy_read_timeout 10s;
}

Test en herlaad vervolgens:

sudo nginx -t && sudo systemctl reload nginx

Om te controleren: open https://uwsite.com/js/flow.js in uw browser — u zou de geminimaliseerde Snorklee-code moeten zien. Bij een 502-fout controleert u of proxy_ssl_server_name on; aanwezig is (verplicht voor SNI naar snorklee.com).


Recept 2 — Caddy (de eenvoudigste)

Werkt op: elke server waarop Caddy draait (inclusief automatische TLS).

Soevereiniteit: neutraal (afhankelijk van uw hostingprovider).

In uw Caddyfile, binnen het blok van uw site:

uwsite.com {
    # ... uw bestaande configuratie ...

    # snorklee — 1st-party proxy (anti-blokkering)
    @snorkleeApi path /api/event /api/ping

    handle_path /js/flow.js {
        rewrite * /w.js
        reverse_proxy https://snorklee.com {
            header_up Host snorklee.com
            header_down -Set-Cookie
        }
    }

    handle @snorkleeApi {
        reverse_proxy https://snorklee.com {
            header_up Host snorklee.com
            header_down -Set-Cookie
        }
    }
}

Vervolgens:

caddy reload --config /etc/caddy/Caddyfile
Caddy 2.6+-syntaxis: gebruik een benoemde matcher (@snorkleeApi path …) om handle op meerdere paden toe te passen. De vorm handle /a /b /c { … } wordt niet geaccepteerd door de parser en doet caddy validate mislukken.
Caddy injecteert X-Forwarded-For en X-Real-IP automatisch — u hoeft deze niet expliciet te declareren zoals bij Nginx.

Recept 3 — Apache (mod_proxy)

Werkt op: gedeelde hosting van OVH, Infomaniak, IONOS en elke Apache-server met mod_proxy ingeschakeld. Handig voor WordPress-sites op cPanel zonder root-toegang.

Soevereiniteit: neutraal.

In uw .htaccess (in de root van de site) of <VirtualHost>:

# snorklee — 1st-party proxy (anti-blokkering)
SSLProxyEngine On

# Het script
RewriteEngine On
RewriteRule ^js/flow\.js$ https://snorklee.com/w.js [P,L]

# De API
RewriteRule ^api/(event|ping)$ https://snorklee.com/api/$1 [P,L]

# Bewaar het IP-adres van de bezoeker (setifempty overschrijft geen upstream XFF
# als u achter een andere LB/reverse-proxy zit die er al een instuurt)
ProxyPreserveHost Off
RequestHeader setifempty X-Forwarded-For "%{REMOTE_ADDR}s"
RequestHeader setifempty X-Real-IP       "%{REMOTE_ADDR}s"

# Nooit een sessiecookie aan de bezoekerskant doorsturen
Header always unset Set-Cookie

Te activeren modules op de server (doorgaans al actief bij serieuze EU-hosters): mod_proxy, mod_proxy_http, mod_ssl, mod_rewrite, mod_headers.

Bij OVH gedeelde hosting kunt u activering via de support aanvragen — dit is gratis en standaard.


Recept 4 — Bunny.net Edge Scripting

Voor wie: sites met veel verkeer die een CDN-edge dichter bij de bezoeker willen (lagere latentie + minder belasting van de oorsprongsserver).

Europese aanwezigheid: Bunny.net wordt beheerd door BunnyWay d.o.o. in Slovenië. Als u de routing dicht bij Europa wilt houden, beperk de pricing zones dan tijdens de configuratie tot Europe.

Prijzen: ~€ 0,01 per miljoen Edge Script-verzoeken + ~€ 0,005 per GB CDN-bandbreedte. Voor 1 M paginaweergaven per maand rekent u op ~€ 5 totaal. Geen minimumabonnement, betaal per gebruik.

Stappen:

  1. Maak een account aan op bunny.net (creditcard, ~€ 5 gratis startkrediet).
  2. Maak een "Pull Zone" aan:
  • Tabblad CDN → knop Add Pull Zone
  • Name: mijnsite-snorklee (vrije keuze)
  • Origin URL: https://snorklee.com
  • Pricing tier: Standard
  • Pricing zones: u kunt alleen Europe aanhouden als u routing en kosten tot die zone wilt beperken
  1. Koppel uw domein via CNAME:
  • Tabblad Hostnames → Add Hostname → flow.uwsite.com
  • Bij uw DNS-registrar (Gandi, OVH, enz.): maak een CNAME flow.uwsite.com → mijnsite-snorklee.b-cdn.net aan
  • Wacht 5 minuten, keer terug naar Bunny → klik op Generate Free SSL Certificate (automatisch Let's Encrypt)
  1. Wijs het pad toe:
  • Tabblad Edge Rules → Add Edge Rule
  • Action: Override URL
  • Match: Request URL contains "/js/flow.js"
  • Override URL: https://snorklee.com/w.js
  • Sla op
  1. Definitief snippet:
<script defer src="https://flow.uwsite.com/js/flow.js" data-site="uwsite.com"></script>

Alle /api/*-paden worden automatisch doorgestuurd naar snorklee.com/api/* via de Pull Zone.

Opmerking: Bunny geeft X-Forwarded-For standaard correct door. De landenlijst blijft op elke doorgestuurde installatie leeg.

Recept 5 — Next.js / Nuxt rewrites

Voor wie: sites met een moderne JavaScript-stack waarvan de host rewrites of serverroutes ondersteunt.

Hosting: controleer dat uw platform de nuttige headers behoudt (X-Forwarded-For, HTTP-methode, User-Agent, Accept-Language) en dat de gekozen uitvoeringsregio past bij uw privacy- en performancebehoeften.

Mogelijke opties zijn klassieke Node/SSR-hosting, serverless met expliciete regio, een Docker-container of een frontendplatform met server-side rewrites.

Next.js — in next.config.js:

module.exports = {
  async rewrites() {
    return [
      {
        source: '/js/flow.js',
        destination: 'https://snorklee.com/w.js',
      },
      {
        source: '/api/event',
        destination: 'https://snorklee.com/api/event',
      },
      {
        source: '/api/ping',
        destination: 'https://snorklee.com/api/ping',
      },
    ];
  },
};

Nuxt 3 — in nuxt.config.ts:

export default defineNuxtConfig({
  routeRules: {
    '/js/flow.js': { proxy: 'https://snorklee.com/w.js' },
    '/api/event': { proxy: 'https://snorklee.com/api/event' },
    '/api/ping': { proxy: 'https://snorklee.com/api/ping' },
  },
});
Next/Nuxt rewrites bewaren X-Forwarded-For en de HTTP-methode automatisch. POST-events worden correct doorgestuurd.

Uw host kiezen

De first-party proxy werkt met veel hosters. Voordat u er een kiest, let vooral op:

  • de uitvoeringsregio die de proxy werkelijk gebruikt;
  • de bewaartermijn van logs bij de hoster;
  • correcte doorgifte van X-Forwarded-For (daarmee bereikt het adres van AI-robots ons; het lokaliseert uw bezoekers niet);
  • de mogelijkheid om onnodige cookies of headers te verwijderen;
  • de contractuele toezeggingen die u nodig hebt voor uw eigen privacybeleid.

Controleren of het werkt

  1. Het script wordt geladen — open https://uwsite.com/js/flow.js in uw browser: u zou de geminimaliseerde Snorklee-code moeten zien (begint met !function()...).
  2. De events worden verzonden — open DevTools (F12) → tabblad Network en klik op een pagina van uw site. U zou een verzoek POST /api/event moeten zien met de respons 204 No Content.
  3. Wat u niet zult zien — op een doorgestuurde installatie blijft de lijst Landen en regio’s (blok Locaties) leeg en zijn de unieke bezoekers bij benadering: dat is verwacht en geen configuratiefout. Geen enkele proxy-instelling verandert dat vandaag.
  4. Het resultaat in Instellingen › Installatie — de sonde "Installatie testen" geeft aan of de tracker vanaf uw eigen domein wordt geleverd. Ze controleert de aanwezigheid, niet of bezoeken binnenkomen: zie daarvoor punt 2.

Veelgestelde vragen

Vertraagt de proxy mijn site? Nee, of nauwelijks. De flow.js-code weegt ≈ 2 KB gzip en blijft gecacht in de browser. Events worden verzonden via sendBeacon, dat niets blokkeert — de bezoeker merkt geen verschil, zelfs als de proxy 50 ms toevoegt.

Wat als mijn proxy uitvalt? De events uit die periode gaan verloren (geen offline wachtrij — een bewuste keuze, §25 TDDDG / AVG-minimalisatie). Uw site zelf werkt gewoon door — alleen de publieksmeting pauzeert. Net als bij elke andere externe dienst die uitvalt (Google Analytics, Plausible, enz.).

Kan ik alleen het script doorsturen en niet de API? Ja, met het attribuut data-api:

<script defer src="/js/flow.js" data-site="uwsite.com" data-api="https://snorklee.com"></script>

Het script wordt als 1st-party geserveerd (het glipt langs blokkeerders die op bestandsnaam filteren), maar de events gaan rechtstreeks naar snorklee.com, waar blokkeerders die op domein filteren ze opnieuw blokkeren. Dit is een afweging, geen halve maatregel: u verliest het geblokkeerde deel van de bezoeken en houdt daarvoor het land van uw bezoekers en betrouwbare unieke bezoekers — iets wat volledig doorsturen niet kan teruggeven.

Wat als ik later van analytics-tool wil wisselen? De proxystructuur blijft gelijk: u verandert alleen de doeldomeinen. De code <script src="/js/flow.js" data-site="..."> blijft overal hetzelfde.


Hulp nodig?

  • 🛠️ Instellingen › Installatie in het dashboard → knop Installatie testen (automatische HTTP-sonde)
  • 📧 Contact gegevensbescherming/support: zie Instellingen › Privacy in het dashboard
  • 📚 Volledige documentatie: /docs