Je m’attendais à un compromis assez évident avec la fréquence des popunders : moins de publicité pour préserver l’expérience utilisateur, ou davantage pour augmenter les revenus jusqu’à ce que l’engagement commence à baisser. En production, la relation s’est révélée beaucoup moins nette.
Après avoir augmenté la fréquence sur l’une de mes applications web en production, je pensais voir une rupture claire dans les données d’engagement. À la place, la métrique agrégée a continué d’évoluer globalement dans sa plage habituelle de variation quotidienne. Certains jours étaient meilleurs, d’autres moins bons, mais je n’ai pas observé de baisse nette et durable commençant avec la nouvelle politique.
J’ai finalement conservé cette configuration :
Délai initial : 45 secondes
Cooldown minimal après un popunder réussi : 4 minutes
J’ai également gardé une fenêtre de fréquence limitant à un seul le nombre d’événements réussis sur la même période de quatre minutes :
const policy = {
initialDelaySeconds: 45,
cooldownSeconds: 240,
windowSeconds: 240,
maxEventsPerWindow: 1,
};
Il s’agit d’un pseudocode illustratif, volontairement indépendant de tout fournisseur publicitaire, SDK, application ou déploiement. L’implémentation précise est moins intéressante que la politique qu’elle traduit.
Il y a en réalité deux décisions de fréquence
Au départ, je formulais le problème ainsi : combien de minutes faut-il laisser entre deux popunders ? Cette abstraction était trop simpliste. Il y a au moins deux décisions distinctes : le délai avant la première opportunité publicitaire et l’intervalle minimal avant les suivantes.
Ces deux moments ne se valent pas. Un nouveau visiteur n’a pas encore décidé si le produit lui est utile. Un utilisateur déjà engagé, si. J’ai donc estimé que la première interruption méritait davantage de protection que les suivantes.
Pourquoi j’ai cessé de monétiser les premières secondes aussi agressivement
Un délai initial plus court rend davantage de visiteurs éligibles et crée donc davantage d’opportunités publicitaires potentielles. Mécaniquement, c’est vrai. Ce raisonnement ignore toutefois le moment où la monétisation se produit.
Si la publicité intervient presque immédiatement après l’arrivée, elle fait partie de la première impression du site. Si l’utilisateur dispose d’abord d’un temps ininterrompu pour comprendre et utiliser le produit, le même mécanisme publicitaire apparaît dans un contexte différent.
J’utilisais auparavant un délai plus court, puis je suis passé à 45 secondes. Cela reste relativement tôt et ne constitue pas un réglage conservateur. L’objectif était simplement de séparer le début de la visite de la première opportunité de monétisation. J’ai fini par considérer ces 45 secondes comme du temps permettant au produit de démontrer sa valeur, plutôt que comme de l’inventaire publicitaire perdu.
Quarante-cinq secondes représentent un seuil, pas un horaire programmé
L’expiration du délai rend l’utilisateur éligible ; elle ne déclenche pas forcément une publicité à 00:45. L’événement réel dépend encore d’une interaction admissible. Un visiteur peut devenir éligible à 00:45 et déclencher le premier popunder à 01:03 lors de l’action suivante.
Le même principe vaut pour le cooldown. Quatre minutes signifient qu’un nouvel événement ne peut redevenir éligible avant quatre minutes après le précédent événement réussi. Cela ne signifie pas qu’une publicité apparaît automatiquement toutes les quatre minutes. Les intervalles configurés sont donc des minimums ; l’espacement réel peut être plus long.
L’intervalle de répétition comptait davantage que le délai initial
Une fois satisfait du premier délai, le rythme de répétition est devenu la variable la plus importante. Un long cooldown réduit la pression publicitaire, mais peut aussi faire que de nombreux utilisateurs engagés n’atteignent jamais une deuxième opportunité.
Je voulais satisfaire deux conditions : donner à un utilisateur qui continue d’utiliser l’application une possibilité réaliste de générer un autre événement de monétisation, tout en conservant entre les événements de véritables périodes d’utilisation sans interruption.
J’ai retenu quatre minutes. Avec un délai initial de 45 secondes, les premiers points théoriques d’éligibilité se situent vers 00:45, 04:45, 08:45 et 12:45. Les événements réels peuvent survenir plus tard puisqu’une interaction admissible reste nécessaire.
Pourquoi quatre minutes diffèrent d’une simple maximisation des impressions
Réduire le cooldown crée davantage d’opportunités théoriques. Si la seule métrique est le nombre d’opportunités publicitaires par utilisateur, un intervalle plus court gagne évidemment. Mais le produit n’a de valeur publicitaire que tant qu’il conserve de la valeur pour l’utilisateur.
monétisation supplémentaire
-
dommage comportemental
=
valeur nette
Quatre minutes me donnaient un bloc significatif d’utilisation normale du produit pendant lequel un autre popunder était impossible. Cette garantie m’importait davantage que la formule « un toutes les quatre minutes ».
Après un événement de monétisation, l’utilisateur dispose de plusieurs minutes pendant lesquelles aucun autre ne peut se produire.
Je m’attendais à une baisse visible de l’engagement
Avant le déploiement, mon hypothèse principale était qu’une fréquence publicitaire plus élevée produirait une baisse claire entre l’avant et l’après dans les analytics. Si cela s’était produit, j’aurais eu une bonne raison d’assouplir la politique.
Au lieu de cela, l’engagement agrégé a continué de fluctuer à peu près comme avant. Je n’ai vu ni nouveau plancher nettement plus bas, ni série durablement plus faible après le changement de fréquence. Le problème que j’imaginais suffisamment important pour être visible ne s’est pas manifesté clairement.
Ce que je peux réellement affirmer
Je ne peux pas affirmer que les publicités n’ont eu aucun effet, que les utilisateurs ne les ont pas mal vécues, que la rétention est restée parfaitement identique ou que cette configuration est globalement optimale. Une moyenne agrégée ne prouve rien de tout cela.
La formulation la plus forte que mon observation permet est plus étroite :
Après l’augmentation de fréquence, je n’ai pas observé de baisse claire et durable de l’engagement agrégé dépassant la variation ordinaire déjà présente auparavant.
Cette formulation laisse la place à des effets plus faibles, à des différences entre groupes d’utilisateurs et à des comportements masqués par une moyenne unique. J’ai testé si la configuration était suffisamment acceptable pour être conservée, pas si j’avais trouvé un optimum universel.
Une moyenne stable peut masquer des comportements très différents
Une moyenne agrégée presque inchangée peut correspondre à des réalités très différentes. Presque tout le monde peut se comporter pareil ; certains utilisateurs peuvent partir plus tôt tandis que d’autres restent plus longtemps ; un petit groupe peut réagir négativement sans déplacer fortement la moyenne ; ou un véritable effet négatif peut simplement être inférieur aux fluctuations quotidiennes normales.
Je considère donc une moyenne stable comme un signal de surveillance utile, pas comme une preuve d’absence d’impact.
Engagement ne signifie pas littéralement durée de visite
Je me suis également gardé de traiter une métrique d’engagement analytics comme la durée moyenne exacte d’une session. L’engagement actif dépend de la définition du système de mesure et ne correspond pas nécessairement au temps écoulé avec un onglet ouvert. Les utilisateurs changent de fenêtre, reviennent plus tard ou naviguent d’une manière qui rend trompeuse une simple notion de « temps passé sur le site ».
Je n’ai donc pas déduit l’intervalle publicitaire d’une formule du type « l’engagement moyen vaut X, donc le prochain popunder doit arriver avant X ». J’ai utilisé la métrique comme indicateur directionnel : le produit semblait-il sensiblement plus faible après le changement ? Au niveau agrégé que je suivais, la réponse était non.
Cooldown et fenêtre de fréquence sont liés sans être identiques
L’implémentation combinait un cooldown de 240 secondes et une fenêtre de 240 secondes avec un maximum d’un événement réussi. Les deux sont largement redondants, mais expriment des contraintes légèrement différentes.
Le cooldown dit de ne pas autoriser un nouvel événement avant qu’un temps suffisant se soit écoulé depuis le précédent. La fenêtre dit de ne pas autoriser plus d’un événement réussi pendant la période définie. J’ai conservé les deux pour que l’invariant recherché reste évident même si une intégration interprète l’un des mécanismes différemment.
Deux popunders réussis ne doivent jamais se produire à moins de quatre minutes d’intervalle.
Un événement par fenêtre ne signifie pas un événement par visite
Une valeur comme maxEventsPerWindow = 1 ne signifie pas forcément une seule publicité pendant tout le séjour d’un visiteur. Sa portée est la fenêtre configurée ; une autre peut commencer après son expiration. Le 1 ne représente pas non plus une action utilisateur, mais un événement de monétisation réussi pendant cette période.
Désormais, lorsque j’examine une logique de fréquence, je pose trois questions : que compte le compteur, qu’est-ce qui le réinitialise et combien de temps dure la fenêtre de réinitialisation ? Sans ces réponses, une valeur brute comme 1 dit très peu de choses.
J’ai séparé la politique de l’implémentation propre au fournisseur
Le comportement réutilisable peut être exprimé sans exposer de scripts, identifiants ni paramètres propres à un fournisseur :
function isEligible(state, now) {
if (!state.hasShownFirstEvent) {
return now - state.arrivalTime >= 45_000;
}
return now - state.lastEventTime >= 240_000;
}
Il s’agit de pseudocode explicatif, pas du code source de production. Les fournisseurs, SDK et architectures de déploiement changent ; la politique est plus durable : protéger le début de la visite, autoriser la monétisation après le début d’un usage réel, imposer un cooldown strict et ne recommencer qu’après ce cooldown.
Un build réussi et un comportement correct sont deux choses différentes
Un typechecker, un linter et un build de production peuvent vérifier de nombreuses propriétés techniques, mais aucun ne prouve que la chronologie publicitaire se comporte correctement dans un navigateur. Cette fonctionnalité exige aussi une validation comportementale.
1. Ouvrir le navigateur dans un état propre.
2. Interagir avant la fin du délai initial : aucun popunder ne doit apparaître.
3. Attendre au-delà du délai initial.
4. Effectuer une interaction admissible : le premier popunder peut apparaître.
5. Continuer à interagir avant la fin du cooldown : aucun second popunder.
6. Attendre l’expiration du cooldown.
7. Interagir de nouveau : un autre popunder peut désormais apparaître.
Un build réussi et un test comportemental réussi répondent à des questions différentes. Les deux comptent.
L’expérience publicitaire combinée compte davantage que chaque emplacement
Deux systèmes publicitaires indépendants peuvent sembler raisonnables séparément tout en produisant ensemble une expérience agressive. Deux formats limités à quatre minutes peuvent s’entrelacer de façon à créer des interruptions vers 00:45, 02:45, 04:45 et 06:45.
J’en ai tiré une règle plus forte :
Les limites de fréquence doivent être évaluées au niveau de l’expérience utilisateur, pas séparément pour chaque script publicitaire.
L’utilisateur subit la somme des interruptions, pas le fichier de configuration qui les a produites. Un audit de production devrait donc demander combien d’événements publicitaires perturbateurs un utilisateur peut réellement rencontrer sur une période donnée.
Le nombre brut d’impressions est une mauvaise cible d’optimisation
Créer plus d’opportunités en réduisant le cooldown est facile. La question difficile est de savoir combien de monétisation supplémentaire peut être obtenue sans réduire la valeur économique totale de l’utilisateur.
Une configuration générant moins de publicités par visite peut produire davantage de revenus au fil du temps si elle préserve mieux l’usage récurrent. Je m’intéresse donc davantage au revenu par utilisateur dans le temps qu’aux impressions par visite. La seconde métrique est facile à maximiser ; la première correspond au vrai problème économique.
Un test plus solide irait au-delà d’un seul graphique agrégé
Mon observation en production suffisait à montrer que le scénario catastrophique que je craignais ne s’était pas manifesté de manière évidente. Elle ne suffisait pas à établir tous les effets en aval.
Une expérience plus solide comparerait le revenu de monétisation par utilisateur unique, le revenu par visite, les événements publicitaires par utilisateur, l’engagement actif, les interactions significatives avec le produit, le taux de retour, la rétention dans le temps et la valeur utilisateur à plus long terme.
Les deux côtés doivent être mesurés. Si je ne mesure que la sortie publicitaire, j’arriverai presque forcément à la conclusion que davantage de publicité est préférable. Si je ne mesure que l’engagement, je peux ignorer des gains de revenus significatifs ayant un coût comportemental presque nul.
Pourquoi j’ai gardé la politique simple
Je n’ai vu aucune raison d’ajouter une collection croissante d’exceptions. La logique finale restait facile à expliquer : attendre 45 secondes, autoriser la monétisation lors de l’interaction admissible suivante, imposer quatre minutes de cooldown strict, puis autoriser l’interaction admissible suivante à monétiser.
Un petit nombre d’invariants solides est plus facile à comprendre, tester et déboguer qu’une politique remplie d’exceptions obscures.
L’asymétrie est volontaire
La politique traite différemment les nouveaux utilisateurs et les utilisateurs engagés. Un nouveau visiteur reçoit davantage de protection ; un utilisateur qui continue d’interagir crée progressivement plus d’opportunités de monétisation.
La pression publicitaire évolue donc avec l’engagement démontré au lieu d’être maximale dès le départ. Ce changement conceptuel a été l’un des enseignements les plus utiles de l’expérience.
Ce que je ne conclurais pas de cette étude de cas
Je ne dirais pas que 45 secondes constituent partout le bon délai, que quatre minutes sont l’intervalle optimal, que des popunders plus fréquents ne nuisent jamais à l’engagement, ni qu’une moyenne stable signifie que les utilisateurs ne sont pas affectés. Je ne généraliserais pas non plus une charge de production à tous les produits web.
Les produits ont des utilisateurs, attentes, sources d’acquisition, habitudes d’utilisation et modèles économiques différents. Le résultat est utile précisément parce qu’il est spécifique, pas parce qu’il prouve une règle universelle.
Ce qui m’a fait changer d’avis
Avant l’expérience, j’imaginais une relation presque mécanique entre pression publicitaire et engagement : augmenter suffisamment la première devait faire chuter visiblement le second. La production s’est montrée moins ordonnée.
J’ai augmenté la fréquence jusqu’à un niveau que je considérais relativement élevé. Les utilisateurs ont continué à interagir et l’engagement agrégé est resté dans sa plage quotidienne habituelle. Cela ne signifie pas que le coût était nul. Cela signifie qu’il n’était pas assez important pour produire dans la métrique observée le signal évident que j’attendais.
La différence entre « aucun effet » et « aucun effet évident dans cette mesure » est importante. Les systèmes en production nous offrent rarement les histoires causales parfaitement nettes que nous aimerions obtenir.
Ma règle aujourd’hui
Je ne demande plus à quelle fréquence je peux techniquement afficher un autre popunder. Je demande combien de temps d’expérience sans interruption un nouvel utilisateur devrait recevoir avant le début de la monétisation, combien de temps un utilisateur engagé devrait obtenir avant qu’un nouvel événement devienne possible, et si la publicité supplémentaire augmente la valeur totale de l’utilisateur ou seulement le compteur d’impressions.
Pour cette application, j’ai conservé :
45 secondes avant la première éligibilité
au moins 4 minutes entre deux événements réussis
Ces valeurs ne sont qu’une implémentation. La règle que je réutiliserais est plus générale :
Protéger le début du parcours utilisateur, monétiser davantage l’engagement démontré que la curiosité initiale, et juger le résultat à la valeur par utilisateur plutôt qu’au volume publicitaire brut.