Я ожидал, что у частоты popunder будет довольно очевидный компромисс: показывать рекламу реже и беречь пользовательский опыт либо увеличивать частоту и доход до момента, когда вовлечённость начнёт падать. На продакшене зависимость оказалась гораздо менее аккуратной.
После увеличения частоты в одном из моих работающих веб-приложений я ждал заметного перелома в данных. Вместо этого агрегированный показатель продолжил двигаться примерно в том же диапазоне обычных дневных колебаний. Были дни лучше и хуже, но устойчивого снижения, которое явно началось бы вместе с новой политикой, я не увидел.
В итоге я оставил такую конфигурацию:
Начальная задержка: 45 секунд
Минимальный cooldown после успешного popunder: 4 минуты
Также я сохранил частотное окно, допускающее не больше одного успешного события за те же четыре минуты:
const policy = {
initialDelaySeconds: 45,
cooldownSeconds: 240,
windowSeconds: 240,
maxEventsPerWindow: 1,
};
Это демонстрационный псевдокод, намеренно не привязанный к конкретной рекламной сети, SDK, приложению или схеме деплоя. Интереснее не реализация, а политика, которую она выражает.
На самом деле решений о частоте два
Сначала я формулировал задачу как один вопрос: сколько минут должно проходить между popunder? Оказалось, это неудачная абстракция. Есть как минимум два отдельных решения: задержка до первой рекламной возможности и минимальный интервал перед последующими.
Эти моменты неравноценны. Новый посетитель ещё не решил, полезен ли ему продукт. Вовлечённый пользователь уже в значительной степени решил. Поэтому первую рекламную прерывающую механику я стал защищать сильнее, чем последующие.
Почему я перестал так агрессивно монетизировать первые секунды
Короткая начальная задержка делает больше посетителей eligible раньше и тем самым увеличивает число потенциальных рекламных событий. Механически это верно. Но такая логика игнорирует момент, в который происходит монетизация.
Если реклама возникает почти сразу после входа, она становится частью первой оценки сайта. Если пользователь сначала получает непрерывное время, чтобы понять продукт и начать им пользоваться, тот же рекламный механизм воспринимается уже в другом контексте.
Раньше задержка у меня была короче, затем я увеличил её до 45 секунд. Это всё ещё сравнительно рано и не задумывалось как консервативная настройка. Мне было важно просто отделить начало визита от первой возможности монетизации. Эти 45 секунд я стал воспринимать как время, за которое продукт успевает показать ценность, а не как потерянный рекламный инвентарь.
45 секунд — это порог, а не запланированный момент показа
После окончания задержки пользователь лишь становится eligible. Это не означает, что ровно в 00:45 автоматически появится реклама. Реальное событие всё ещё зависит от подходящего действия пользователя. Он может стать eligible в 00:45, а первый popunder произойдёт в 01:03 после следующего квалифицирующего взаимодействия.
То же самое относится к cooldown. Четыре минуты означают, что следующее событие не может стать доступным раньше чем через четыре минуты после предыдущего успешного. Это не означает автоматический показ каждые четыре минуты. Настроенные интервалы — минимальные; фактический промежуток может быть длиннее.
Повторный интервал оказался важнее начальной задержки
Когда с первым интервалом всё стало понятно, главным параметром стала частота повторов. Длинный cooldown снижает рекламное давление, но при этом многие вовлечённые пользователи могут вообще не дойти до второй возможности.
Я хотел одновременно выполнить два условия: пользователь, который продолжает пользоваться приложением, должен иметь реальный шанс сгенерировать ещё одно событие монетизации, а между событиями должны оставаться заметные периоды непрерывного использования продукта.
Я оставил четыре минуты. При начальной задержке 45 секунд самые ранние теоретические точки eligibility — примерно 00:45, 04:45, 08:45 и 12:45. Реальные события могут происходить позже, потому что всё равно требуется подходящее действие.
Почему четыре минуты — не то же самое, что просто максимизировать показы
Сокращение cooldown почти всегда создаёт больше теоретических возможностей. Если единственная метрика — рекламные возможности на пользователя, более короткий интервал очевидно выгоднее. Но рекламная ценность продукта существует только пока сохраняется его ценность для пользователя.
дополнительная монетизация
-
поведенческий ущерб
=
чистая ценность
Четыре минуты давали пользователю заметный отрезок обычного использования продукта, в течение которого новый popunder был невозможен. Для меня эта гарантия важнее формулировки «один раз в четыре минуты».
После события монетизации у пользователя есть несколько минут, в течение которых следующее такое событие невозможно.
Я ожидал заметного падения вовлечённости
До выката моя главная гипотеза была такой: более высокая рекламная частота даст в аналитике отчётливое падение «до/после». Если бы это случилось, у меня был бы сильный повод ослабить политику.
Вместо этого агрегированная вовлечённость продолжила колебаться примерно так же, как раньше. Я не увидел нового более низкого базового уровня или серии стабильно более слабых значений после изменения частоты. Сценарий, который я ожидал увидеть как достаточно крупный, просто не проявился явно.
Что я действительно могу утверждать
Я не могу сказать, что реклама вообще не повлияла на пользователей, что она их не раздражала, что retention остался абсолютно тем же или что конфигурация глобально оптимальна. Один агрегированный показатель ничего из этого не доказывает.
Самое сильное утверждение, которое поддерживают мои наблюдения, звучит уже:
После увеличения частоты я не увидел явного устойчивого снижения агрегированной вовлечённости, выходящего за пределы обычных колебаний, которые наблюдались и раньше.
Такая формулировка оставляет место для небольших эффектов, различий между группами пользователей и поведения, скрытого одним средним. Я проверял, остаётся ли конфигурация достаточно приемлемой, чтобы её сохранить, а не нашёл ли я универсальный optimum.
Стабильное среднее может скрывать очень разное поведение
Почти неизменный агрегированный показатель может соответствовать разным сценариям. Почти все могут вести себя так же, как раньше; часть пользователей может уходить раньше, а другая — оставаться дольше; небольшая группа может реагировать негативно, но быть слишком маленькой, чтобы сдвинуть среднее; либо реальный отрицательный эффект может быть меньше обычной дневной вариативности.
Поэтому стабильное среднее для меня — полезный предупреждающий сигнал, но не доказательство нулевого эффекта.
Вовлечённость — не буквальная длительность визита
Я также не стал воспринимать engagement-метрику аналитики как точную среднюю длину сессии. Active engagement определяется правилами конкретной системы аналитики и не обязательно равен времени, пока вкладка открыта. Пользователи переключают фокус, возвращаются позже и перемещаются по продукту так, что простая модель «время на сайте» может вводить в заблуждение.
Поэтому я не выводил рекламный интервал из формулы вроде «средний engagement равен X, значит следующий popunder должен случиться раньше X». Метрика использовалась направленно: стал ли продукт после изменения заметно слабее? На агрегированном уровне, за которым я следил, ответ был отрицательным.
Cooldown и частотное окно связаны, но не идентичны
В реализации использовались и cooldown 240 секунд, и окно 240 секунд с максимум одним успешным событием. В значительной степени они дублируют друг друга, но выражают немного разные ограничения.
Cooldown говорит: не разрешать следующее событие, пока с предыдущего не прошло достаточно времени. Окно говорит: не разрешать больше одного успешного события в заданном периоде. Я оставил оба ограничения, чтобы целевой invariant был очевиден даже при различиях в трактовке одного из механизмов интеграцией.
Два успешных popunder никогда не должны происходить с интервалом меньше четырёх минут.
Одно событие на окно не означает одно событие на визит
Значение вроде maxEventsPerWindow = 1 не обязательно означает одну рекламу за весь визит. Его область действия — настроенное окно; когда оно заканчивается, может начаться следующее. И 1 не означает одно действие пользователя — это одно успешное событие монетизации внутри данного периода.
Теперь при проверке логики частотности я задаю три вопроса: что именно считает счётчик, что его сбрасывает и сколько длится окно сброса? Без этих ответов сырое значение вроде 1 почти ничего не говорит.
Я отделил политику от реализации конкретного провайдера
Переиспользуемое поведение можно описать без vendor-specific скриптов, идентификаторов и имён параметров:
function isEligible(state, now) {
if (!state.hasShownFirstEvent) {
return now - state.arrivalTime >= 45_000;
}
return now - state.lastEventTime >= 240_000;
}
Это поясняющий псевдокод, а не production source. Провайдеры, SDK и архитектура деплоя меняются; политика долговечнее: защитить начало визита, разрешить монетизацию после начала реального использования, жёстко выдерживать cooldown и только потом разрешать повтор.
Успешный build и корректное поведение — разные вещи
Typechecker, linter и production build могут проверить много технических свойств, но не доказывают, что рекламный таймлайн правильно работает в браузере. Для этой функции нужна и поведенческая проверка.
1. Открыть чистое состояние браузера.
2. Взаимодействовать до конца начальной задержки: popunder быть не должно.
3. Дождаться окончания начальной задержки.
4. Выполнить подходящее действие: первый popunder может произойти.
5. Продолжать взаимодействовать до конца cooldown: второго popunder быть не должно.
6. Дождаться окончания cooldown.
7. Снова взаимодействовать: теперь следующий popunder возможен.
Успешный build и успешный behavioral test отвечают на разные вопросы. Нужны оба.
Совокупный рекламный опыт важнее каждой отдельной позиции
Две независимые рекламные системы могут выглядеть разумно по отдельности и агрессивно в сочетании. Например, два формата с собственным четырёхминутным лимитом способны чередоваться так, что пользователь получит прерывания примерно в 00:45, 02:45, 04:45 и 06:45.
Отсюда я вывел более полезное правило:
Frequency cap нужно оценивать на уровне общего пользовательского опыта, а не каждого рекламного скрипта отдельно.
Пользователь воспринимает сумму всех прерываний, а не конфигурацию, которая породила каждое из них. Поэтому production-аудит должен отвечать на вопрос, сколько прерывающих рекламных событий реально может встретить один пользователь за заданный период.
Сырая численность показов — неправильная цель оптимизации
Создать больше рекламных возможностей сокращением cooldown просто. Сложный вопрос — сколько дополнительной монетизации можно получить, не снижая общую экономическую ценность пользователя.
Конфигурация с меньшим числом рекламных событий за визит может принести больше выручки на длинном горизонте, если лучше сохраняет повторное использование. Поэтому для меня важнее revenue per user over time, чем impressions per visit. Вторую метрику легко максимизировать; первая и есть настоящая бизнес-задача.
Более сильный тест должен смотреть дальше одного агрегированного графика
Моего наблюдения на продакшене хватило, чтобы понять: катастрофический сценарий, которого я опасался, явно не произошёл. Но этого недостаточно, чтобы определить все последующие эффекты.
Более сильный эксперимент сравнивал бы revenue монетизации на уникального пользователя, revenue на визит, рекламные события на пользователя, active engagement, значимые действия внутри продукта, долю возвращающихся пользователей, retention во времени и долгосрочную user value.
Измерять нужно обе стороны. Если смотреть только на рекламный output, почти неизбежно получится вывод «больше рекламы — лучше». Если смотреть только на engagement, можно пропустить существенную прибавку revenue с почти нулевой поведенческой ценой.
Почему я оставил политику простой
Я не увидел причин добавлять всё больше исключений. Итоговая логика осталась простой: ждать 45 секунд, разрешить монетизацию при следующем подходящем взаимодействии, применить жёсткий четырёхминутный cooldown и после него снова разрешить монетизацию на следующем подходящем действии.
Небольшое число сильных invariant проще понимать, тестировать и отлаживать, чем политику с множеством неочевидных исключений.
Асимметрия здесь намеренная
Новые и вовлечённые пользователи обрабатываются по-разному. Новый посетитель получает больше защиты; пользователь, который продолжает взаимодействовать, со временем создаёт больше возможностей для монетизации.
То есть рекламное давление растёт вместе с уже доказанной вовлечённостью, а не применяется сразу на максимальном уровне. Это изменение в модели мышления стало одним из самых полезных результатов эксперимента.
Каких выводов я бы не делал
Я не стал бы утверждать, что 45 секунд подходят всем, четыре минуты — оптимальный интервал, более частые popunder никогда не вредят engagement или стабильное среднее означает отсутствие влияния на пользователей. И я не стал бы переносить один production workload на все веб-продукты.
У разных продуктов разные пользователи, ожидания, источники привлечения, паттерны использования и экономика. Результат полезен именно потому, что он конкретный, а не потому, что доказывает универсальное правило.
Что изменило моё мнение
До эксперимента я ожидал почти механической связи между рекламным давлением и вовлечённостью: достаточно сильно повысить одно — и второе заметно упадёт. На продакшене поведение оказалось менее аккуратным.
Я увеличил частоту до уровня, который считал сравнительно высоким. Пользователи продолжили взаимодействовать, а агрегированная вовлечённость осталась в привычном дневном диапазоне. Это не означает, что цена была нулевой. Это означает лишь, что она не оказалась достаточно большой, чтобы дать в наблюдаемой метрике тот очевидный сигнал, которого я ожидал.
Разница между «эффекта нет» и «в этом измерении нет очевидного эффекта» принципиальна. Продакшен-системы редко дают нам такие чистые причинно-следственные истории, какие хотелось бы получить.
Моё правило теперь
Теперь я не спрашиваю, как часто технически могу показать следующий popunder. Я спрашиваю, сколько непрерывного опыта новый пользователь должен получить до начала монетизации, сколько непрерывного использования должен получить вовлечённый пользователь до следующего события и увеличивает ли дополнительная реклама общую ценность пользователя или только счётчик impressions.
Для этой системы я оставил:
45 секунд до первой eligibility
минимум 4 минуты между успешными событиями
Конкретные числа — лишь один вариант реализации. Переиспользовать я бы стал более общую идею:
Защищать начало пользовательского пути, сильнее монетизировать уже доказанную вовлечённость, чем первоначальное любопытство, и оценивать результат по ценности пользователя, а не по сырому объёму рекламы.