📌 Аннотация
Этот скрипт показывает пользователю липкую плашку с таймером обратного отсчёта.
Пока таймер идёт — пользователь “ожидает” персональную скидку. После завершения появляется промокод.
Что это даёт:
- увеличивает время на сайте (ПФ)
- снижает процент отказов
- повышает вероятность покупки
- создаёт эффект “персонального предложения”
Дополнительно:
- таймер персональный для каждого пользователя
- не сбрасывается при обновлении страницы
- останавливается, если вкладка неактивна
- есть умное распределение времени (разные пользователи ждут разное время)
- встроена кнопка копирования промокода
⚙️ Как вставить на сайт Tilda
Способ 1 (рекомендуемый)
- Открой страницу в Tilda
- Добавь блок T123 (HTML-код)
- Вставь в него весь код скрипта целиком
- Сохрани и опубликуй страницу
Способ 2 (глобально на все страницы)
- Перейди в:
- Настройки сайта → Дополнительно → HTML-код
- Вставь код перед </body>
- Сохрани и опубликуй сайт
🌍 Использование на других сайтах
Скрипт работает на:
- обычных HTML-сайтах
- WordPress
- Bitrix
- любых CMS
Как подключить:
Просто вставь код перед закрывающим тегом:
</body>
🔧 Основные переменные (настройка)
Все настройки находятся в начале скрипта.
🎯 Базовые параметры
var promoId = "sweetgift_pf_timer_04";
ID акции.
Если изменить — у всех пользователей начнётся новый таймер.
var countdownSeconds = 180;
Базовое время ожидания (в секундах).
var promoCode = "SALE10";
Промокод, который покажется после таймера.
🧠 Умное распределение времени
Позволяет разным пользователям показывать разное время ожидания.
var fastUsersPercent = 70;
Сколько % пользователей попадёт в “быструю” группу.
var fastRangeMinus = 30;var fastRangePlus = 5;
Быстрая группа:
countdownSeconds - fastRangeMinus
countdownSeconds + fastRangePlus
Пример:
180 → 150–185 секундvar slowRangeMinus = 0;var slowRangePlus = 30;
Медленная группа:
180 → 180–210 секунд
📊 Как это работает
Если:
fastUsersPercent = 70;
То:
- 70% пользователей → быстрый таймер
- 30% пользователей → длинный таймер
📝 Тексты (можно менять)
var titleBefore = "Подождите немного — для вас откроется персональная скидка";
Заголовок до окончания таймера
var subtitleBefore = "⏱ Таймер идет только при активной вкладке 👀 Можно листать страницу 📱";
Подзаголовок (важен для удержания)
var titleAfter = "Готово! Ваш промокод:";var subtitleAfter = "Скопируйте и используйте при оформлении заказа.";
Тексты после окончания
var pausedText = "⏸ Таймер на паузе";
Показывается, если вкладка неактивна
⚙️ Поведение
var keepPromoShown = true;
- true → после завершения пользователь всегда видит промокод
- false → можно менять логику
📱 Как работает логика
- таймер запускается при первом заходе
- сохраняется в localStorage
- при обновлении страницы продолжается
- если вкладка неактивна → таймер останавливается
- после окончания:
- показывается промокод
- появляется кнопка “Скопировать”
🎯 Что можно менять под задачи
Быстрее выдавать скидку:
countdownSeconds = 120;
Жёстче удержание:
countdownSeconds = 240;
Почти всем быстро:
fastUsersPercent = 85;
Более агрессивный маркетинг:
var titleBefore = "Для вас зафиксирована персональная скидка";
❗ Важные моменты
- таймер привязан к браузеру пользователя
- при очистке кэша — начнётся заново
- в другом устройстве — новый таймер
- не гарантирует чтение, но увеличивает время на странице
🚀 Рекомендации по использованию
Лучше всего работает:
- на карточках товаров
- на лендингах
- на странице оформления заказа
- на дорогих товарах (где нужно “дожать”)
🔥 Как усилить эффект
Можно дополнительно:
- запускать таймер через 5–10 секунд после входа
- показывать после прокрутки
- менять текст на “почти готово” в конце
- добавлять анимацию появления
📈 Итог
Этот скрипт:
- увеличивает время на сайте
- улучшает поведенческие факторы
- повышает конверсию в заказ
И при этом:
- легко внедряется
- гибко настраивается
- работает без серверной части
Код js-скрипта
<div id="sg-promo-bar" style="display:none;">
<div class="sg-promo-inner">
<div class="sg-promo-top">
<div class="sg-promo-text-wrap">
<div class="sg-promo-title" id="sgPromoTitle"></div>
<div class="sg-promo-subtitle" id="sgPromoSubtitle"></div>
</div>
<div class="sg-promo-right" id="sgPromoRight"></div>
</div>
<div class="sg-promo-progress" id="sgPromoProgressWrap">
<div class="sg-promo-progress-line" id="sgPromoProgressLine"></div>
</div>
</div>
</div>
<style>
#sg-promo-bar {
position: sticky;
top: 0;
z-index: 99999;
width: 100%;
box-sizing: border-box;
padding: 10px 14px;
font-family: Arial, sans-serif;
}
.sg-promo-inner {
max-width: 1200px;
margin: 0 auto;
border-radius: 14px;
padding: 14px 16px 12px;
box-shadow: 0 8px 24px rgba(0,0,0,0.12);
}
.sg-promo-top {
display: flex;
align-items: center;
justify-content: space-between;
gap: 14px;
}
.sg-promo-text-wrap { flex: 1; }
.sg-promo-title { font-size: 16px; font-weight: 700; }
.sg-promo-subtitle { font-size: 13px; margin-top: 4px; }
.sg-promo-right {
display: flex;
gap: 10px;
flex-wrap: wrap;
}
.sg-promo-timer,
.sg-promo-code {
padding: 8px 12px;
border-radius: 10px;
font-weight: 700;
}
.sg-promo-copy-btn {
border: 0;
cursor: pointer;
padding: 8px 12px;
border-radius: 10px;
}
.sg-promo-progress {
height: 6px;
margin-top: 12px;
border-radius: 999px;
overflow: hidden;
}
.sg-promo-progress-line {
height: 100%;
width: 0%;
transition: width 1s linear;
}
</style>
<script>
document.addEventListener("DOMContentLoaded", function () {
/* ================= НАСТРОЙКИ ================= */
var promoId = "sweetgift_pf_timer_03"; // ID акции (меняешь → у всех новый таймер)
var countdownSeconds = 180; // базовое время таймера (в секундах)
// ===== УМНОЕ РАСПРЕДЕЛЕНИЕ =====
var fastUsersPercent = 70; // % пользователей с коротким таймером
var fastRangeMinus = 30; // быстрая группа: минус от базового (180 - 30 = 150)
var fastRangePlus = 5; // быстрая группа: плюс к базовому (180 + 5 = 185)
var slowRangeMinus = 0; // медленная группа: минус (обычно 0)
var slowRangePlus = 30; // медленная группа: плюс (180 + 30 = 210)
// ИТОГ:
// fast → 150–185 сек
// slow → 180–210 сек
var promoCode = "SALE10"; // промокод
var titleBefore = "Подождите немного — для вас откроется персональная скидка";
var subtitleBefore = "⏱ Таймер идет только при активной вкладке 👀 Можно листать страницу 📱";
var titleAfter = "Готово! Ваш промокод:";
var subtitleAfter = "Скопируйте и используйте при оформлении заказа.";
var pausedText = "⏸ Таймер на паузе";
var keepPromoShown = true; // после завершения показывать промокод всегда
/* ============================================= */
var bar = document.getElementById("sg-promo-bar");
var titleEl = document.getElementById("sgPromoTitle");
var subtitleEl = document.getElementById("sgPromoSubtitle");
var rightEl = document.getElementById("sgPromoRight");
var progressLine = document.getElementById("sgPromoProgressLine");
if (!bar) return;
var elapsedKey = "elapsed_" + promoId; // сколько уже прошло
var durationKey = "duration_" + promoId; // сколько всего нужно ждать
var doneKey = "done_" + promoId; // завершен ли таймер
var copiedKey = "copied_" + promoId; // нажимал ли копировать
var elapsed = parseInt(localStorage.getItem(elapsedKey), 10) || 0;
var duration = parseInt(localStorage.getItem(durationKey), 10);
// ===== если длительность еще не задана → рассчитываем =====
if (!duration) {
var isFast = Math.random() * 100 < fastUsersPercent;
var min = isFast
? countdownSeconds - fastRangeMinus
: countdownSeconds - slowRangeMinus;
var max = isFast
? countdownSeconds + fastRangePlus
: countdownSeconds + slowRangePlus;
duration = Math.floor(Math.random() * (max - min + 1)) + min;
localStorage.setItem(durationKey, duration);
}
function formatTime(sec) {
var m = Math.floor(sec / 60);
var s = sec % 60;
return (m < 10 ? "0"+m : m) + ":" + (s < 10 ? "0"+s : s);
}
function render() {
if (localStorage.getItem(doneKey)) {
titleEl.innerText = titleAfter;
subtitleEl.innerText = subtitleAfter;
rightEl.innerHTML =
'<span class="sg-promo-code">'+promoCode+'</span>' +
'<button class="sg-promo-copy-btn" id="copyBtn">Скопировать</button>';
document.getElementById("copyBtn").onclick = function () {
navigator.clipboard.writeText(promoCode);
this.innerText = "Скопировано";
localStorage.setItem(copiedKey, "1");
};
progressLine.style.width = "100%";
return;
}
var left = duration - elapsed;
titleEl.innerText = titleBefore;
subtitleEl.innerText = document.hidden ? pausedText : subtitleBefore;
rightEl.innerHTML =
'<span class="sg-promo-timer">'+formatTime(left)+'</span>';
progressLine.style.width = (elapsed / duration * 100) + "%";
}
function tick() {
if (!document.hidden) {
elapsed++;
localStorage.setItem(elapsedKey, elapsed);
}
if (elapsed >= duration) {
localStorage.setItem(doneKey, "1");
}
render();
}
setInterval(tick, 1000);
render();
});
/script