Налаштування триггера залишеного перегляду товару 1С-Bitrix
Користувач відкрив карточку товару, провів на ній 40 секунд і пішов без додавання в кошик. Це гарячий ліда: інтерес був, рішення не прийнято. Триггер залишеного перегляду фіксує цей момент і запускає автоматизацію — лист, push або завдання менеджеру. В Bitrix це реалізується через модуль sale у зв'язці з триггерами маркетингової автоматизації в CRM або через власний агент.
Де зберігаються дані про перегляди
Модуль catalog пише історію переглядів в таблицю b_catalog_viewed_product. Структура: USER_ID, PRODUCT_ID, SITE_ID, DATE_VISIT. Таблиця оновлюється при кожному хіті на детальну сторінку через компонент bitrix:catalog.element — всередині нього викликається CCatalogViewedProduct::Add().
Аноніми користувачі записуються з USER_ID рівним FUSER_ID з b_sale_fuser — це важливо: поле в таблиці b_catalog_viewed_product називається USER_ID, але для гостей туди пишеться fake user ID, а не справжнісний b_user.ID.
Визначення «залишеності»
Перегляд вважається залишеним, якщо виконані три умови: товар був переглянутий, протягом N хвилин після перегляду товар не був додан в кошик (b_sale_basket), і користувач не оформив замовлення з цим товаром (b_sale_order_basket). Часовий поріг — налаштовуваний параметр, зазвичай 30–60 хвилин.
Запит для пошуку залишених переглядів за останні 2 години:
SELECT v.USER_ID, v.PRODUCT_ID, v.DATE_VISIT
FROM b_catalog_viewed_product v
LEFT JOIN b_sale_basket b
ON b.FUSER_ID = v.USER_ID
AND b.PRODUCT_ID = v.PRODUCT_ID
AND b.DATE_INSERT > v.DATE_VISIT
WHERE v.DATE_VISIT > NOW() - INTERVAL '2 hours'
AND b.ID IS NULL;
Реалізація через агент Bitrix
Стандартний механізм — агент у b_agent, який запускається кожні 15–30 хвилин. Агент перевіряє таблицю b_catalog_viewed_product, знаходить кандидатів за умовами вище, і для кожного створює подію в маркетинговій автоматизації або надсилає лист.
function AbandonedViewAgent(): string
{
$cutoffTime = new \Bitrix\Main\Type\DateTime();
$cutoffTime->add('-60 minutes');
$thresholdTime = new \Bitrix\Main\Type\DateTime();
$thresholdTime->add('-30 minutes');
$viewed = \Bitrix\Catalog\ViewedProductTable::getList([
'filter' => [
'>=DATE_VISIT' => $cutoffTime,
'<=DATE_VISIT' => $thresholdTime,
],
'select' => ['USER_ID', 'PRODUCT_ID', 'DATE_VISIT'],
])->fetchAll();
foreach ($viewed as $row) {
// Перевіряємо, чи немає товару в кошику після перегляду
$inBasket = \Bitrix\Sale\BasketTable::getList([
'filter' => [
'FUSER_ID' => $row['USER_ID'],
'PRODUCT_ID' => $row['PRODUCT_ID'],
'>=DATE_INSERT' => $row['DATE_VISIT'],
],
'limit' => 1,
])->fetch();
if (!$inBasket) {
// Запускаємо сценарій автоматизації
\Bitrix\Marketing\Automation\Trigger\BaseTrigger::send(
'CATALOG_ABANDONED_VIEW',
['PRODUCT_ID' => $row['PRODUCT_ID'], 'FUSER_ID' => $row['USER_ID']]
);
}
}
return 'AbandonedViewAgent();';
}
Інтеграція з Marketing Automation
У модулі marketing (Bitrix24 On-Premise) триггери створюються через інтерфейс «Автоматизація → Триггери». Для кастомного триггера потрібно зареєструвати клас-спадкоємець \Bitrix\Marketing\Automation\Trigger\BaseTrigger і прописати його в b_marketing_trigger. Триггер приймає PRODUCT_ID та FUSER_ID, будує сегмент, і запускає сценарій розсилки.
Якщо Bitrix24 не використовується, альтернатива — модуль subscribe: створити подію через \Bitrix\Main\Mail\Event::send() з типом листа CATALOG_ABANDONED_VIEW, у шаблоні якого підставляються дані товару з інфоблоку.
Дедупліцирація спрацьовувань
Агент має пам'ятати, що вже обробив. Інакше кожний запуск заново знайде ті ж записи. Рішення: окрема таблиця bl_abandoned_view_sent з полями (fuser_id, product_id, sent_at). Перед надсиланням — перевірка наявності записи. Унікальний індекс на (fuser_id, product_id) захищає від дублів при паралельних запусках агента.
Що ми налаштовуємо
- Реєстрацію агента
AbandonedViewAgentуb_agentз потрібним інтервалом - Запит до
b_catalog_viewed_productз урахуванням різниці FUSER/USER для анонімів - Таблицю дедупліцирування
bl_abandoned_view_sent - Шаблон листа або push-сповіщення з даними про переглянутий товар
- Логіку виключення користувачів, які вже додали товар в кошик або купили його







