Naar de inhoud

Server-side vs. client-side tracking

Client-side tracking stuurt events vanuit de browser en ziet context – pagina, apparaat, UTM, referrer – terwijl server-side tracking events vanuit je back-end stuurt en ziet wat er echt gebeurde. Adblockers en de zevendagengrens van Safari maken de clientkant lek; de serverkant is blind voor context. Het praktische antwoord is allebei, verdeeld per soort event.

Bijgewerkt op 7 min. leestijdDoor fromHello

In het kort

  1. Client-side tracking legt attributiecontext vast – UTM, referrer, apparaat – maar volgens GWI-data over Q2 2025 gebruikt 29,5% van de internetgebruikers minstens af en toe een adblocker, dus een deel van de browserevents komt nooit aan.

  2. ITP in Safari beperkt cookies die via JavaScript worden gezet tot een looptijd van zeven dagen en wist andere opslag waarin scripts kunnen schrijven – localStorage, IndexedDB – na zeven dagen Safari-gebruik zonder interactie met je site, waardoor terugkerende Safari-bezoekers er nieuw uitzien.

  3. Omzet- en abonnementsevents horen server-side: subscription_started gebeurt in je back-end, buiten het bereik van elke blocker.

  4. Track aan beide kanten, gekoppeld via één user-ID – de client voor context, de server voor de waarheid – en accepteer een blijvend verschil tussen de twee tellingen.

Wat is het verschil, in één zin?

Client-side tracking ziet context; server-side tracking ziet de waarheid. De browser kent de UTM-parameters, de referrer, het apparaat en de pagina – en verliest events aan blockers. Je back-end weet wat er echt gebeurde – een abonnement startte, een betaling mislukte – en weet niets over hoe de gebruiker daar kwam. Deze gids gaat over waar je meet. Wat je trackt – naamgeving en de lijst met events om mee te beginnen – staat in het trackingplan voor start-ups; waarom de data überhaupt first-party hoort te zijn, lees je in first-party data en tracking. Beide helften horen in één trackingplan.

Vier begrippen die de keuze tussen client en server omkaderen.

Wat ziet client-side tracking – en wat mist het?

Aan de clientkant zit de context. De SDK in de browser legt UTM-parameters, de referrer, de landingspagina, het apparaat en het sessiegedrag vast – alles wat attributie en funnelanalyse nodig hebben. Wat hij mist, zijn hele gebruikers: volgens GWI-data die Backlinko bundelde, gebruikte 29,5% van de internetgebruikers wereldwijd in Q2 2025 minstens af en toe een adblocker – zo’n 1,77 miljard mensen. Veel blockers houden analysescripts samen met advertenties tegen, dus een meetbaar deel van je client-side events wordt nooit verstuurd.

Ook zonder blocker maakt Safari client-side tracking lek. Volgens de ITP-documentatie van WebKit beperkt Safari cookies die via JavaScript worden gezet tot een looptijd van zeven dagen en wist het alle andere opslag waarin scripts kunnen schrijven – localStorage, IndexedDB – na zeven dagen Safari-gebruik zonder interactie met je site. Zodra die periode van zeven gebruiksdagen voorbij is, ziet een terugkerende bezoeker eruit als gloednieuw en raak je de identiteit kwijt. Het verlies is meetbaar: toen Plausible eind augustus 2021 in een test zijn eigen tellingen vergeleek met Google Analytics op een site die trending was op Hacker News en Reddit, miste Google Analytics 58,67% van de bezoekers – een extreem geval met een technisch publiek; Plausible noemt eerder onderzoek dat de blokkering onder de 10% plaatst op lifestylesites en boven de 25% op sites met een technische focus.

Wat ziet server-side tracking – en wat mist het?

Bij server-side tracking meldt je back-end statuswijzigingen aan de events-API: subscription_started, payment_failed, plan_changed. Die events gebeuren op je servers, niet in de browser – ze daar vastleggen is geen omweg, het is de eerlijke bron. Er zit geen blocker in de weg, geen opslaglimiet laat ze verlopen, en de telling klopt met je database omdat ze uit je database komt. Een server-side event is leidend omdat het vastlegt wat je systeem deed, niet wat een browser wist door te geven. De blinde vlek is context: je back-end heeft geen idee welke campagne, referrer of welk apparaat de gebruiker binnenbracht – die context heeft altijd alleen aan de clientkant bestaan.

Client of server: welke events gaan waarheen?

Soort eventTracken viaWaarom
Paginaweergaven & campagne-attributieClientUTM, referrer en landingspagina bestaan alleen in de browser.
Gebruik van features in het productClient (ook server als het kritiek is)UI-context telt; voeg een serverkopie toe als een metric ervan afhangt.
Aanmelden & inloggenBeideHet koppelpunt voor identiteit – dezelfde user-ID op beide paden.
Omzet & abonnementsstatusServerGeldevents gebeuren in je back-end; de telling moet kloppen met je database.
E-mail-, webhook- & integratie-eventsServerZe komen binnen als webhooks van je providers – aan de clientkant valt er niets vast te leggen.

Hoe verdeelt een klein team het?

  • Alles wat met geld te maken heeft – proefperiodes, abonnementen, betalingen, terugbetalingen – gaat server-side. Als churn of MRR moet kloppen, is de server de bron van waarheid.
  • Alles wat met attributie te maken heeft – paginaweergaven, campagnes, referrers – blijft client-side. Die context valt later niet meer te reconstrueren.
  • Identificeer op beide paden met dezelfde user-ID, zodat funnels aan elkaar sluiten en A/B-tests met weinig verkeer elke gebruiker over apparaten heen aan één variant toewijzen.
  • Accepteer het verschil. Clienttellingen vallen per definitie te laag uit; gebruik ze voor de richting, en serverevents voor alles wat je rapporteert.

Waarom kloppen de twee getallen nooit?

Draai je beide, dan wijken de tellingen van elkaar af – voorgoed. Het clientgetal valt te laag uit omdat blockers en ITP events opeten; het servergetal mist de context om te zeggen waar gebruikers vandaan kwamen. Dit is geen bug om te repareren, maar een eigenschap om te benoemen: verwacht een blijvend verschil tussen clientanalyses en de waarheid van de server, ken de ruwe omvang ervan voor jouw publiek en jaag er niet langer achteraan. Rapporteer elk getal vanaf zijn eerlijke kant – attributie en de richting van je funnel uit clientdata; alles wat in een pitchdeck of op een factuur belandt – churnrate, MRR, actieve abonnementen – berekend uit serverevents. Engagementplatforms als Iterable en Ortto accepteren om dezelfde reden beide bronnen.

Hoe pakt fromHello het aan?

fromHello gaat standaard uit van de verdeling. De JS/TS-SDK trackt client-side en houdt een offline queue bij in localStorage – events die tijdens een verbroken verbinding afgaan, blijven bewaard en worden opnieuw verstuurd zodra de browser weer online is – terwijl dezelfde events-API ook verzendingen vanaf de server accepteert, zodat subscription_started rechtstreeks uit je back-end komt, met een API-sleutel. Beide paden schrijven naar één profiel: de attributie die de SDK vastlegde en de omzetevents die je server stuurde, beschrijven dezelfde persoon. Segmenten, journeys en analyses lezen uit dat ene profiel – je verdeelt de instrumentatie, niet de identiteit.

FAQ

Veelgestelde vragen

  • Moet ik alles overzetten naar server-side tracking?

    Nee. Server-side events hebben geen context over UTM, referrer of apparaat, dus alles daarheen verplaatsen ruilt verlies in voor blindheid. Houd attributie en context uit het product client-side, verplaats geld en lifecyclestatus naar de server en koppel de twee met één user-ID. De verdeling per soort event wint van beide uitersten.

  • Omzeilt server-side tracking adblockers?

    Eerlijk gezegd: je eigen first-party events die je back-end verstuurt, gaan nooit door de browser, dus er valt voor een blocker niets te blokkeren. Dat is geen achterdeur tegen gebruikers – de eigen events van je product zijn geen advertentietechnologie, en toestemming blijft hoe dan ook gelden. Onder de AVG (GDPR) draait toestemming om de persoon en het doel, niet om de route die het event aflegde.

  • Welke events moet ik als eerste server-side zetten?

    De levenscyclus van omzet en abonnementen: subscription_started, payment_failed, plan_changed, opzeggingen, terugbetalingen. Ze gebeuren al in je back-end, ze sturen je berekeningen van churn en MRR, en het zijn de events waarbij een te lage telling je echte beslissingen kost.

  • Hoe worden client- en serverevents aan elkaar gekoppeld?

    Via een gedeelde user-ID. Geef de SDK in de browser dezelfde ID die je back-end naar de events-API stuurt, en beide stromen komen op één profiel terecht. Funnels, experimenten en segmenten lezen dan één persoon in plaats van twee halve.

fromHello is open source marketing automation: berichten die worden getriggerd door wat mensen doen.

fromHello Cloud is in early access via de wachtlijst.

Early access

fromHello Cloud

Je bent niet begonnen om klein te blijven.

Early access tot fromHello Cloud gaat gefaseerd open. De onboarding is persoonlijk: we helpen je met de inrichting en met het overzetten van je contacten.

We mailen je zodra je plek vrijkomt. Geen spam.

Nog niet zover? Bekijk op GitHub