wij bouwen precies wat je nodig hebt
case · website + boekingen

De site was het traagste onderdeel van het park.

2876
het rapportcijfer dat Google zelf aan de snelheid geeft
Lighthouse-prestatie (mobiel)
7,9 s0,9 s
zo lang stond de bezoeker naar een leeg scherm te kijken
eerste weergave (FCP)
1.100 ms10 ms
zo lang reageerde de pagina nergens op, niet op tikken en niet op scrollen
blokkeertijd (TBT)
in het kort
  • De site deed er bijna acht seconden over voor de eerste tekst, en niemand kon zien waar bezoekers afhaakten.
  • Wij bouwden hem opnieuw in Next.js met een CMS, en hingen er een meetlaag, een verkoopketen en een campagnemachine aan.
  • De eerste weergave ging naar 0,9 seconden; een groepsboeking die weken later wordt gewonnen meldt zichzelf nu terug aan de advertenties.
  • Elk cijfer hieronder is na te meten. Bron en datum staan onderaan de pagina.
Plan een gesprek →projecten vanaf €2.000
vaste prijs vooraf
adam-vr.com
bekijk adam-vr.com live ↗opname van de echte pagina, geen montage
de opdracht

Een VR-park in de A'DAM Toren draaide op een WordPress-site die in de loop der jaren was dichtgeslibd. Bezoekers wachtten bijna acht seconden op de eerste tekst. De opdracht was geen opfrisbeurt maar een volledige herbouw: sneller, meertalig, met een redactie die er zelf bij kan en met een meting die eindelijk laat zien wat er gebeurt.

waarom deze stack

Een thema en wat plug-ins hadden de snelheid niet gered. Het probleem zat in de opbouw zelf. Next.js rendert vooraf en levert vanaf de rand van het netwerk uit; Sanity haalt de inhoud uit de code zodat de redactie niet meer op ons hoeft te wachten. Bewust géén paginabouwer: die brengt het gewicht terug dat we er net uit hebben gehaald.

het verhaalwaar het begon
A'DAM VR Game & Race Park
portret volgt

De oude site werd goed gevonden en slecht bezocht: ongeveer tachtigduizend vertoningen per maand rond positie tien, waarvan iets meer dan één procent doorklikte. Dat is geen zichtbaarheidsprobleem maar een aankomstprobleem. Mensen zagen het, klikten, en kwamen op iets dat achttien seconden deed over het grootste beeld. Daaronder lag een gegroeide adresstructuur: een taalprefix naast de kale root, -nl- en -en-achtervoegsels, en twee racepagina's die elkaar beconcurreerden op dezelfde zoekopdracht. We hebben de site niet versneld, we hebben hem opnieuw gebouwd. En eerst de nulmeting vastgelegd, zodat achteraf te controleren is of het werkte.

de site

4 onderdelen
01

De structuur eerst, daarna pas het uiterlijk

De grootste winst zat niet in het ontwerp maar in de adressen. Elke pagina heeft nu één canoniek adres, de taalversies staan naast elkaar in plaats van door elkaar, en elke oude URL komt in één stap op zijn nieuwe plek uit, zonder ketens die zichzelf doorverwijzen.

  • root = Nederlands, /en/* = Engels, met hreflang aan beide kanten
  • sitemap van 112 adressen, consistente trailing slash
  • gestructureerde data per paginatype
  • omleidingskaart in één stap, geen ketens
adam-vr.com/en
dezelfde pagina op /en/ · de root is Nederlands, /en/* is Engels, met hreflang aan beide kanten
02

De cijfers hierboven zijn op een telefoon gemeten

De drie getallen bovenaan deze pagina komen uit één meting: Lighthouse in mobiele modus, met de vertraging erop die daar standaard bij hoort. Dat is bewust de zwaarste van de twee, en het is ook degene die telt. Iemand kiest zijn uitje op zijn telefoon, niet achter een glasvezelaansluiting. Wat je hiernaast ziet is dezelfde pagina uit dezelfde codebasis; er is geen aparte mobiele versie die achterloopt.

  • gemeten met Lighthouse 13.4, mobiel, standaard vertraging
  • één codebasis voor telefoon en desktop
  • de nulmeting van 28-07 en de meting erna draaiden op hetzelfde profiel
adam-vr.com
dezelfde pagina op een telefoon · één codebasis, geen aparte mobiele versie
03

Meten wat er echt gebeurt

De oude site kon niet vertellen waar bezoekers afhaakten. Er ligt nu een dubbele meetlaag: PostHog voor het gedrag en GA4 voor de vergelijkbaarheid met wat er al was. De twee momenten die ertoe doen zijn eigen gebeurtenissen geworden, zodat een boeking terug te leiden is naar waar hij vandaan kwam.

  • PostHog: trechters, sessieopnames, heatmaps en foutmeldingen
  • GA4 en GTM behouden zodat de historie niet breekt
  • boek_nu_klik en formulier_verzonden als eigen gebeurtenissen
  • analytics achter toestemming
04

De redactie hoeft niet meer te bellen

Alles wat verandert staat in het CMS: blog, experiences, tarieven, groepspakketten en de losse paginateksten. Campagnepagina's krijgen hun eigen adres onder /acties/ en zijn vóór publicatie te bekijken. Er ligt een handleiding bij, geschreven voor de redacteur en niet voor de ontwikkelaar.

  • prijzen en pakketten uit het CMS, niet uit de code
  • campagnepagina's op een eigen adres, met conceptweergave
  • reviewcijfers uit één bron die code, CMS én mail voedt
Het spellenoverzicht van adam-vr.com
negentien spelpagina's · beeld, teksten en prijzen komen uit het CMS

Zit jouw site ook vast in een thema dat elk jaar een beetje trager werd?

Plan een gesprek →

de verkoopketen

7 onderdelen
05

De keten van klik tot gewonnen boeking

Een groepsaanvraag verdween voorheen in een inbox, en daarmee ook het antwoord op de vraag welke advertentie hem had opgeleverd. Nu loopt er één keten: het formulier gaat naar de eigen database, wordt een deal in het CRM, en neemt de advertentie-klik onderweg mee. Wordt die deal weken later gewonnen, dan gaat dat 's nachts terug naar Google Ads als offline conversie. Zo kan er eindelijk op omzet gestuurd worden in plaats van op formulieren.

  • formulier → eigen database → deal in het CRM, klik-id gaat mee
  • nachtelijke ronde meldt gewonnen deals terug aan Google Ads
  • transactiemails in de huisstijl, verstuurd vanuit de eigen infrastructuur
adam-vr.com/bedrijfsuitje
hier begint de keten · dit formulier wordt een deal in het CRM
de techniek eronder6 onderdelen
06

Bewust géén directe koppeling, en dat scheelt een abonnement

De voor de hand liggende oplossing was een webhook: deal gewonnen, meteen doorgeven. Die zit er expres niet in. Hij vereist een duurder CRM-pakket, en het verschil zou alleen snelheid zijn. Bij groepsboekingen zitten er dagen tot weken tussen de klik en de gewonnen deal, en advertentieplatforms accepteren offline conversies tot negentig dagen na de klik. Eén keer per nacht is hier niet de goedkope variant, het is de juiste.

07

Het CRM is ingericht, niet aangezet

Een standaard CRM levert je een lege trechter en het advies om er zelf iets van te maken. Hier staat een pipeline die de werkelijke verkoop volgt: van nieuwe aanvraag via offerte en datum-in-optie naar geboekt, gefactureerd of betaald op locatie, met verloren als eigen uitgang. Daaronder eigen velden: soort groep, aantal personen, aanvangstijd, betaalwijze, draaiboek, verliesreden en het bronkanaal.

  • keuzelijsten met vaste waarden; de site vertaalt ernaartoe in plaats van rauwe tekst te sturen
  • een onbekende waarde wordt 'overig', nooit een foutmelding die de hele aanvraag laat vallen
  • elke deal krijgt een eigenaar toegewezen, anders vuren de bewakingen op niemand
08

Acht bewakingen die voorkomen dat een aanvraag stilvalt

Een groepsaanvraag is dagen tot weken werk, en daar gaat het mis. Niet doordat iemand nee zegt, maar doordat er niemand meer achteraan gaat. Er staan nu acht bewakingen op de trechter die een taak maken zodra iets blijft liggen: geen inhoudelijk antwoord, vierentwintig uur stil, de derde dag stil, een offerte die niet is nagebeld, een optie die verloopt, een verloren deal zonder reden, een boeking zonder aanvangstijd of betaalwijze.

09

En een takenlijst die zichzelf opruimt

Zulke bewakingen zijn nooit beter dan de lijst die ze vullen, en daar zat het echte probleem: het CRM maakt taken aan maar sluit ze nooit, ook niet als de deal allang verder is. Wij maten zestig taken over elf deals, waarvan het merendeel openstond én al gedaan was. Een lijst waarvan de helft af is, wordt binnen twee weken niet meer geopend, en dan valt de hele trechter om. Er draait nu een opruimer die een taak sluit zodra de deal hem heeft ingehaald.

  • sluit uitsluitend taken die het systeem zelf heeft aangemaakt; je eigen 'bel Nadia maandag' blijft altijd staan
  • taken gaan op voltooid en worden niet verwijderd, zodat achteraf zichtbaar blijft hoeveel er ooit heeft stilgelegen
  • post van no-reply-adressen, facturenboxen en collega's onderling telt niet als klantreactie; op één dag was negentien van de twintig taken geen klant
10

De voorgeschiedenis hoort bij de persoon

Een contact via de gewone CRM-koppeling aanmaken werkt, maar levert een leeg dossier op: je ziet het moment van invullen en verder niets. Alleen een inzending via de formulier-route, mét het cookie van de bezoeker, plakt álle eerdere sessies, paginaweergaven en het oorspronkelijke bronkanaal aan die persoon vast. Daarom gaat het formulier eerst en volgen de CRM-aanroepen daarna. Sales ziet daardoor niet alleen dát iemand aanvroeg. Ook wat hij ervoor zat te lezen staat erbij.

11

Één klant, één bedrijf

Het CRM maakt zelf een bedrijf aan zodra er een contact met een zakelijk e-mailadres binnenkomt, en dat gebeurt op de achtergrond. Wij maakten er ook een. Resultaat: twee bedrijven voor hetzelfde domein, gemeten op zevenenvijftig milliseconden uit elkaar, bij élke nieuwe zakelijke aanvraag. Opgelost zonder de bezoeker te laten wachten: eerst kijken wat er al aan het contact hangt, dan pas zoeken, dan pas aanmaken, en 's nachts samenvoegen wat er alsnog dubbel staat.

  • publieke maildomeinen krijgen geen bedrijf, anders heet je grootste klant 'Gmail'
  • de opgegeven bedrijfsnaam overschrijft nooit een naam die er al goed stond
  • de eigen database schrijft eerst en blokkeert; het CRM is best-effort, zodat een storing daar nooit een aanvraag kost

Verdwijnen jullie aanvragen ook in een mailbox, en gaat er daarna hopelijk iemand achteraan?

Plan een gesprek →

campagne & e-mail

5 onderdelen
12

Een campagnemachine, geen losse landingspagina's

Elke actie kreeg vroeger zijn eigen stuk code, en dus zijn eigen ontwikkelaar en zijn eigen deploy. Nu is een campagnepagina een documenttype: marketing maakt hem zelf aan, bekijkt hem als concept, en publiceert. De pagina verschijnt tweetalig op een eigen adres. Staat er een einddatum in, dan gaat hij daarna vanzelf offline en uit de sitemap. Niemand hoeft eraan te denken.

  • drie soorten campagnepagina: actie, landing en segment
  • conceptweergave vóór publicatie, met een knop in de redactieomgeving
  • automatisch starten en stoppen op datum
  • eerste pagina die erop draait: de partneractie met KPN, live
adam-vr.com/acties/kpn
een campagnepagina uit het CMS · gebouwd door marketing, zonder deploy
13

Het sjabloon laat met opzet dingen niet toe

De verleiding bij zo'n machine is om alles vrij te geven. Zo gaan prijzen afwijken van de kassa. Een campagnepagina heeft daarom géén prijsveld. Hij verwijst naar het product, en de prijs wordt berekend. Geen kassa-URL, die wordt afgeleid uit het product-id. Geen reviewgetal, daar staat een token. En publiceren wordt geblokkeerd zolang de verplichte velden leeg zijn.

  • prijs berekend uit het product, nooit ingetypt
  • kassa-adres afgeleid, nooit opgeslagen
  • publiceren geblokkeerd zonder meta en voorwaarden in beide talen
adam-vr.com/prijzen
prijzen staan op één plek; een campagnepagina rekent ze uit in plaats van ze over te typen
14

Één bron voor de reviewcijfers

Het aantal reviews stond op vier plekken los in de teksten: in de code, in het CMS, in de e-mails en in de gestructureerde data. Vier plekken betekent vier keer verouderen. Er draait nu een synchronisatie bij elke build die het echte cijfer ophaalt en op één plek neerzet; de rest draagt een token dat bij het renderen wordt ingevuld. In lopende tekst ronden we naar beneden af op vijftig, zodat de bewering waar blijft tussen twee builds door.

  • 42 velden in 12 CMS-documenten dragen een token in plaats van een getal
  • ook de e-mailsjablonen dragen tokens, want een verzonden mail kan niets meer opzoeken
  • naar beneden afgerond, zodat de tekst nooit méér belooft dan er staat
15

De e-mailmachine

Naast de site staat een volledig ingerichte e-mailomgeving op een eigen verzenddomein: acht flows die op gedrag en op lijsten afgaan, samen negentien mails. De sjablonen staan in versiebeheer en niet in een interface, zodat een wijziging te herleiden is. Verzenden gebeurt in golven, nooit het hele bestand tegelijk. Anders is één fout meteen onherstelbaar.

  • mobiel-eerst gestapeld als basis, niet in een mediaquery, want Gmail gooit stijlbladen weg
  • beelden als JPG op tweemaal de weergavebreedte, want webp toont niet in Outlook
  • de kop over de hero is levende tekst, niet in het beeld gebakken
  • campagnenaam dynamisch in de UTM's, dus elke golf is een eigen regel in de statistiek
16

Testen wat werkt, in plaats van vinden wat werkt

Op de homepage loopt een test op de volgorde van de secties, en in de e-mailflows kan een test volledig geautomatiseerd draaien met automatische winnaarselectie. De echte beperking is niet de techniek maar het volume: bij weinig verkeer meet je ruis. Daarom zetten we twee wezenlijk verschillende benaderingen tegen elkaar in plaats van twee formuleringen. Dat verschil is groot genoeg om überhaupt zichtbaar te worden.

de cijfers · snelheid · Lighthouse, mobielvoor → na

Zelfde tool, zelfde throttling, oude live site tegenover de nieuwe build.

Prestatiescore28762,7×
First Contentful Paint7,9 s0,9 s8,8× sneller
Speed Index13,6 s1,0 s12× sneller
Total Blocking Time1.100 ms10 ms110× beter
Cumulative Layout Shift0,1240geen verspringen
Toegankelijkheid7294+22
de cijfers · live gemeten op het productiedomeinvoor → na

Echte paginalaad op adam-vr.com, 30 juli 2026, via Navigation Timing.

Time to First Byte~0,9 s (dynamisch)19 tot 84 msedge-cache
Volledige laadtijd·556 tot 749 ms
Cumulative Layout Shift·0,000
Verzoeken per paginalaad·~58
de cijfers · structuurvoor → na
Adressen per paginatot vier variantenéén canoniek adres
Racepagina's op dezelfde zoekopdracht21
Taalopbouwtaalprefix náást de rootroot = NL, /en/* = EN
Omleidingenketensin één stap
hoogtepunten · de leisure-funneleen greep, niet alles
01
gevonden worden
schone i18n + hreflang
112-URL-sitemap, JSON-LD
02
aankomen
vooraf gerenderd, edge-cache
nul verspringende opmaak
03
kiezen
experiences & tarieven uit het CMS
meer-info zonder paginawissel
04
boeken
mobiel-eerst boekflow
boek_nu_klik als event
05
opgevolgd worden
transactiemails via Resend
leads door naar HubSpot
hoogtepunten, geen volledige lijst. op mobiel horizontaal te scrollen.
de tijdlijn
28-07-2026Nulmeting vastgelegd op de oude site, vóór de overgang.
30-07-2026Live op adam-vr.com. Eerste meting op het productiedomein.
+3 en +6 mndToetsmomenten uit het trackingplan: organisch verkeer, doorklik, conversie.
de verantwoordingna te meten
Snelheid en toegankelijkheidLighthouse 13.4, mobiel, standaard throttling28-07-2026
Vertoningen, doorklik en positieGoogle Search Console, zes maandenfeb tot jul 2026
Live paginalaadNavigation Timing op adam-vr.com30-07-2026
Verkeer en conversieGA4, rollend twaalf maandenjul 2025 tot jul 2026
wat we hier niet claimen
  • Largest Contentful Paint staat er bewust niet als winstcijfer bij: die metriek wordt bij beide metingen vertekend door het toestemmingsscript, en dan is het geen eerlijke vergelijking.
  • De SEO-score van de nieuwe build werd op een afgeschermde omgeving gemeten, met indexering uit. Dat is een meetartefact van de testopstelling, geen tekortkoming van de site.
  • De officiële Lighthouse-score op het live domein moet nog gedraaid worden; de cijfers hierboven komen van de productie-build.
  • Wat organisch verkeer en doorklikratio doen, weten we pas bij de meting op drie en zes maanden. Die staan in het trackingplan en worden hier ingevuld, ook als ze tegenvallen.
en jij?

Herken je hier iets in?

  • Je site is traag, en niemand kan precies aanwijzen waar bezoekers afhaken.
  • Elke tekstwijziging moet langs een ontwikkelaar.
  • Aanvragen komen binnen in een mailbox, en daarna is het hopen dat er iemand achteraan gaat.
  • Je adverteert, maar weet niet welke campagne de boekingen oplevert die pas weken later rondkomen.
  • Elke actie of partnerdeal is opnieuw een stuk maatwerk.

Met dat rijtje begon A'DAM VR ook. Het hoeft niet in één keer: dit is stuk voor stuk gebouwd, met steeds eerst een nulmeting zodat achteraf vaststaat of het werkte.

volgende caseKlare Wijn · website + leads
start je eigen project?Plan een gesprekprojecten vanaf €2.000 · vaste prijs vooraf