Налаштування тригера зниження ціни на переглянутий товар 1С-Бітрікс
Користувач переглянув товар кілька разів і не купив — явний сигнал зацікавленості. Автоматичне зниження ціни через 24–48 годин після перегляду або додавання персонального купона конвертує таких користувачів краще, ніж стандартні email-розсилки. У Bitrix це реалізується через модуль маркетингу та обробник подій.
Фіксація переглядів
Перегляди товару записуються до таблиці HL-блока. Стандартний модуль статистики (b_stat_page_event) не підходить — потрібен зв'язок конкретного користувача з конкретним товаром:
// /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);
}
}
Знижка через модуль маркетингу
Базова знижка створюється один раз через адміністративний інтерфейс (Маркетинг → Знижки) або через 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.
Термін зберігання даних
Записи про перегляди очищаються агентом раз на тиждень: видаляємо записи старші за 30 днів із надісланим тригером. Таблиця не розростається до неприйнятних розмірів.
| Конфігурація | Термін |
|---|---|
| Трекінг + агент + email + купон | 3–5 днів |
| + аналітика конверсії тригера | +2 дні |







