Naar hoofdinhoud
Documentatie

Website-analyse installeren

Eén script op uw eigen website. Het meet wat bezoekers doen vóór het formulier, koppelt dat aan de aanvragen en de ondertekende offertes, en slaat vóór toestemming niets op het apparaat van de bezoeker op.

De snippet

Plaats deze regel op elke pagina, het liefst in de <head>. De sleutel staat in het portaal onder Website → Installatie; hij is openbaar en identificeert alleen uw site.

<script src="https://offerte.uwdomein.nl/zv.js"
        data-zv-site="UW_SITESLEUTEL"
        defer></script>

Staat uw formulier op een eigen subdomein (offerte.uwdomein.nl), gebruik dan dát adres — niet app.zinevu.com. Dan is de meting first-party: geen blokkeerlijst kent het adres, Safari kort de bewaartermijn niet in, en bezoek en aanvraag worden aan elkaar geknoopt zonder parameter op een link.

  • Eén regel, geen configuratie. Pagina's, talen en secties worden zelf herkend.
  • Vóór een statistiekkeuze wordt er niets op het apparaat van de bezoeker gezet — het script draait dus ook terwijl uw cookiemelding nog onbeantwoord is.
  • Het script is idempotent: twee keer geplaatst meet het één keer.
  • Voegt niets toe aan uw pagina en wacht nergens op: het meet naast uw site, niet erin.
  • Zet ?zv_test=1 achter een adres om uw eigen tabblad stil te zetten bij testen.

Wat het meet

Alles hieronder zonder dat u iets instelt of een tag schrijft. Google Analytics ziet het grootste deel hiervan alleen als iemand er eerst handmatig een tag voor bouwt.

Bezoek

  • Bezoeken, bezoekers en paginaweergaven — drie getallen, nooit één
  • Tijd per pagina, scrolldiepte en de pagina waarop iemand vertrok
  • Kanaal, bron, campagne en klik-id's van advertentieplatforms
  • Apparaat, browser, taal van de browser én taal van de pagina
  • Stad en land uit een lokaal geïnstalleerde database — er gaat geen IP-adres naar een derde partij
  • Kernwaarden voor laadsnelheid (LCP, INP, TTFB) per pagina

Gedrag

  • Modals die opengaan — op veel sites is dát de conversie en die heeft geen eigen URL
  • Cookiemeldingen apart geteld, want dat is geen conversie
  • Uitklappers en veelgestelde vragen: welke vraag opende iemand
  • Tabs en productwissels binnen één pagina
  • Kliks op telefoon, e-mail (ook als Cloudflare het adres heeft omgeschreven), WhatsApp, downloads en externe links
  • Uw eigen formulieren: gestart, verstuurd of halverwege opgegeven — alleen de veldnamen, nooit wat er is ingetypt
  • Woede-kliks en dode kliks: een knop die niets doet
  • Zoekopdrachten op uw site, gekopieerde telefoonnummers, JavaScript-fouten
  • Waar op de pagina geklikt wordt, in een raster van 32×32

Geld

  • Welke pagina naar het formulier leidde, en welk bezoek de aanvraag opleverde
  • Aanvraag → offerte → ondertekend → omzet, per pagina, kanaal en campagne
  • Eerste én laatste contact, apart — één cijfer zou de helft van uw advertenties onterecht afschrijven
  • De reis van één klant, op de leadpagina: welke pagina's, hoe lang, hoeveel bezoeken

Wat er op het apparaat van de bezoeker komt

Deze tabel is wat u in uw eigen cookieverklaring hoort te zetten. Vóór een statistiekkeuze staat er niets in — dat is geen bijzin, dat is het ontwerp.

NaamSoortWaarvoorWanneerBewaartermijn
zv_vidCookie (first-party, op uw eigen domein) + localStorageHerkent een terugkerende bezoeker over dagen heen en knoopt bezoek aan aanvraag. Bevat een willekeurig nummer, geen persoonsgegevens.Alleen nadat de bezoeker statistiekcookies heeft geaccepteerd.1 jaar na het laatste bezoek. Trekt de bezoeker de toestemming in, dan worden beide kopieën direct gewist.
zv_vid_tlocalStorageHet tijdstip van het laatste bezoek, zodat de bewaartermijn hierboven waar is.Samen met zv_vid.Idem.
zv_testsessionStorageZet dit tabblad stil bij testen. Bevat alleen “1”.Alleen als iemand zelf ?zv_test=1 in het adres typt.Tot het tabblad sluit.

Zonder toestemming meet het script nog steeds — maar dan met een sleutel die op onze server uit IP-adres en browser wordt afgeleid, elke dag vernieuwd en nooit opgeslagen. Dat betekent dat een bezoeker die morgen terugkomt dan een nieuwe bezoeker is. Dat is de eerlijke prijs van niets opslaan, en het rapport zegt dat er ook bij.

Toestemming

Het script leest de keuze zelf, of u geeft hem door. Drie bronnen, in deze volgorde.

  • Zinevu.consent({ statistics: true }) — roept u dit aan vanuit uw eigen cookiebanner, dan is dat de bron die telt.
  • Complianz: alleen cmplz_banner-status=dismissed bewijst dat er een keuze is gemaakt. Zonder die vlag wordt een 'deny' in de categorieën als 'nog niet gevraagd' gelezen, niet als een nee.
  • data-consent="assumed" op de scripttag — alleen voor een site die de keuze elders al bindend heeft vastgelegd.
  • Global Privacy Control van de browser wint altijd en zet alles terug op nul.
  • Zinevu.consent({ statistics: false }) wist het nummer uit het cookie én uit localStorage, en stopt onmiddellijk met verzenden.
// in uw eigen banner, bij Accepteren
window.Zinevu?.consent({ statistics: true })

// en bij Weigeren of Intrekken
window.Zinevu?.consent({ statistics: false })

Roept u consent() pas ná het laden aan? Dat is goed: het script wacht en gaat er niet vanuit dat stilte een nee is.

Uw eigen gebeurtenissen

Twee manieren om iets te markeren dat wij niet kunnen raden.

  • data-zv-track="naam" op een knop of link: de klik komt onder die naam in het rapport.
  • Zinevu.track('goal', { … }) voor een doel dat u zelf definieert.
  • Zinevu.page() als uw router een pagina wisselt zonder dat de URL verandert — normaal wordt dat zelf opgemerkt.
  • Zinevu.handoffToken() geeft het token van deze pagina; zet het als zvh= op een zelfgebouwde link naar het formulier en het bezoek wordt exact aan de aanvraag gekoppeld.
<a href="/showroom" data-zv-track="showroom-knop-hero">Bezoek onze showroom</a>

<script>
  window.Zinevu?.track("goal", { label: "brochure-gedownload" })
</script>

Naar uw eigen tags

Alles wat gemeten wordt, wordt ook op uw pagina omgeroepen. Uw bestaande GA4-, Ads- of Meta-opzet kan er gratis op meeliften.

  • dataLayer krijgt elke gebeurtenis als zinevu_<soort>, bijvoorbeeld zinevu_modal_view of zinevu_click_tel.
  • Op document wordt zinevu:insight afgevuurd, met de gebeurtenis in event.detail.
  • Wij nemen nooit een naam over die uw platform zelf optimaliseert — geen generate_lead, geen Purchase. Wat u daarmee doet, bepaalt u in uw eigen tagbeheer.
  • dataLayer wordt alleen gebruikt als hij al bestaat; wij maken hem niet aan.
document.addEventListener("zinevu:insight", (e) => {
  // e.detail = { kind, label, url, page_group, href, at }
  if (e.detail.kind === "click_tel") {
    gtag("event", "telefoon_klik", { label: e.detail.label })
  }
})

Als er niets verschijnt

Het portaal zegt “nog niets ontvangen”.

Open uw site, kijk in het netwerktabblad van uw browser naar een aanvraag richting /api/zv/e en let op de statuscode 204. Blijft die weg, dan is de scripttag niet geladen of staat data-zv-site verkeerd — de sleutel is 24 tekens en staat in het portaal.

Ik zie bezoek maar geen aanvragen, en de omzetkolom blijft leeg.

Dan is de koppeling tussen bezoek en formulier het probleem, niet uw site. Het rapport zegt zelf hoeveel doorkliks gekoppeld konden worden; staat dat onder 60%, dan meldt het dat met een waarschuwing. Serveer het script van uw eigen subdomein om dit op te lossen.

Alle bezoekers lijken uit één plaats te komen.

Bijna altijd een proxy of firewall die het IP-adres van de bezoeker vervangt. Wij weigeren dan liever te meten dan duizend bezoekers als één persoon te tonen; neem contact op en we kijken ernaar.

Onze eigen kantoorbezoeken staan in de cijfers.

Zet uw kantoor-IP in het portaal onder Formulieren → Genegeerde adressen. Diezelfde lijst geldt voor beide rapporten, zodat u hem niet twee keer invult.

Wij gebruiken React of Next.js.

Dan hoeft u niets te doen: routewissels worden opgemerkt en een pagina die tijdens hydration twee keer wordt aangekondigd, wordt één keer geteld.

Zinevu

Klaar om te meten

De sleutel, de snippet en de status staan in het portaal onder Website. Hulp nodig bij het plaatsen? Stuur deze pagina naar uw websitebouwer.