Digital маркетинг

Скрипт таймера с персональной скидкой для Tilda

2026-04-23 13:02 Поведенческие факторы Маркетинг SEO

📌 Аннотация

Этот скрипт показывает пользователю липкую плашку с таймером обратного отсчёта.
Пока таймер идёт — пользователь “ожидает” персональную скидку. После завершения появляется промокод.
Что это даёт:
  • увеличивает время на сайте (ПФ)
  • снижает процент отказов
  • повышает вероятность покупки
  • создаёт эффект “персонального предложения”
Дополнительно:
  • таймер персональный для каждого пользователя
  • не сбрасывается при обновлении страницы
  • останавливается, если вкладка неактивна
  • есть умное распределение времени (разные пользователи ждут разное время)
  • встроена кнопка копирования промокода

⚙️ Как вставить на сайт Tilda

Способ 1 (рекомендуемый)

  1. Открой страницу в Tilda
  2. Добавь блок T123 (HTML-код)
  3. Вставь в него весь код скрипта целиком
  4. Сохрани и опубликуй страницу

Способ 2 (глобально на все страницы)

  1. Перейди в:
  2. Настройки сайта → Дополнительно → HTML-код
  3. Вставь код перед </body>
  4. Сохрани и опубликуй сайт

🌍 Использование на других сайтах

Скрипт работает на:
  • обычных 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-скрипта


&lt;div id="sg-promo-bar" style="display:none;"&gt;
  &lt;div class="sg-promo-inner"&gt;
    &lt;div class="sg-promo-top"&gt;
      &lt;div class="sg-promo-text-wrap"&gt;
        &lt;div class="sg-promo-title" id="sgPromoTitle"&gt;&lt;/div&gt;
        &lt;div class="sg-promo-subtitle" id="sgPromoSubtitle"&gt;&lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="sg-promo-right" id="sgPromoRight"&gt;&lt;/div&gt;
    &lt;/div&gt;

    &lt;div class="sg-promo-progress" id="sgPromoProgressWrap"&gt;
      &lt;div class="sg-promo-progress-line" id="sgPromoProgressLine"&gt;&lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;style&gt;
  #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;
  }
&lt;/style&gt;

&lt;script&gt;
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 &lt; 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 &lt; 10 ? "0"+m : m) + ":" + (s &lt; 10 ? "0"+s : s);
  }

  function render() {
    if (localStorage.getItem(doneKey)) {
      titleEl.innerText = titleAfter;
      subtitleEl.innerText = subtitleAfter;

      rightEl.innerHTML =
        '&lt;span class="sg-promo-code"&gt;'+promoCode+'&lt;/span&gt;' +
        '&lt;button class="sg-promo-copy-btn" id="copyBtn"&gt;Скопировать&lt;/button&gt;';

      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 =
      '&lt;span class="sg-promo-timer"&gt;'+formatTime(left)+'&lt;/span&gt;';

    progressLine.style.width = (elapsed / duration * 100) + "%";
  }

  function tick() {
    if (!document.hidden) {
      elapsed++;
      localStorage.setItem(elapsedKey, elapsed);
    }

    if (elapsed &gt;= duration) {
      localStorage.setItem(doneKey, "1");
    }

    render();
  }

  setInterval(tick, 1000);
  render();

});
/script

Удобного и полезного использования.