Skip to content

Analytics & GTM

iConfigure registreert configuratorsessies in het Manager-dashboard wanneer tracking is ingeschakeld voor een product. Op de hostpagina (script-injectie) pusht de tracking store ook events naar window.dataLayer wanneer die array bestaat — Google Tag Manager luistert naar die pushes.

Bron van de implementatie: packages/stores/tracking.js in de v2-monorepo.

Tracking inschakelen

  1. Open Manager → je product → Inzending & tracking.
  2. Schakel Tracking inschakelen voor inzichten in (tracking_enabled op het product).
  3. Sla op en publiceer het product.

Bij het laden start _StartProductTracking in de form store een sessie en voegt een rij toe in de Supabase-tabel tracking. Dezelfde data verschijnt op Dashboard en bij Data exporteren → tracking.

Als de insert mislukt, wordt tracking voor die sessie uitgeschakeld (geen verdere ic_*-events).

iFrame versus inject

InsluitmodusGTM op de hostpagina
iFrameConfigurator-JS draait in de eigen window van de iframe. GTM op de hostpagina ziet de dataLayer.push-aanroepen niet.
Script-injectieConfigurator draait op de host-windowgebruik dit voor GTM / GA4 op je site.

De code controleert de insluitmodus niet expliciet; het controleert alleen typeof dataLayer !== 'undefined'. Inject werkt omdat de configurator en GTM dezelfde window delen.

Vereisten op de hostpagina

  1. Tracking ingeschakeld voor het product in Manager.
  2. window.dataLayer moet bestaan voordat de sessie start — normaal gesproken aangemaakt door het GTM-containersnippet. Minimaal alternatief:
html
<script>window.dataLayer = window.dataLayer || [];</script>
  1. Laad GTM voor inject.iife.js en injectApp(). Zie Script-injectie.

GTM zelf is optioneel; elk script dat dataLayer definieert is voldoende om de pushes ergens te laten landen waar je ze kunt lezen.

dataLayer-events (geverifieerd)

EventWanneerSupabase
ic_setupSessie start na laden van het productInsert
ic_stepBij elke stapwisseling in de configuratorUpdate
ic_updateFeaturewijziging geregistreerd + debounce (zie hieronder)Update
ic_finishGeslaagde verzending (infostap / offerte)Update

Daarnaast wordt bij elke geslaagde verzending het legacy-event offerte_submit (v1-formaat, platte offerte-velden) gepusht — onafhankelijk van tracking_enabled — direct bij het indrukken van de verzendknop. De host-pagina krijgt daarna minimaal 1 seconde later pas de quotation/finished-postMessage, zodat de redirect naar de bedankt-pagina het event niet inhaalt.

Het ic_step-event heeft een plat formaat (geen data-wrapper) zodat het direct in GTM te gebruiken is:

javascript
{ event: 'ic_step', step: <0-based index>, step_name: '<stapnaam>', product_id, company_id, dealer_id, total_price }

ic_step wordt altijd gepusht (ook zonder tracking_enabled); de bijbehorende updates[]-registratie in Supabase gebeurt alleen bij een actieve trackingsessie.

Elke push heeft de vorm:

javascript
{ event: 'ic_setup' | 'ic_update' | 'ic_finish', data: { /* tracking-object */ } }

data-object (alle events)

VeldBeschrijving
user.devicebijv. smartphone, desktop
user.browserbijv. Chrome, Mobile Safari
user.osbijv. iOS, Windows
product_idProduct-UUID
company_idBedrijf-UUID
dealer_idDealer-UUID of null
finishedfalse tot verzending; true bij ic_finish
time.loadingMs vanaf start van de navigatie (bij benadering)
time.totalMs vanaf start van de sessie (ingesteld bij update/finish)
updates[]Stap, feature-ID, waarde, timestamp, timeSpentOnFeature, totalPrice

ic_setup

Eenmalig afgevuurd in trackingSetup, vlak voor de Supabase-insert.

ic_update — debounce

Afgevuurd vanuit trackingUpdate wanneer beide waar zijn:

  1. Er is een featurewijziging geregistreerd in updates[].
  2. lastChange.time - tracking.lastSync > 3000 (3 seconden tussenruimte).

Het is dus geen vaste timer van 3 seconden; snelle klikken kunnen samengebundeld worden tot minder pushes.

Welke interacties roepen vandaag trackingUpdate aan:

UI-padic_update
Numerieke invoer (FormFeatureNumberBox)Ja
Radio/checkbox via oude SelectInput (form-app)Ja
De meeste andere weergavewidgets (knoppen, schakelaars, dropdowns in ui-components)Nog niet gekoppeld

ic_setup en ic_finish worden hoe dan ook afgevuurd. Voor volledige GTM op stapniveau bij knop-/schakelaarconfigurators behandel je ic_finish als het conversie-event totdat de selectiewidgets updates uitzenden.

ic_finish

Afgevuurd in trackingFinish wanneer de verzending succesvol voltooit (useSubmitQuote, winkelwagenflow). Voegt een update toe met changedFeature: 'info_form' en zet finished: true.

Voorbeeld van GTM-instelling

1. Containersnippet (head)

Standaard GTM-installatie — maakt dataLayer aan.

2. Custom Event-trigger

InstellingWaarde
TriggertypeCustom Event
Eventnaamic_finish (conversie) of ic_update (engagement)

Herhaal voor ic_setup als je een tag voor sessiestart nodig hebt.

3. Data Layer-variabelen

Maak Data Layer Variable-types aan in GTM:

VariabelenaamData Layer Variable Name
DL - product iddata.product_id
DL - finisheddata.finished
DL - total timedata.time.total

Gebruik voor de laatst gewijzigde feature een Custom JavaScript-variabele of map vanuit data.updates in een tagtemplate.

4. GA4-event-tag (voorbeeld)

InstellingWaarde
TagtypeGoogle Analytics: GA4 Event
Eventnaamiconfigure_finish
TriggerCustom Event ic_finish
Eventparameter product_idGTM-variabele DL - product id

Debug-checklist

  1. Product heeft tracking ingeschakeld in Manager.
  2. Pagina gebruikt script-injectie, geen iframe.
  3. GTM Preview open; dataLayer bestaat voordat de configurator laadt.
  4. Console na het laden:
javascript
window.dataLayer.filter((e) => e.event?.startsWith('ic_'))
  1. Wijzig een numerieke feature → verwacht ic_update na debounce.
  2. Voltooi een verzending → verwacht ic_finish met data.finished === true.

Manager-analytics versus GTM

BronToepassing
Manager-dashboardFunnel, conversie, uitstroom per stap (Supabase tracking)
Data exporteren → trackingRuwe CSV
GTM / GA4Marketingtags op jouw domein

Zie Tracking & analytics voor de Manager-kant.

Verder lezen