Налаштування спусказних push-повідомлень у 1С-Bitrix
Спусказні push-повідомлення відрізняються від сегментованих розсилок однією речею: вони відправляються автоматично у відповідь на конкретну дію користувача, а не за розписанням. Заброшений кошик через 2 години, зниження ціни на переглянутий товар, поступлення в продаж позиції з вішліста — це спусказні сценарії. Правильно налаштовані, вони дають ROI 500–1500%.
Архітектура подій у Bitrix
Спусказні push будуються на модель подій Bitrix. Кожна подія в системі — потенційний спусковий механізм. Схема роботи:
- Відбувається подія (додавання в кошик, перегляд товару, зміна статусу замовлення)
- Обробник подій перевіряє умови сценарію
- Якщо умови виконані — задача на надсилання push відкладається в чергу з затримкою
- Агент Bitrix обробляє чергу і надсилає повідомлення
Черга задач зберігається в таблиці:
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 відправляється одразу при кожній зміні статусу.
Агент обробки черги
Агент Bitrix запускається щохвилини:
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 до 09:00 (за часовим поясом користувача)
- Якщо користувач уже купив після події — скасувати задачу
Часовий пояс користувача з його профілю або геолокації при реєстрації.
Сроки виконання
| Обсяг робіт | Строк |
|---|---|
| Заброшений кошик + зміна статусу | 2–3 дні |
| Зниження ціни + поступлення в наявність | +2 дні |
| Дедублікація + часові пояси + аналітика | +1–2 дні |
Кожен робочий спусказний сценарій — це автоматизований продавець, який не бере зарплату.







