Настройка триггерных push-уведомлений 1С-Битрикс
Триггерные push-уведомления отличаются от сегментированных рассылок одним: они отправляются автоматически в ответ на конкретное действие пользователя, а не по расписанию. Брошенная корзина через 2 часа, снижение цены на просмотренный товар, поступление в продажу позиции из вишлиста — это и есть триггерные сценарии. Правильно настроенные, они дают ROI 500–1500%.
Событийная архитектура в Битрикс
Триггерные push строятся на событийной модели Битрикс. Каждое событие в системе — потенциальный триггер. Схема работы:
- Происходит событие (добавление в корзину, просмотр товара, изменение статуса заказа)
- Обработчик события проверяет условия сценария
- Если условия выполнены — задача на отправку push откладывается в очередь с задержкой
- Агент Битрикс обрабатывает очередь и отправляет уведомления
Очередь задач хранится в таблице:
CREATE TABLE custom_push_queue (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
scenario VARCHAR(50) NOT NULL,
payload JSON,
send_at DATETIME NOT NULL,
status ENUM('pending', 'sent', 'cancelled') DEFAULT 'pending',
created_at DATETIME,
INDEX idx_send_at (send_at, status),
INDEX idx_user_scenario (user_id, scenario)
);
Ключевые сценарии
Брошенная корзина — самый ценный сценарий. Логика:
// Обработчик OnSaleBasketItemSaved
AddEventHandler('sale', 'OnSaleBasketItemSaved', function($basketItem) {
$userId = (int)$basketItem->getField('USER_ID');
if (!$userId) return; // Только авторизованные
// Отменяем предыдущую задачу для этого пользователя
PushQueueTable::cancelByUserAndScenario($userId, 'abandoned_cart');
// Ставим новую — через 2 часа
PushQueueTable::add([
'USER_ID' => $userId,
'SCENARIO' => 'abandoned_cart',
'PAYLOAD' => json_encode(['cart_url' => '/cart/']),
'SEND_AT' => new \Bitrix\Main\Type\DateTime(date('Y-m-d H:i:s', time() + 7200)),
'STATUS' => 'pending',
'CREATED_AT' => new \Bitrix\Main\Type\DateTime(),
]);
});
Когда пользователь оформил заказ — задача отменяется. Когда не оформил — через 2 часа приходит push.
Снижение цены на просмотренный товар — требует хранения истории просмотров и мониторинга изменения цен:
// При изменении цены торгового предложения (OnBeforeIBlockElementUpdate)
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', function(&$fields) {
$elementId = (int)$fields['ID'];
$newPrice = getElementPrice($elementId);
// Находим пользователей, просматривавших этот товар
$viewers = ProductViewHistoryTable::getUsersByProduct($elementId, 30); // за 30 дней
foreach ($viewers as $viewer) {
$oldPrice = ProductPriceHistoryTable::getLastPrice($elementId, $viewer['USER_ID']);
if ($newPrice < $oldPrice * 0.9) { // Скидка 10%+
PushQueueTable::add([
'USER_ID' => $viewer['USER_ID'],
'SCENARIO' => 'price_drop',
'PAYLOAD' => json_encode(['product_id' => $elementId, 'new_price' => $newPrice]),
'SEND_AT' => new \Bitrix\Main\Type\DateTime(), // Немедленно
'STATUS' => 'pending',
]);
}
}
});
Поступление в наличие — через обработчик изменения количества в b_catalog_store_product или при синхронизации с 1С.
Статус заказа — обработчик события OnSaleStatusOrderChange. Push отправляется немедленно при каждом изменении статуса.
Агент обработки очереди
Агент Битрикс запускается каждую минуту:
function ProcessPushQueue(): string {
$now = new \Bitrix\Main\Type\DateTime();
$records = PushQueueTable::getList([
'filter' => ['=STATUS' => 'pending', '<=SEND_AT' => $now],
'limit' => 100,
]);
while ($record = $records->fetch()) {
$tokens = PushTokenTable::getByUserId($record['USER_ID']);
if (!empty($tokens)) {
$message = PushScenario::buildMessage($record['SCENARIO'], json_decode($record['PAYLOAD'], true));
PushSender::send($tokens, $message);
}
PushQueueTable::update($record['ID'], ['STATUS' => 'sent']);
}
return __FUNCTION__ . '();';
}
Дедупликация и умное расписание
Без дедупликации пользователь может получить три push за час. Правила:
- Один сценарий — не чаще раза в 24 часа на пользователя
- Не отправлять push с 23:00 до 9:00 (по таймзоне пользователя)
- Если пользователь уже купил после события — отменить задачу
Таймзона пользователя берётся из его профиля или геолокации при регистрации.
Сроки выполнения
| Объём работ | Срок |
|---|---|
| Брошенная корзина + изменение статуса | 2–3 дня |
| Снижение цены + поступление в наличие | +2 дня |
| Дедупликация + таймзоны + аналитика | +1–2 дня |
Каждый рабочий триггерный сценарий — это автоматизированный продавец, который не берёт зарплату.







