Torna al blog
14 agosto 2026Sergei Solod12 min di lettura

Cosa ho imparato testando la frequenza dei popunder rispetto al coinvolgimento degli utenti

Ho aumentato la frequenza dei popunder su un’applicazione web in produzione e osservato il coinvolgimento aggregato prima e dopo il cambiamento. Ho mantenuto un ritardo iniziale di 45 secondi e un cooldown minimo di quattro minuti, ma il risultato più utile è stato capire quanto cautamente vada interpretata una media di engagement apparentemente stabile.

popunderfrequency cappingmonetizzazione webcoinvolgimento utentiweb analytics

Mi aspettavo un compromesso evidente: mostrare meno popunder per proteggere l’esperienza utente, oppure mostrarne di più per aumentare i ricavi finché l’engagement non avesse iniziato a calare. In produzione il rapporto è stato molto meno lineare.

Dopo aver aumentato la frequenza in una delle mie applicazioni web in produzione, mi aspettavo una rottura evidente nei dati di engagement. Invece la metrica aggregata ha continuato a muoversi più o meno nel consueto intervallo di variazione giornaliera. Alcuni giorni erano migliori, altri peggiori, ma non ho visto un calo chiaro e persistente iniziato con la nuova policy.

Alla fine ho mantenuto questa configurazione:

Ritardo iniziale: 45 secondi
Cooldown minimo dopo un popunder riuscito: 4 minuti

Ho inoltre mantenuto una frequency window che consentiva al massimo un evento riuscito nello stesso periodo di quattro minuti:

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

È pseudocodice illustrativo, intenzionalmente indipendente da provider pubblicitari, SDK, applicazioni o deployment specifici. La parte più interessante non è l’implementazione, ma la policy che rappresenta.

In realtà ci sono due decisioni sulla frequenza

All’inizio riducevo il problema a una sola domanda: quanti minuti devono passare tra due popunder? Era l’astrazione sbagliata. Ci sono almeno due decisioni: il ritardo prima della prima opportunità pubblicitaria e l’intervallo minimo prima di quelle successive.

Questi due momenti non sono equivalenti. Un nuovo visitatore non ha ancora deciso se il prodotto gli sia utile; un utente già coinvolto sì. Ho quindi concluso che la prima interruzione meritasse più protezione delle successive.

Perché ho smesso di monetizzare in modo così aggressivo i primi secondi

Un ritardo iniziale più breve rende più visitatori idonei e crea quindi più potenziali eventi pubblicitari. Meccanicamente è vero. Ma questo ragionamento ignora il momento in cui avviene la monetizzazione.

Se la pubblicità compare quasi subito dopo l’arrivo, diventa parte della prima valutazione del sito. Se invece l’utente ha prima un po’ di tempo senza interruzioni per capire e usare il prodotto, lo stesso meccanismo pubblicitario si presenta in un contesto diverso.

Prima usavo un ritardo più breve, poi sono passato a 45 secondi. È ancora relativamente presto e non era pensato come valore conservativo. Serviva semplicemente a separare l’inizio della visita dalla prima opportunità di monetizzazione. Ho iniziato a considerare quei 45 secondi come tempo in cui il prodotto può dimostrare il proprio valore, non come inventario pubblicitario perso.

Quarantacinque secondi sono una soglia, non un evento programmato

La fine del ritardo stabilisce l’idoneità; non significa che a 00:45 debba apparire automaticamente un annuncio. L’evento reale dipende ancora da un’interazione idonea. Un utente può diventare idoneo a 00:45 e generare il primo popunder a 01:03, quando compie l’azione valida successiva.

Lo stesso vale per il cooldown. Quattro minuti significano che un altro evento non può diventare idoneo prima che siano trascorsi quattro minuti dall’evento riuscito precedente. Non significa che un annuncio appaia automaticamente ogni quattro minuti. Gli intervalli configurati sono quindi minimi; nella pratica possono essere più lunghi.

L’intervallo di ripetizione contava più del ritardo iniziale

Una volta soddisfatto del primo ritardo, la cadenza di ripetizione è diventata la variabile più importante. Un cooldown lungo riduce la pressione pubblicitaria, ma può anche far sì che molti utenti coinvolti non raggiungano mai una seconda opportunità.

Volevo soddisfare due condizioni contemporaneamente: chi continua a usare l’applicazione deve avere una possibilità realistica di generare un altro evento di monetizzazione, ma tra gli eventi devono comunque esserci blocchi significativi di utilizzo senza interruzioni.

Ho mantenuto quattro minuti. Con un ritardo iniziale di 45 secondi, i primi punti teorici di idoneità sono circa 00:45, 04:45, 08:45 e 12:45. Gli eventi reali possono avvenire più tardi perché resta necessaria un’interazione idonea.

Perché quattro minuti sono diversi dal semplice massimizzare le impression

Ridurre il cooldown genera più opportunità teoriche. Se l’unica metrica è il numero di opportunità pubblicitarie per utente, un intervallo più breve è ovviamente migliore. Ma il prodotto ha valore pubblicitario solo finché mantiene valore per l’utente.

monetizzazione aggiuntiva
-
danno comportamentale
=
valore netto

Quattro minuti offrivano un blocco significativo di uso normale del prodotto durante il quale un altro popunder era impossibile. Questa garanzia mi interessava più dell’espressione “uno ogni quattro minuti”.

Dopo un evento di monetizzazione, l’utente ha diversi minuti nei quali un altro evento è impossibile.

Mi aspettavo un calo visibile dell’engagement

Prima del deployment, la mia ipotesi principale era che una frequenza pubblicitaria maggiore producesse un chiaro calo prima-dopo nelle analytics. Se fosse successo, avrei avuto un forte motivo per rendere la policy meno aggressiva.

Invece l’engagement aggregato ha continuato a fluttuare in modo simile a prima. Non ho visto un nuovo livello di base più basso né una sequenza persistente di valori più deboli dopo il cambiamento. Il problema che mi aspettavo fosse abbastanza grande da risultare evidente non è comparso chiaramente.

Cosa posso effettivamente affermare

Non posso dire che gli annunci non abbiano avuto alcun effetto, che gli utenti non li abbiano trovati fastidiosi, che la retention sia rimasta perfettamente invariata o che questa configurazione sia ottimale in assoluto. Una media aggregata non dimostra nulla di tutto ciò.

L’affermazione più forte sostenuta dalla mia osservazione è più limitata:

Dopo l’aumento della frequenza non ho osservato un calo chiaro e persistente dell’engagement aggregato superiore alla normale variazione che vedevo già in precedenza.

Questo lascia spazio a effetti più piccoli, differenze tra gruppi di utenti e comportamenti nascosti da una singola media. Ho testato se la configurazione fosse abbastanza accettabile da mantenerla, non se avessi trovato un optimum universale.

Una media stabile può nascondere comportamenti molto diversi

Una media aggregata quasi invariata può descrivere realtà molto differenti. Quasi tutti possono comportarsi allo stesso modo; alcuni utenti possono andarsene prima mentre altri restano più a lungo; un piccolo gruppo può reagire negativamente senza spostare molto la media; oppure un effetto negativo reale può essere semplicemente più piccolo della normale variazione giornaliera.

Per questo considero una media stabile un utile segnale di monitoraggio, non una prova di impatto zero.

L’engagement non coincide con la durata letterale della visita

Ho evitato anche di trattare una metrica di engagement analytics come durata media esatta della sessione. L’engagement attivo dipende dalla definizione del sistema di analytics e non coincide necessariamente con il tempo trascorso con una scheda aperta. Gli utenti cambiano finestra, tornano più tardi o navigano in modi che rendono fuorviante un semplice modello di “tempo sul sito”.

Non ho quindi derivato l’intervallo pubblicitario da una formula come “engagement medio = X, quindi il prossimo popunder deve avvenire prima di X”. Ho usato la metrica in senso direzionale: dopo il cambiamento il prodotto sembrava materialmente più debole? Al livello aggregato che monitoravo, la risposta era no.

Cooldown e frequency window sono collegati, ma non identici

L’implementazione usava sia un cooldown di 240 secondi sia una window di 240 secondi con un massimo di un evento riuscito. Sono in gran parte ridondanti, ma esprimono vincoli leggermente diversi.

Il cooldown dice di non permettere un altro evento finché non è trascorso abbastanza tempo dal precedente. La window dice di non permettere più di un evento riuscito nel periodo definito. Ho mantenuto entrambi per rendere chiaro l’invariant desiderato anche se l’integrazione interpretasse diversamente uno dei due meccanismi.

Due popunder riusciti non devono mai verificarsi a meno di quattro minuti di distanza.

Un evento per window non significa un evento per visita

Un valore come maxEventsPerWindow = 1 non significa necessariamente un solo annuncio per tutta la permanenza del visitatore. Il suo ambito è la finestra configurata; terminata quella, può iniziarne un’altra. Inoltre 1 non significa una sola azione utente, ma un evento di monetizzazione riuscito dentro quel periodo.

Quando oggi verifico la logica di frequenza, faccio tre domande: cosa conta il contatore, cosa lo resetta e quanto dura la finestra di reset? Senza queste risposte, un numero grezzo come 1 dice quasi nulla.

Ho separato la policy dall’implementazione specifica del provider

Il comportamento riutilizzabile può essere espresso senza esporre script, identificatori o nomi di parametri specifici:

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

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

È pseudocodice esplicativo, non codice sorgente di produzione. Provider, SDK e architetture di deployment cambiano; la policy è più durevole: proteggere l’inizio della visita, consentire monetizzazione dopo l’avvio di un uso reale, imporre un hard cooldown e ripetere solo dopo.

Build riuscita e comportamento corretto sono cose diverse

Typechecker, linter e production build possono verificare molte proprietà tecniche, ma nessuno dimostra che la timeline pubblicitaria si comporti correttamente nel browser. Questa funzione richiede anche validazione comportamentale.

1. Aprire il browser in uno stato pulito.
2. Interagire prima del termine del ritardo iniziale: nessun popunder.
3. Attendere oltre il ritardo iniziale.
4. Eseguire un’interazione idonea: il primo popunder può avvenire.
5. Continuare a interagire prima della fine del cooldown: nessun secondo popunder.
6. Attendere la fine del cooldown.
7. Interagire di nuovo: ora può avvenire un altro popunder.

Una build riuscita e un test comportamentale riuscito rispondono a domande diverse. Servono entrambi.

L’esperienza pubblicitaria complessiva conta più di ogni singolo placement

Due sistemi pubblicitari indipendenti possono sembrare ragionevoli se valutati separatamente e risultare aggressivi una volta combinati. Due formati con limite di quattro minuti possono alternarsi, per esempio, creando interruzioni circa a 00:45, 02:45, 04:45 e 06:45.

Da qui ho ricavato una regola migliore:

I frequency cap vanno valutati sulla base dell’esperienza utente complessiva, non per singolo script pubblicitario.

L’utente subisce la somma delle interruzioni, non il file di configurazione che le ha generate. Un audit in produzione dovrebbe chiedersi quanti eventi pubblicitari invasivi possa realmente incontrare un singolo utente in un determinato periodo.

Il numero grezzo di impression è il target di ottimizzazione sbagliato

Creare più opportunità riducendo il cooldown è facile. La domanda difficile è quanta monetizzazione aggiuntiva sia possibile ottenere senza ridurre il valore economico complessivo dell’utente.

Una configurazione con meno annunci per visita può comunque produrre più ricavi nel tempo se preserva meglio l’uso ripetuto. Per questo mi interessa più il ricavo per utente nel tempo delle impression per visita. La seconda metrica è facile da massimizzare; la prima è il vero problema di business.

Un esperimento più forte guarderebbe oltre un singolo grafico aggregato

La mia osservazione in produzione era sufficiente per capire che l’esito catastrofico che temevo non si era manifestato in modo evidente. Non bastava a stabilire tutti gli effetti successivi.

Un esperimento più robusto confronterebbe ricavo di monetizzazione per utente unico, ricavo per visita, eventi pubblicitari per utente, engagement attivo, interazioni significative con il prodotto, tasso di ritorno, retention nel tempo e valore utente di più lungo periodo.

Entrambi i lati vanno misurati. Se guardo solo l’output pubblicitario, concluderò quasi inevitabilmente che più pubblicità è meglio. Se guardo solo l’engagement, rischio di ignorare aumenti di ricavo significativi con un costo comportamentale minimo.

Perché ho mantenuto semplice la policy

Non ho visto motivo di aggiungere sempre più eccezioni. La logica finale è rimasta facile da spiegare: attendere 45 secondi, monetizzare alla successiva interazione idonea, imporre un hard cooldown di quattro minuti e poi consentire nuovamente la monetizzazione alla successiva interazione valida.

Pochi invariant forti sono più facili da capire, testare e fare debug rispetto a una policy piena di eccezioni oscure.

L’asimmetria è intenzionale

La policy tratta diversamente utenti nuovi e utenti già coinvolti. Un nuovo visitatore riceve più protezione; chi continua a interagire genera nel tempo più opportunità di monetizzazione.

La pressione pubblicitaria aumenta quindi con l’engagement dimostrato invece di essere massima fin dall’inizio. Questo cambiamento concettuale è stato uno dei risultati più utili dell’esperimento.

Cosa non concluderei da questo caso

Non direi che 45 secondi siano universalmente corretti, che quattro minuti rappresentino l’intervallo ottimale, che popunder più frequenti non danneggino mai l’engagement o che una media stabile significhi utenti non influenzati. Non generalizzerei nemmeno un singolo workload di produzione a ogni prodotto web.

Prodotti diversi hanno utenti, aspettative, fonti di acquisizione, pattern d’uso ed economia diversi. Il risultato è utile proprio perché è specifico, non perché dimostra una regola universale.

La parte che mi ha fatto cambiare idea

Prima del test immaginavo una relazione quasi meccanica tra pressione pubblicitaria ed engagement: aumentare abbastanza la prima avrebbe dovuto far scendere visibilmente il secondo. La produzione si è comportata in modo meno ordinato.

Ho portato la frequenza a un livello che consideravo relativamente alto. Gli utenti hanno continuato a interagire e l’engagement aggregato è rimasto nella sua consueta fascia giornaliera. Questo non significa che il costo fosse zero. Significa che non era abbastanza grande da generare nella metrica osservata il segnale evidente che mi aspettavo.

La differenza tra “nessun effetto” e “nessun effetto evidente in questa misurazione” è importante. I sistemi in produzione raramente ci offrono storie causali pulite come vorremmo.

La mia regola adesso

Non mi chiedo più con quale frequenza posso tecnicamente mostrare un altro popunder. Mi chiedo quanta esperienza senza interruzioni dovrebbe ricevere un nuovo utente prima che inizi la monetizzazione, quanto utilizzo indisturbato dovrebbe ricevere un utente coinvolto prima che un altro evento sia possibile e se la pubblicità aggiuntiva aumenti il valore totale dell’utente o soltanto il contatore delle impression.

Per questa applicazione ho mantenuto:

45 secondi prima della prima idoneità
almeno 4 minuti tra due eventi riusciti

I valori specifici sono solo un’implementazione. La regola che riutilizzerei è più generale:

Proteggere l’inizio del percorso utente, monetizzare maggiormente l’engagement dimostrato rispetto alla curiosità iniziale e giudicare il risultato sul valore per utente invece che sul volume pubblicitario grezzo.