Terug naar de blog
14 augustus 2026Sergei Solod11 min leestijd

Wat ik leerde door popunderfrequentie te testen tegenover gebruikersbetrokkenheid

Ik verhoogde de popunderfrequentie in een productie-webapplicatie en vergeleek de geaggregeerde betrokkenheid voor en na de wijziging. Uiteindelijk hield ik een initiële vertraging van 45 seconden en minimaal vier minuten cooldown aan, maar de nuttigste les was hoe voorzichtig een stabiel lijkend engagementgemiddelde moet worden geïnterpreteerd.

popunderfrequency cappingwebmonetisatiegebruikersbetrokkenheidwebanalyse

Ik verwachtte dat de frequentie van popunders een duidelijke afweging zou opleveren: minder vaak adverteren om de gebruikerservaring te beschermen, of vaker om de omzet te verhogen totdat engagement begint te dalen. In productie bleek die relatie veel minder netjes.

Nadat ik de frequentie in een van mijn productie-webapplicaties had verhoogd, verwachtte ik een duidelijke breuk in de engagementdata. In plaats daarvan bleef de geaggregeerde metriek ongeveer binnen dezelfde dagelijkse bandbreedte bewegen. Sommige dagen waren beter, andere slechter, maar ik zag geen duidelijke aanhoudende daling die met de nieuwe policy begon.

Uiteindelijk behield ik deze configuratie:

Initiële vertraging: 45 seconden
Minimale cooldown na een succesvolle popunder: 4 minuten

Ook hield ik een frequency window aan dat maximaal één succesvol event toestond binnen dezelfde periode van vier minuten:

const policy = {
  initialDelaySeconds: 45,
  cooldownSeconds: 240,
  windowSeconds: 240,
  maxEventsPerWindow: 1,
};

Dit is illustratieve pseudocode, bewust losgekoppeld van een specifieke advertentieprovider, SDK, applicatie of deployment. De implementatie is minder interessant dan het beleid erachter.

Er zijn eigenlijk twee frequentiebeslissingen

Aanvankelijk stelde ik de vraag als volgt: hoeveel minuten moeten er tussen popunders zitten? Dat bleek de verkeerde abstractie. Er zijn minstens twee aparte beslissingen: de vertraging vóór de eerste advertentiemogelijkheid en de minimale tussenruimte vóór volgende mogelijkheden.

Die momenten zijn niet gelijkwaardig. Een nieuwe bezoeker heeft nog niet besloten of het product nuttig is; een betrokken gebruiker grotendeels wel. Daarom vond ik dat de eerste onderbreking meer bescherming verdiende dan latere.

Waarom ik de eerste seconden minder agressief monetiseerde

Een kortere beginvertraging maakt meer bezoekers eerder eligible en creëert daardoor meer potentiële advertentie-events. Mechanisch klopt dat. Wat die redenering negeert, is wanneer de monetisatie plaatsvindt.

Als reclame vrijwel direct na aankomst verschijnt, wordt zij onderdeel van de eerste beoordeling van de site. Krijgt de gebruiker eerst ononderbroken tijd om het product te begrijpen en te gebruiken, dan komt hetzelfde advertentiemechanisme in een andere context.

Ik gebruikte aanvankelijk een kortere vertraging, maar verhoogde die uiteindelijk naar 45 seconden. Dat is nog steeds relatief vroeg en niet bedoeld als conservatieve instelling. Het creëert simpelweg afstand tussen het begin van het bezoek en de eerste monetisatiemogelijkheid. Ik ging die 45 seconden zien als tijd waarin het product zijn waarde kan bewijzen, niet als verloren advertentievoorraad.

Vijfenveertig seconden is een drempel, geen gepland advertentiemoment

Na afloop van de vertraging wordt een gebruiker eligible; dat betekent niet dat precies op 00:45 automatisch een advertentie verschijnt. Het echte event hangt nog steeds af van een geschikte gebruikersinteractie. Iemand kan op 00:45 eligible worden en de eerste popunder pas op 01:03 genereren wanneer de volgende kwalificerende handeling plaatsvindt.

Hetzelfde geldt voor de cooldown. Vier minuten betekent dat een nieuw event niet eerder dan vier minuten na het vorige succesvolle event eligible kan worden. Het betekent niet dat automatisch elke vier minuten een advertentie verschijnt. De ingestelde intervallen zijn dus minima; in werkelijkheid kunnen ze langer zijn.

Het herhalingsinterval werd belangrijker dan de initiële vertraging

Toen ik tevreden was met de eerste vertraging, werd het herhalingsritme de belangrijkere variabele. Een lange cooldown vermindert advertentiedruk, maar kan ook betekenen dat veel betrokken gebruikers nooit een tweede mogelijkheid bereiken.

Ik wilde twee voorwaarden tegelijk: een gebruiker die doorgaat moet een realistische kans hebben om nog een monetisatie-event te genereren, terwijl er tussen events betekenisvolle stukken ononderbroken productgebruik blijven.

Ik hield vier minuten aan. Met 45 seconden initiële vertraging liggen de vroegste theoretische eligibility-momenten ongeveer op 00:45, 04:45, 08:45 en 12:45. Werkelijke events kunnen later plaatsvinden omdat er nog steeds een kwalificerende interactie nodig is.

Waarom vier minuten anders voelde dan simpelweg impressions maximaliseren

Een kortere cooldown levert meer theoretische kansen op. Als de enige metriek advertentiemogelijkheden per gebruiker is, is korter vanzelfsprekend beter. Maar het product heeft alleen advertentiewaarde zolang het ook gebruikerswaarde behoudt.

extra monetisatie
-
gedragsschade
=
nettowaarde

Vier minuten gaven gebruikers een betekenisvol blok normaal productgebruik waarin een nieuwe popunder onmogelijk was. Die garantie vond ik belangrijker dan de formulering “één per vier minuten”.

Na een monetisatie-event krijgt de gebruiker enkele minuten waarin een volgend event onmogelijk is.

Ik verwachtte een zichtbare daling in engagement

Voor de deployment was mijn belangrijkste hypothese dat hogere advertentiefrequentie in analytics een duidelijk voor-en-na-effect zou geven. Als dat was gebeurd, zou ik een sterke reden hebben gehad om de policy te versoepelen.

In plaats daarvan bleef het geaggregeerde engagement ongeveer hetzelfde fluctueren als voorheen. Ik zag geen nieuwe lagere baseline en geen langdurige reeks zwakkere waarden na de frequentiewijziging. Het failure mode dat ik groot genoeg achtte om duidelijk zichtbaar te zijn, verscheen niet overtuigend.

Wat ik daadwerkelijk kan beweren

Ik kan niet zeggen dat de advertenties geen enkel effect hadden, dat gebruikers zich er niet aan stoorden, dat retention volledig gelijk bleef of dat deze configuratie universeel optimaal is. Een geaggregeerd gemiddelde bewijst dat allemaal niet.

De sterkste uitspraak die mijn observatie ondersteunt, is beperkter:

Na de verhoging van de frequentie zag ik geen duidelijke aanhoudende daling van het geaggregeerde engagement buiten de normale variatie die ik daarvoor al zag.

Dat laat ruimte voor kleinere effecten, verschillen tussen gebruikersgroepen en gedrag dat één gemiddelde kan verbergen. Ik testte of de configuratie acceptabel genoeg was om te behouden, niet of ik een universeel optimum had gevonden.

Een stabiel gemiddelde kan heel verschillend gedrag verbergen

Een bijna onveranderd geaggregeerd gemiddelde kan verschillende realiteiten beschrijven. Bijna iedereen kan zich hetzelfde gedragen; sommige gebruikers kunnen eerder vertrekken terwijl anderen langer blijven; een kleine groep kan negatief reageren zonder het gemiddelde sterk te verschuiven; of een echt negatief effect kan simpelweg kleiner zijn dan normale dagelijkse variatie.

Daarom behandel ik een stabiel gemiddelde als bruikbaar waarschuwingssignaal, niet als bewijs van nul impact.

Engagement is niet hetzelfde als letterlijke bezoekduur

Ik behandelde een analytics-engagementmetriek ook niet als de exacte gemiddelde sessieduur. Active engagement volgt de definitie van het analytics-systeem en is niet noodzakelijk gelijk aan de tijd dat een tab openstaat. Gebruikers wisselen focus, keren later terug of navigeren op manieren die een eenvoudig “tijd op de site”-model misleidend maken.

Daarom leidde ik het advertentie-interval niet af uit een formule als “gemiddeld engagement is X, dus de volgende popunder moet vóór X plaatsvinden”. Ik gebruikte de metriek directioneel: leek het product na de wijziging materieel zwakker? Op het geaggregeerde niveau dat ik volgde, was het antwoord nee.

Cooldown en frequency window zijn verwant, maar niet identiek

De implementatie gebruikte zowel een cooldown van 240 seconden als een window van 240 seconden met maximaal één succesvol event. Ze zijn grotendeels redundant, maar drukken iets verschillende beperkingen uit.

De cooldown zegt dat een volgend event niet mag voordat genoeg tijd is verstreken sinds het vorige. Het window zegt dat binnen de gedefinieerde periode maximaal één succesvol event mag plaatsvinden. Ik behield beide zodat de bedoelde invariant duidelijk bleef, zelfs als een integratie één mechanisme anders interpreteerde.

Twee succesvolle popunders mogen nooit minder dan vier minuten uit elkaar liggen.

Eén event per window betekent niet één event per bezoek

Een waarde als maxEventsPerWindow = 1 betekent niet noodzakelijk één advertentie tijdens het volledige bezoek. De scope is het geconfigureerde window; na afloop kan een nieuw window beginnen. Ook betekent 1 niet één gebruikersactie, maar één succesvol monetisatie-event binnen die periode.

Wanneer ik frequentielogica nu controleer, stel ik drie vragen: wat telt de teller, wat reset hem en hoe lang duurt het reset-window? Zonder die antwoorden zegt een ruwe waarde zoals 1 bijna niets.

Ik scheidde policy van providerspecifieke implementatie

Het herbruikbare gedrag kan worden beschreven zonder specifieke scripts, identifiers of parameternamen bloot te leggen:

function isEligible(state, now) {
  if (!state.hasShownFirstEvent) {
    return now - state.arrivalTime >= 45_000;
  }

  return now - state.lastEventTime >= 240_000;
}

Dit is uitleggende pseudocode, geen productiebroncode. Providers, SDK’s en deploymentarchitecturen veranderen; het beleid is duurzamer: bescherm het begin van het bezoek, laat monetisatie toe nadat echt gebruik is begonnen, dwing een harde cooldown af en herhaal pas daarna.

Een succesvolle build en correct gedrag zijn verschillende dingen

Een typechecker, linter en production build kunnen veel technische eigenschappen verifiëren, maar bewijzen niet dat de advertentietijdlijn in een browser correct werkt. Deze functie vereist ook gedragsvalidatie.

1. Open een schone browserstatus.
2. Interageer vóór de initiële vertraging: er mag geen popunder komen.
3. Wacht tot na de initiële vertraging.
4. Voer een eligible interactie uit: de eerste popunder kan verschijnen.
5. Blijf interageren vóór het einde van de cooldown: geen tweede popunder.
6. Wacht tot de cooldown verlopen is.
7. Interageer opnieuw: nu kan een volgende popunder verschijnen.

Een geslaagde build en een geslaagde gedragstest beantwoorden verschillende vragen. Beide zijn nodig.

De gecombineerde advertentie-ervaring telt meer dan elke losse placement

Twee onafhankelijke advertentiesystemen kunnen afzonderlijk redelijk lijken en samen toch agressief worden. Twee formats met elk een limiet van vier minuten kunnen elkaar afwisselen, zodat de gebruiker bijvoorbeeld rond 00:45, 02:45, 04:45 en 06:45 een onderbreking ervaart.

Dat leidde tot een betere regel:

Frequency caps moeten per gebruikerservaring worden beoordeeld, niet per advertentiescript.

De gebruiker ervaart de som van de onderbrekingen, niet het configuratiebestand dat elke onderbreking veroorzaakte. Een productie-audit moet daarom vragen hoeveel verstorende advertentie-events één gebruiker werkelijk kan meemaken binnen een bepaalde periode.

Ruwe impressionaantallen zijn het verkeerde optimalisatiedoel

Meer kansen creëren door de cooldown te verkorten is eenvoudig. De moeilijkere vraag is hoeveel extra monetisatie mogelijk is zonder de totale economische waarde van de gebruiker te verminderen.

Een configuratie met minder advertenties per bezoek kan op termijn meer omzet opleveren als zij herhaald gebruik beter behoudt. Daarom vind ik omzet per gebruiker over tijd belangrijker dan impressions per bezoek. De tweede metriek is eenvoudig te maximaliseren; de eerste is het echte businessprobleem.

Een sterker experiment zou verder kijken dan één geaggregeerde grafiek

Mijn productie-observatie was voldoende om te zien dat de catastrofale uitkomst die ik vreesde niet duidelijk optrad. Ze was niet voldoende om alle downstream-effecten vast te stellen.

Een sterker experiment zou monetisatie-omzet per unieke gebruiker, omzet per bezoek, advertentie-events per gebruiker, active engagement, betekenisvolle productinteracties, returning-user rate, retention over tijd en langetermijnwaarde per gebruiker vergelijken.

Beide kanten moeten worden gemeten. Als ik alleen advertentie-output meet, concludeer ik bijna automatisch dat meer advertenties beter zijn. Als ik alleen engagement meet, kan ik relevante omzetwinst missen die vrijwel geen gedragskosten heeft.

Waarom ik de policy simpel hield

Ik zag geen reden om steeds meer uitzonderingen toe te voegen. De uiteindelijke logica bleef eenvoudig: 45 seconden wachten, monetiseren bij de volgende eligible interactie, vier minuten harde cooldown afdwingen en daarna de volgende eligible interactie weer toestaan.

Een klein aantal sterke invarianten is eenvoudiger te begrijpen, testen en debuggen dan beleid dat afhankelijk is van veel obscure uitzonderingen.

De asymmetrie is bewust

Nieuwe en betrokken gebruikers worden bewust anders behandeld. Een nieuwe bezoeker krijgt meer bescherming; iemand die blijft interageren creëert in de loop van de tijd meer monetisatiemogelijkheden.

Advertentiedruk schaalt daarmee mee met bewezen engagement, in plaats van vanaf het begin maximaal te zijn. Die conceptuele verandering was een van de nuttigste lessen uit de test.

Wat ik niet uit deze case study zou concluderen

Ik zou niet beweren dat 45 seconden universeel juist is, dat vier minuten optimaal is, dat frequentere popunders engagement nooit schaden of dat een stabiel gemiddelde betekent dat gebruikers onaangetast zijn. Ook zou ik één productie-workload niet generaliseren naar elk webproduct.

Verschillende producten hebben verschillende gebruikers, verwachtingen, acquisitiebronnen, gebruikspatronen en economie. Het resultaat is juist waardevol omdat het specifiek is, niet omdat het een universele regel bewijst.

Wat mijn mening veranderde

Voor het experiment verwachtte ik een bijna mechanische relatie tussen advertentiedruk en engagement: verhoog het ene genoeg en het andere zal zichtbaar dalen. In productie was het gedrag minder netjes.

Ik verhoogde de frequentie tot een niveau dat ik relatief hoog vond. Gebruikers bleven interageren en het geaggregeerde engagement bleef binnen zijn bekende dagelijkse bandbreedte. Dat betekent niet dat de kosten nul waren. Het betekent alleen dat ze niet groot genoeg waren om in de geobserveerde metriek het duidelijke signaal te produceren dat ik verwachtte.

Het verschil tussen “geen effect” en “geen duidelijk effect in deze meting” is belangrijk. Productiesystemen geven zelden de nette causale verhalen die we zouden willen.

Mijn regel nu

Ik vraag niet meer hoe vaak ik technisch gezien een nieuwe popunder kan tonen. Ik vraag hoeveel ononderbroken productervaring een nieuwe gebruiker moet krijgen voordat monetisatie begint, hoeveel ononderbroken gebruik een betrokken gebruiker moet krijgen voordat een volgend event mogelijk wordt, en of extra advertenties de totale gebruikerswaarde verhogen of alleen de impressionteller.

Voor deze applicatie bleef het antwoord:

45 seconden vóór de eerste eligibility
minstens 4 minuten tussen succesvolle events

De concrete waarden zijn slechts één implementatie. De regel die ik elders zou hergebruiken is breder:

Bescherm het begin van de gebruikersreis, monetiseer bewezen engagement sterker dan eerste nieuwsgierigheid en beoordeel het resultaat op gebruikerswaarde in plaats van op ruw advertentievolume.