Пользователь посмотрел товар три раза за два дня — явный сигнал интереса. Но покупки нет. Стандартные email-рассылки с напоминанием дают конверсию 2-3%. Автоматическое снижение цены через 24-48 часов после просмотра или отправка персонального купона конвертирует до 15% таких пользователей. В Битрикс это реализуется через модуль маркетинга и обработчик событий. Мы настраиваем такой триггер под ключ за 3-5 рабочих дней. Получите консультацию по вашему проекту. За 10 лет опыта мы реализовали десятки подобных решений. Используем проверенные паттерны с HL-блоками и агентами.
Фиксация просмотров
Просмотры товара пишутся в таблицу HL-блока. Стандартный модуль статистики (b_stat_page_event) не подходит — нужна связь конкретного пользователя с конкретным товаром. Upsert-запрос обновляет счётчик и дату, исключая дублирование:
// /local/lib/Tracking/ProductViewTracker.php namespace Local\Tracking; class ProductViewTracker { public static function track(int $userId, int $productId): void { if ($userId <= 0) return; // только авторизованных $conn = \Bitrix\Main\Application::getConnection(); // Upsert: обновляем счётчик и дату последнего просмотра $conn->queryExecute(" INSERT INTO b_uts_product_view (UF_USER_ID, UF_PRODUCT_ID, UF_VIEW_COUNT, UF_LAST_VIEW, UF_TRIGGER_SENT) VALUES ({$userId}, {$productId}, 1, NOW(), 'N') ON DUPLICATE KEY UPDATE UF_VIEW_COUNT = UF_VIEW_COUNT + 1, UF_LAST_VIEW = NOW() "); } } Вызывать в компоненте карточки товара, в result_modifier.php:
// /local/templates/.default/components/bitrix/catalog.element/main/result_modifier.php global $USER; if ($USER->IsAuthorized()) { \Local\Tracking\ProductViewTracker::track( (int)$USER->GetID(), (int)$arResult['ID'] ); } Как работает агент-триггер?
Агент запускается раз в час, ищет пользователей с подходящими условиями и применяет скидку:
namespace Local\Marketing; class PriceDropTriggerAgent { public static function run(): string { $conn = \Bitrix\Main\Application::getConnection(); // Товары, просмотренные 2+ раз, без покупки, 24+ часов назад $candidates = $conn->query(" SELECT pv.UF_USER_ID, pv.UF_PRODUCT_ID, pv.UF_VIEW_COUNT FROM b_uts_product_view pv LEFT JOIN b_sale_basket sb ON sb.USER_ID = pv.UF_USER_ID AND sb.PRODUCT_ID = pv.UF_PRODUCT_ID AND sb.ORDER_ID IS NOT NULL WHERE pv.UF_VIEW_COUNT >= 2 AND pv.UF_LAST_VIEW < DATE_SUB(NOW(), INTERVAL 24 HOUR) AND pv.UF_TRIGGER_SENT = 'N' AND sb.ID IS NULL LIMIT 50 "); while ($row = $candidates->fetch()) { self::applyDiscount($row['UF_USER_ID'], $row['UF_PRODUCT_ID']); // Помечаем, чтобы не применять повторно $conn->queryExecute(" UPDATE b_uts_product_view SET UF_TRIGGER_SENT = 'Y' WHERE UF_USER_ID = {$row['UF_USER_ID']} AND UF_PRODUCT_ID = {$row['UF_PRODUCT_ID']} "); } return '\Local\Marketing\PriceDropTriggerAgent::run();'; } private static function applyDiscount(int $userId, int $productId): void { // Создаём персональный купон через модуль маркетинга $couponCode = 'VIEW_' . strtoupper(substr(md5($userId . $productId . time()), 0, 8)); \CCatalogDiscountCoupon::Add([ 'DISCOUNT_ID' => VIEWED_PRODUCT_DISCOUNT_ID, // ID заранее созданной скидки 10% 'CODE' => $couponCode, 'ONE_TIME' => 'Y', // одноразовый 'ACTIVE' => 'Y', 'ACTIVE_FROM' => new \Bitrix\Main\Type\DateTime(), 'ACTIVE_TO' => \Bitrix\Main\Type\DateTime::createFromTimestamp(time() + 86400 * 3), 'MAX_USE' => 1, ]); // Привязываем купон к пользователю через HL-блок PersonalCouponRepository::save($userId, $productId, $couponCode); // Email пользователю self::sendEmail($userId, $productId, $couponCode); } } Почему агент запускается раз в час?
Частота выбрана не случайно. Интервал менее 30 минут создаёт избыточную нагрузку на базу при большом количестве просмотров. Раз в час — баланс между своевременностью и производительностью. При необходимости можно изменить крон-задачу до 15 минут для высоконагруженных проектов.
Скидка через модуль маркетинга
Базовая скидка создаётся один раз через административный интерфейс (Маркетинг → Скидки) или через API:
\CCatalogDiscount::Add([ 'NAME' => 'Персональная скидка на просмотренный товар', 'LID' => SITE_ID, 'ACTIVE' => 'Y', 'VALUE' => 10, // скидка 10% 'VALUE_TYPE' => 'P', 'COUPON_TYPE' => 'U', // только с купоном 'SORT' => 300, 'PRIORITY' => 1, ]); Идентификатор этой скидки прописывается в константу VIEWED_PRODUCT_DISCOUNT_ID.
Как избежать повторного применения скидки?
Поле UF_TRIGGER_SENT в HL-блоке блокирует повторную обработку. После выдачи купона агент больше не обрабатывает эту пару пользователь-товар. Дополнительно проверяется наличие заказа — если пользователь уже купил товар, триггер не срабатывает.
Почему важно чистить старые записи?
Таблица просмотров может разрастись до миллионов строк. Раз в неделю агент удаляет записи старше 30 дней с отправленным триггером. Это ускоряет выборку и снижает нагрузку на базу.
Процесс работы
- Аналитика: определяем условия триггера (количество просмотров, временной порог, размер скидки).
- Прототипирование: создаём HL-блок, настраиваем агент, тестовый сценарий.
- Разработка: пишем код трекера, агента, генерации купонов.
- Тестирование: проверка на тестовом товаре, логирование, корректировка.
- Деплой и мониторинг: запуск, наблюдение за конверсией.
Что входит в работу
- Разработка и интеграция трекера просмотров
- Создание агента с гибкими условиями
- Настройка персональных купонов
- Email-уведомления (опционально)
- Документация и передача доступов
- Гарантия 30 дней на корректную работу
Сроки ориентировочно
| Этап | Срок |
|---|---|
| Аналитика и прототип | от 1 дня |
| Разработка | от 2 дней |
| Тестирование и деплой | от 1 дня |
| Итого | от 3 до 5 дней |
Стоимость рассчитывается индивидуально. Оценим ваш проект бесплатно — просто свяжитесь.
Интеграция с email-уведомлениями
Email-уведомление о скидке — критическая часть воронки. Без письма купон лежит в базе, пользователь о нём не знает. Шаблон создаётся в почтовых событиях 1С-Битрикс (Маркетинг → Почтовые события). В шаблон подставляются: название товара, фото, новая сумма скидки, код купона и прямая ссылка на карточку.
Оптимальная цепочка: первое письмо сразу после выдачи купона, второе — через 24 часа с напоминанием «купон истекает через 48 часов». Такая цепочка повышает итоговую конверсию с 10–15% до 18–22%.
Типичные ошибки при настройке триггера
- Слишком малый порог просмотров (1 вместо 2–3): купоны получают случайные посетители без реального намерения купить.
- Отсутствие проверки на существующий заказ: пользователь уже купил товар, но получает купон — лишняя скидка.
- Нет ограничения по частоте повторной выдачи: один пользователь может получить купон на тот же товар несколько раз.
- Не чистятся старые записи: таблица просмотров разрастается, выборка замедляется.
Сравнение механик конверсии
| Механизм | Конверсия | Сложность внедрения |
|---|---|---|
| Email-напоминание | 2-3% | Низкая |
| Персональный купон | 10-15% | Средняя |
| Автоматическая скидка в корзине | 8-12% | Высокая |
Персональный купон даёт конверсию в 5 раз выше, чем простое напоминание. Выбирайте подходящий вариант под свой бюджет и задачи. Мы гарантируем прозрачность на всех этапах. Получите консультацию — поможем подобрать оптимальный сценарий.







