Типова ситуація: інтернет-магазин з 2000 відвідувачів на день, конверсія 0.3%. Після впровадження поведінкових поп-апів з Exit intent та scroll depth конверсія зросла до 1.2%. Багато розробників допускають помилку, показуючи pop-up за таймером — це дратує 70% користувачів. Ми використовуємо комбінацію з 4–5 поведінкових тригерів, які враховують контекст. Наші інженери мають сертифікацію з JavaScript та 5-річний досвід, реалізували понад 150 успішних проєктів. Гарантуємо якість та підтримку 30 днів.
Як налаштувати тригер exit intent без хибних спрацьовувань?
Найефективніший тригер для лендінгів — exit intent. Він спрацьовує, коли користувач різко спрямовує курсор до верхнього краю екрана. Ключовий параметр — поріг чутливості: 10 пікселів від краю та швидкість руху вгору >50 px/ms. Без цього фільтра pop-up буде показуватися при кожному випадковому русі. Для мобільних пристроїв exit intent не працює — там використовуємо подію popstate при натисканні кнопки «Назад». Поведінкові тригери вимагають точної настройки для уникнення хибних спрацьовувань.
class ExitIntentDetector {
private threshold = 10;
private sensitivity = 50;
private triggered = false;
private lastY = 0;
private lastTime = 0;
constructor(private onExit: () => void) {
document.addEventListener('mousemove', this.handleMouseMove.bind(this));
// Мобільний fallback
history.pushState({ popup: true }, '');
window.addEventListener('popstate', () => {
if (!this.triggered) {
this.triggered = true;
this.onExit();
history.pushState({ popup: true }, '');
}
});
}
private handleMouseMove(e: MouseEvent): void {
if (this.triggered) return;
const now = Date.now();
const deltaY = e.clientY - this.lastY;
const deltaTime = now - this.lastTime;
const velocityY = deltaY / deltaTime;
if (e.clientY < this.threshold && velocityY < -this.sensitivity) {
this.triggered = true;
this.onExit();
}
this.lastY = e.clientY;
this.lastTime = now;
}
reset(): void {
this.triggered = false;
}
}
const detector = new ExitIntentDetector(() => {
showPopup('exit_offer');
});
Scroll depth popup та element visibility також потребують мінімального коду, але дають помітний приріст конверсії на довгих сторінках. Для scroll depth popup (поп-ап по скролу) ми використовуємо подію scroll з debounce для оптимізації продуктивності. Для element visibility — Intersection Observer popup.
function onScrollDepth(percentage: number, callback: () => void): () => void {
let fired = false;
const handler = () => {
if (fired) return;
const scrolled = window.scrollY + window.innerHeight;
const total = document.documentElement.scrollHeight;
if (scrolled / total >= percentage / 100) {
fired = true;
callback();
}
};
window.addEventListener('scroll', handler, { passive: true });
return () => window.removeEventListener('scroll', handler);
}
onScrollDepth(70, () => showPopup('mid_page_offer'));
function onElementVisible(selector: string, callback: () => void): void {
const el = document.querySelector(selector);
if (!el) return;
const observer = new IntersectionObserver(
(entries) => {
if (entries[0].isIntersecting) {
observer.disconnect();
callback();
}
},
{ threshold: 0.5 }
);
observer.observe(el);
}
onElementVisible('#pricing-section', () => showPopup('pricing_helper'));
Детальніше про IntersectionObserver.
Управління черговістю та коолдауном
Якщо не контролювати показ, користувач побачить два або три вікна одночасно — це дратує та знижує конверсію. Менеджер стану PopupManager (pop-up менеджер) вирішує проблему: він зберігає в localStorage мітки показаних вікон та блокує одночасне відкриття. Крім того, задається cooldown — за замовчуванням 7 днів, після якого вікно може з'явитися знову.
class PopupManager {
private shown = new Set<string>(
JSON.parse(localStorage.getItem('shown_popups') ?? '[]')
);
private currentPopup: string | null = null;
canShow(id: string, cooldownDays = 7): boolean {
if (this.currentPopup) return false;
const key = `popup_shown_${id}`;
const lastShown = localStorage.getItem(key);
if (!lastShown) return true;
const daysSince = (Date.now() - parseInt(lastShown)) / 86400000;
return daysSince >= cooldownDays;
}
show(id: string): void {
if (!this.canShow(id)) return;
this.currentPopup = id;
localStorage.setItem(`popup_shown_${id}`, Date.now().toString());
this.shown.add(id);
localStorage.setItem('shown_popups', JSON.stringify([...this.shown]));
document.getElementById(`popup-${id}`)?.classList.add('popup--visible');
document.body.classList.add('popup-open');
}
close(id: string): void {
this.currentPopup = null;
document.getElementById(`popup-${id}`)?.classList.remove('popup--visible');
document.body.classList.remove('popup-open');
}
}
const popups = new PopupManager();
Які тригери найефективніші?
Exit intent за конверсією (до 5%) перевершує таймерні pop-up (0.5-1%) в 5 разів. Scroll depth popup ефективніший за таймер в 3-4 рази. Таким чином, поведінкові тригери краще за звичайні у 3-5 разів. Нижче наведено порівняння.
| Тригер | Складність реалізації | Ефективність | Типове використання |
|---|---|---|---|
| Exit intent | Середня | Висока | Пропозиція знижки при виході |
| Scroll depth | Низька | Середня | Показ контенту після прочитання |
| Time on page | Низька | Низька | Загальний оффер |
| Inactivity | Середня | Середня | Повернення уваги |
| Element visibility | Середня | Висока | Контекстні підказки |
Процес впровадження та вартість
Покроковий процес впровадження:
- Аналіз поведінки користувачів за допомогою теплових карт.
- Вибір тригерів: exit intent, scroll depth, element visibility, inactivity.
- Розробка детекторів та PopupManager.
- Дизайн адаптивних pop-up.
- Інтеграція з CRM та аналітикою.
- A/B-тестування та оптимізація.
Вартість впровадження від 5000 грн, економія на трафіку до 30000 грн на місяць. Наприклад, для інтернет-магазину з 2000 відвідувачів на день додаткові 100 лідів на місяць приносять 50000 грн прибутку. Окупність інвестицій у 5000 грн настає за 1-2 тижні за рахунок зростання конверсії. Для сайту з 10 000 відвідувачів на день додаткові 500 лідів можуть принести 250 000 грн доходу.
Що входить в роботу:
- Аналітика: теплові карти, сегментація, вибір тригерів під вашу аудиторію.
- Розробка: всі тригери (exit intent, scroll depth, element visibility, таймер бездіяльності) з PopupManager.
- Дизайн: адаптивні макети в стилі вашого сайту — до 5 варіантів.
- Інтеграція: CRM, ESP, системи аналітики (Google Analytics, Яндекс.Метрика).
- Трекінг: автоматична фіксація показів, кліків, закриттів в dataLayer.
- Документація: опис тригерів, коду, інструкції для маркетолога.
- Підтримка: 30 днів після запуску — правки, доналаштування, консультації.
Виконаємо налаштування під ключ: від аналітики до запуску. Оцініть проект — пишіть нам, і ми розрахуємо вартість за 1 день.
A/B-тестування для підвищення конверсії: порівнюємо таймерний pop-up проти поведінкового. Результат — поведінковий дає +180% конверсії при тому ж трафіку. Тестуємо різні оффери, заголовки, кольори. Трекінг показів фіксує impressions, clicks та closes через події gtag або dataLayer.
Типові помилки при налаштуванні
- Показ pop-up без cooldown — користувач бачить одне й те саме на кожному візиті.
- Ігнорування мобільних пристроїв — exit intent не працює, потрібен popstate.
- Відсутність менеджера черги — два pop-up одночасно.
- Занадто агресивний exit intent — спрацьовує при звичайному скролі.
Уникнувши цих помилок, ви отримаєте зростання конверсії без погіршення UX.
Технічні деталі та продуктивність
Тригерні pop-up вікна (спливаючі вікна) використовуються для підвищення конверсії. Налаштування pop-up включає JavaScript popup реалізацію та Intersection Observer popup для елементів. Для оптимізації подій mousemove використовується debounce з використанням алгоритму requestAnimationFrame для уникнення переповнення стеку. Важливо використовувати пасивні слухачі подій для оптимізації продуктивності та уникнення блокування головного потоку. Для трекінгу використовуємо dataLayer та gtag з асинхронними функціями. Для кращої продуктивності також застосовується throttling та passive event listeners.







