Wróć do bloga
14 sierpnia 2026Sergei Solod10 min czytania

Czego nauczyłem się, testując częstotliwość popunderów względem zaangażowania użytkowników

Zwiększyłem częstotliwość popunderów w działającej aplikacji webowej i porównałem zagregowane zaangażowanie przed zmianą i po niej. Ostatecznie zostawiłem 45 sekund opóźnienia początkowego i co najmniej cztery minuty cooldownu, ale ważniejszym wnioskiem było to, jak ostrożnie należy interpretować pozornie stabilną średnią zaangażowania.

popunderfrequency cappingmonetyzacja webowazaangażowanie użytkownikówanalityka webowa

Spodziewałem się prostego kompromisu: rzadziej pokazywać popundery i chronić doświadczenie użytkownika albo zwiększać częstotliwość, poprawiając przychód do momentu, w którym zaangażowanie zacznie spadać. W produkcji zależność okazała się znacznie mniej uporządkowana.

Po zwiększeniu częstotliwości w jednej z moich aplikacji produkcyjnych oczekiwałem wyraźnego przełomu w danych. Tymczasem zagregowana metryka nadal poruszała się mniej więcej w dotychczasowym zakresie codziennych wahań. Jedne dni były lepsze, inne gorsze, ale nie zobaczyłem jasnego, trwałego spadku zaczynającego się wraz z nową polityką.

Ostatecznie pozostawiłem taką konfigurację:

Opóźnienie początkowe: 45 sekund
Minimalny cooldown po udanym popunderze: 4 minuty

Zachowałem również frequency window, które pozwalało na maksymalnie jedno udane zdarzenie w tym samym czterominutowym okresie:

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

To jedynie ilustracyjny pseudokod, niezależny od konkretnego dostawcy reklam, SDK, aplikacji czy wdrożenia. Ciekawsza od implementacji jest sama polityka.

Tak naprawdę są dwie decyzje dotyczące częstotliwości

Początkowo sprowadzałem problem do jednego pytania: ile minut powinno dzielić dwa popundery? Okazało się, że to niewłaściwa abstrakcja. Są co najmniej dwa osobne parametry: opóźnienie przed pierwszą możliwością reklamową oraz minimalny odstęp przed kolejnymi.

Te momenty nie są równoważne. Nowy użytkownik nie zdążył jeszcze zdecydować, czy produkt jest dla niego wartościowy. Użytkownik zaangażowany już w pewnym stopniu to zrobił. Dlatego pierwsza przerwa zasługuje moim zdaniem na większą ochronę niż następne.

Dlaczego przestałem tak agresywnie monetyzować pierwsze sekundy

Krótsze opóźnienie początkowe sprawia, że więcej użytkowników szybciej kwalifikuje się do reklamy, a więc rośnie liczba potencjalnych zdarzeń. Mechanicznie to prawda. Problem polega na tym, że takie rozumowanie ignoruje moment, w którym dochodzi do monetyzacji.

Jeśli reklama pojawia się niemal natychmiast po wejściu, staje się częścią pierwszej oceny strony. Jeśli użytkownik najpierw dostanie chwilę nieprzerwanego czasu na poznanie i użycie produktu, ten sam mechanizm reklamowy pojawia się w innym kontekście.

Wcześniej używałem krótszego opóźnienia, ale ostatecznie zwiększyłem je do 45 sekund. To nadal relatywnie wcześnie i nie jest ustawieniem konserwatywnym. Chodziło jedynie o oddzielenie początku wizyty od pierwszej możliwości monetyzacji. Zacząłem traktować te 45 sekund jako czas, w którym produkt może pokazać swoją wartość, a nie jako utracony inventory reklamowy.

45 sekund to próg, a nie zaplanowana chwila emisji

Upływ opóźnienia oznacza tylko, że użytkownik staje się eligible. Nie oznacza automatycznego wyświetlenia reklamy dokładnie o 00:45. Faktyczne zdarzenie nadal wymaga odpowiedniej interakcji. Użytkownik może stać się eligible o 00:45, a pierwszy popunder nastąpi dopiero o 01:03 po kolejnym kwalifikującym działaniu.

Tak samo działa cooldown. Cztery minuty oznaczają, że kolejne zdarzenie nie może stać się eligible wcześniej niż cztery minuty po poprzednim udanym zdarzeniu. Nie oznacza to automatycznej reklamy co cztery minuty. Ustawione czasy są więc minimami, a rzeczywiste odstępy mogą być dłuższe.

Odstęp między powtórzeniami był ważniejszy niż opóźnienie początkowe

Kiedy byłem już zadowolony z pierwszego opóźnienia, ważniejszą zmienną stała się częstotliwość powtórzeń. Długi cooldown zmniejsza presję reklamową, ale może sprawić, że wielu zaangażowanych użytkowników nigdy nie dotrze do drugiej możliwości.

Chciałem jednocześnie spełnić dwa warunki: użytkownik, który nadal korzysta z aplikacji, powinien mieć realną szansę wygenerowania kolejnego zdarzenia monetyzacji, a pomiędzy zdarzeniami powinny pozostać znaczące okresy nieprzerwanego użycia produktu.

Zostałem przy czterech minutach. Przy 45-sekundowym opóźnieniu pierwsze teoretyczne punkty eligibility wypadają około 00:45, 04:45, 08:45 i 12:45. Faktyczne zdarzenia mogą nastąpić później, ponieważ wciąż wymagana jest odpowiednia interakcja.

Dlaczego cztery minuty to coś innego niż samo maksymalizowanie impressions

Skrócenie cooldownu prawie zawsze tworzy więcej teoretycznych okazji. Jeśli jedyną metryką są okazje reklamowe na użytkownika, krócej oczywiście znaczy lepiej. Produkt ma jednak wartość reklamową tylko tak długo, jak długo zachowuje wartość dla użytkownika.

dodatkowa monetyzacja
-
szkoda behawioralna
=
wartość netto

Cztery minuty dawały użytkownikowi znaczący blok zwykłego korzystania z produktu, w którym kolejny popunder był niemożliwy. Ta gwarancja była dla mnie ważniejsza niż zdanie „jeden co cztery minuty”.

Po zdarzeniu monetyzacji użytkownik dostaje kilka minut, w których kolejne takie zdarzenie jest niemożliwe.

Spodziewałem się widocznego spadku zaangażowania

Przed wdrożeniem moją główną hipotezą było to, że większa częstotliwość reklam da w analytics wyraźny spadek przed/po. Gdyby tak się stało, miałbym mocny powód do złagodzenia polityki.

Zamiast tego zagregowane engagement nadal wahało się podobnie jak wcześniej. Nie pojawił się nowy, niższy poziom bazowy ani trwały ciąg słabszych wartości po zmianie częstotliwości. Scenariusz porażki, który uważałem za wystarczająco duży, by łatwo go zobaczyć, nie ujawnił się wyraźnie.

Co faktycznie mogę stwierdzić

Nie mogę powiedzieć, że reklamy nie miały żadnego wpływu, że użytkownikom nie przeszkadzały, że retention pozostał dokładnie taki sam ani że ta konfiguracja jest globalnie optymalna. Zagregowana średnia tego nie dowodzi.

Najmocniejsze stwierdzenie poparte moją obserwacją jest węższe:

Po zwiększeniu częstotliwości nie zaobserwowałem wyraźnego, trwałego spadku zagregowanego zaangażowania wykraczającego poza zwykłe wahania widoczne już wcześniej.

To pozostawia miejsce na mniejsze efekty, różnice między grupami użytkowników i zachowania ukryte przez jedną średnią. Testowałem, czy konfiguracja jest wystarczająco akceptowalna, by ją zachować, a nie czy znalazłem uniwersalne optimum.

Stabilna średnia może ukrywać bardzo różne zachowania

Prawie niezmieniona średnia zagregowana może oznaczać różne rzeczy. Niemal wszyscy mogą zachowywać się podobnie; część użytkowników może odchodzić wcześniej, a inni zostawać dłużej; mała grupa może reagować negatywnie, ale być zbyt mała, by przesunąć średnią; albo realny negatywny efekt może być mniejszy niż normalne dzienne wahania.

Dlatego traktuję stabilną średnią jako użyteczny sygnał ostrzegawczy, a nie dowód zerowego wpływu.

Engagement to nie to samo co dosłowna długość wizyty

Nie traktowałem również metryki engagement z analytics jako dokładnej średniej długości sesji. Active engagement zależy od definicji systemu pomiarowego i nie musi odpowiadać czasowi, przez który karta przeglądarki pozostaje otwarta. Użytkownicy zmieniają fokus, wracają później lub poruszają się w sposób, który czyni prosty model „czasu na stronie” mylącym.

Nie wyprowadzałem więc odstępu reklamowego z formuły typu „średni engagement wynosi X, więc następny popunder musi pojawić się przed X”. Używałem wskaźnika kierunkowo: czy produkt po zmianie wyglądał wyraźnie słabiej niż wcześniej? Na obserwowanym przeze mnie poziomie zagregowanym odpowiedź brzmiała: nie.

Cooldown i frequency window są powiązane, ale nie identyczne

Implementacja korzystała zarówno z 240-sekundowego cooldownu, jak i 240-sekundowego window z limitem jednego udanego zdarzenia. Są w dużej mierze redundantne, ale wyrażają nieco inne ograniczenia.

Cooldown mówi: nie pozwalaj na kolejne zdarzenie, dopóki od poprzedniego nie minęło wystarczająco dużo czasu. Window mówi: nie pozwalaj na więcej niż jedno udane zdarzenie w zdefiniowanym okresie. Zostawiłem oba, aby główny invariant był oczywisty nawet wtedy, gdy integracja interpretuje jeden z mechanizmów inaczej.

Dwa udane popundery nigdy nie mogą wystąpić w odstępie krótszym niż cztery minuty.

Jedno zdarzenie na window nie oznacza jednego zdarzenia na wizytę

Wartość maxEventsPerWindow = 1 nie oznacza koniecznie jednej reklamy podczas całego pobytu użytkownika. Jej zakresem jest skonfigurowane window; po jego zakończeniu może rozpocząć się kolejne. 1 nie oznacza też jednej akcji użytkownika, lecz jedno udane zdarzenie monetyzacji w danym okresie.

Dziś, sprawdzając logikę częstotliwości, zadaję trzy pytania: co liczy licznik, co go resetuje i jak długie jest okno resetu? Bez tych odpowiedzi surowa wartość taka jak 1 mówi bardzo niewiele.

Oddzieliłem politykę od implementacji konkretnego dostawcy

Powtarzalne zachowanie można opisać bez ujawniania specyficznych skryptów, identyfikatorów ani nazw parametrów:

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

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

To pseudokod objaśniający, nie kod produkcyjny. Dostawcy, SDK i architektury wdrożenia się zmieniają; polityka jest bardziej trwała: chronić początek wizyty, umożliwiać monetyzację po rozpoczęciu realnego użycia, wymuszać twardy cooldown i powtarzać dopiero później.

Udany build i poprawne zachowanie to różne rzeczy

Typechecker, linter i production build potrafią zweryfikować wiele właściwości technicznych, ale nie dowodzą, że timeline reklam działa poprawnie w przeglądarce. Ta funkcja wymaga również walidacji behawioralnej.

1. Otwórz czysty stan przeglądarki.
2. Wejdź w interakcję przed końcem opóźnienia: popunder nie powinien wystąpić.
3. Poczekaj, aż minie opóźnienie początkowe.
4. Wykonaj kwalifikującą interakcję: pierwszy popunder może wystąpić.
5. Kontynuuj interakcje przed końcem cooldownu: drugiego popundera nie powinno być.
6. Poczekaj na koniec cooldownu.
7. Wejdź ponownie w interakcję: kolejny popunder może już wystąpić.

Udany build i udany test zachowania odpowiadają na różne pytania. Oba są potrzebne.

Łączne doświadczenie reklamowe jest ważniejsze niż pojedynczy placement

Dwa niezależne systemy reklamowe mogą osobno wyglądać rozsądnie, a razem tworzyć agresywne doświadczenie. Dwa formaty z osobnymi czterominutowymi limitami mogą się przeplatać tak, że użytkownik doświadczy przerw około 00:45, 02:45, 04:45 i 06:45.

To doprowadziło mnie do lepszej zasady:

Frequency cap powinien być oceniany na poziomie całego doświadczenia użytkownika, a nie osobno dla każdego skryptu reklamowego.

Użytkownik doświadcza sumy przerw, a nie pliku konfiguracyjnego, który je wygenerował. Audyt produkcyjny powinien więc pytać, ile zakłócających zdarzeń reklamowych jedna osoba może realnie napotkać w danym okresie.

Surowa liczba impressions jest złym celem optymalizacji

Zwiększenie liczby okazji przez skrócenie cooldownu jest proste. Trudniejsze pytanie brzmi: ile dodatkowej monetyzacji można uzyskać bez obniżenia całkowitej wartości ekonomicznej użytkownika.

Konfiguracja z mniejszą liczbą reklam na wizytę może przynieść większy przychód w czasie, jeśli lepiej zachowuje powroty użytkowników. Dlatego bardziej interesuje mnie przychód na użytkownika w czasie niż impressions na wizytę. Drugą metrykę łatwo maksymalizować; pierwsza jest prawdziwym problemem biznesowym.

Mocniejszy test wykraczałby poza jeden zagregowany wykres

Moja obserwacja produkcyjna wystarczyła, by stwierdzić, że katastrofalny rezultat, którego się obawiałem, nie pojawił się w sposób oczywisty. Nie wystarczyła do określenia wszystkich dalszych efektów.

Lepszy eksperyment porównywałby przychód z monetyzacji na unikalnego użytkownika, przychód na wizytę, zdarzenia reklamowe na użytkownika, active engagement, znaczące interakcje w produkcie, returning-user rate, retention w czasie oraz długoterminową wartość użytkownika.

Trzeba mierzyć obie strony. Jeśli patrzę tylko na output reklamowy, niemal automatycznie uznam, że więcej reklam jest lepsze. Jeśli patrzę tylko na engagement, mogę przeoczyć istotny wzrost przychodu, który ma niemal zerowy koszt behawioralny.

Dlaczego zachowałem prostą politykę

Nie widziałem powodu, by dodawać coraz więcej wyjątków. Ostateczna logika pozostała łatwa do wyjaśnienia: odczekać 45 sekund, pozwolić na monetyzację przy następnej kwalifikującej interakcji, wymusić czterominutowy hard cooldown, a potem ponownie pozwolić na monetyzację przy kolejnej interakcji.

Niewielka liczba mocnych invariantów jest łatwiejsza do zrozumienia, testowania i debugowania niż polityka zależna od wielu niejasnych wyjątków.

Asymetria jest celowa

Nowi i zaangażowani użytkownicy są traktowani inaczej. Nowy odwiedzający otrzymuje większą ochronę, a osoba, która nadal korzysta z produktu, z czasem tworzy więcej możliwości monetyzacji.

Presja reklamowa rośnie więc wraz z wykazanym zaangażowaniem, zamiast od początku działać z maksymalną intensywnością. Ta zmiana sposobu myślenia była jednym z najważniejszych rezultatów eksperymentu.

Czego nie wyciągałbym z tego studium przypadku

Nie twierdziłbym, że 45 sekund to wszędzie poprawna wartość, cztery minuty są optymalne, częstsze popundery nigdy nie szkodzą engagement ani że stabilna średnia oznacza brak wpływu na użytkowników. Nie przenosiłbym również jednego workloadu produkcyjnego na wszystkie produkty webowe.

Różne produkty mają różnych użytkowników, oczekiwania, źródła pozyskania, wzorce użycia i ekonomię. Wynik jest wartościowy dlatego, że jest konkretny, a nie dlatego, że dowodzi uniwersalnej reguły.

Co zmieniło moje zdanie

Przed eksperymentem oczekiwałem niemal mechanicznej zależności między presją reklamową a engagement: zwiększ jedno wystarczająco mocno, a drugie wyraźnie spadnie. Zachowanie w produkcji było mniej uporządkowane.

Zwiększyłem częstotliwość do poziomu, który uważałem za relatywnie wysoki. Użytkownicy nadal korzystali z produktu, a zagregowane engagement pozostawało w swoim typowym codziennym zakresie. Nie oznacza to, że koszt wynosił zero. Oznacza tylko, że nie był wystarczająco duży, by w obserwowanej metryce stworzyć oczywisty sygnał, którego się spodziewałem.

Różnica między „brakiem efektu” a „brakiem oczywistego efektu w tym pomiarze” jest ważna. Systemy produkcyjne rzadko dostarczają tak czystych historii przyczynowych, jakich byśmy chcieli.

Moja zasada teraz

Nie pytam już, jak często technicznie mogę wyświetlić kolejny popunder. Pytam, ile nieprzerwanego doświadczenia produktowego powinien dostać nowy użytkownik przed rozpoczęciem monetyzacji, ile nieprzerwanego użycia powinien dostać użytkownik zaangażowany przed kolejnym zdarzeniem oraz czy dodatkowa reklama zwiększa całkowitą wartość użytkownika, czy tylko licznik impressions.

Dla tej aplikacji pozostawiłem:

45 sekund przed pierwszą eligibility
co najmniej 4 minuty między udanymi zdarzeniami

Konkretne wartości są tylko jedną implementacją. Zasada, którą zastosowałbym ponownie, jest szersza:

Chronić początek ścieżki użytkownika, mocniej monetyzować wykazane zaangażowanie niż początkową ciekawość i oceniać wynik przez pryzmat wartości użytkownika, a nie surowej liczby reklam.