Настройка отслеживания брошенных корзин 1С-Битрикс
Брошенная корзина — товар добавлен, но заказ не оформлен. По статистике, 65–75% корзин бросаются. Вернуть хотя бы 10% из них — значит поднять выручку без увеличения трафика. Первый шаг — настроить отслеживание: понять, сколько корзин бросается, кто эти пользователи и что в них лежало.
Где хранятся данные корзины в Битрикс
Корзина в Битрикс связана с виртуальным пользователем (fuser) — анонимным идентификатором сессии.
-
b_sale_fuser— запись для каждого посетителя (анонимного и авторизованного) -
b_sale_basket— позиции корзины, привязанные кFUSER_ID -
b_sale_basket.DATE_INSERT,b_sale_basket.DATE_UPDATE— дата добавления и последнего изменения
При авторизации FUSER_ID сессии связывается с реальным пользователем: b_sale_fuser.USER_ID. До авторизации USER_ID = null.
Определение «брошенной» корзины
Корзина считается брошенной, если:
- В
b_sale_basketесть позиции - Нет оформленного заказа по этому
FUSER_IDза последние N часов - Последнее обновление корзины (
DATE_UPDATE) было более M часов назад
// Выбираем брошенные корзины: позиции добавлены более 1 часа назад, заказ не оформлен
$cutoffTime = new \Bitrix\Main\Type\DateTime();
$cutoffTime->add('-1 hour');
$abandonedFusers = \Bitrix\Sale\BasketTable::getList([
'filter' => [
'<DATE_UPDATE' => $cutoffTime,
'=ORDER_ID' => false, // не привязаны к заказу
],
'group' => ['FUSER_ID'],
'select' => ['FUSER_ID'],
])->fetchAll();
После получения FUSER_ID — смотрим, есть ли у него USER_ID (авторизованный пользователь):
foreach ($abandonedFusers as $row) {
$fuser = \Bitrix\Sale\FuserTable::getList([
'filter' => ['=ID' => $row['FUSER_ID']],
'select' => ['USER_ID', 'DATE_UPDATE'],
])->fetch();
if (!$fuser || !$fuser['USER_ID']) continue; // анонимный — нет контакта для коммуникации
// Получаем email пользователя
$user = \Bitrix\Main\UserTable::getById($fuser['USER_ID'])->fetch();
$email = $user['EMAIL'] ?? '';
if (!$email) continue;
// Записываем в очередь для отправки уведомления
AbandonedCartQueue::push($fuser['USER_ID'], $row['FUSER_ID']);
}
Отслеживание через аналитику (GA4 / Яндекс.Метрика)
Параллельно с серверным отслеживанием настройте клиентские события:
// При добавлении товара в корзину
BX.addCustomEvent('onBasketItemAdded', function(data) {
gtag('event', 'add_to_cart', {
currency: 'RUB',
value: data.price * data.quantity,
items: [{
item_id: data.productId,
item_name: data.productName,
price: data.price,
quantity: data.quantity,
}],
});
ym(METRIKA_ID, 'reachGoal', 'add_to_cart');
});
// При удалении из корзины
BX.addCustomEvent('onBasketItemDeleted', function(data) {
gtag('event', 'remove_from_cart', { /* ... */ });
});
В GA4: Reports → Monetisation → Checkout journey — покажет воронку от добавления в корзину до покупки с процентами отвала на каждом шаге.
Агент для регулярного выявления брошенных корзин
Запускайте агент каждые 30–60 минут:
// В файле /local/php_interface/init.php
\Bitrix\Main\EventManager::getInstance()->addEventHandler(
'main', 'OnBeforeLocalRedirect', // или регистрируйте через агенты
function() {}
);
// Агент (Настройки → Агенты)
function checkAbandonedCarts(): string
{
AbandonedCartService::processNew();
return __FUNCTION__ . '();'; // возвращаем для повторного вызова
}
AbandonedCartService::processNew() — ваш класс, который выбирает новые брошенные корзины (не отмеченные как обработанные) и пишет их в очередь уведомлений.
Хранение статуса обработки
Создайте таблицу для хранения статуса брошенных корзин:
class AbandonedCartTable extends \Bitrix\Main\ORM\Data\DataManager
{
public static function getTableName(): string { return 'local_abandoned_cart'; }
public static function getMap(): array
{
return [
new \Bitrix\Main\ORM\Fields\IntegerField('ID', ['primary' => true, 'autocomplete' => true]),
new \Bitrix\Main\ORM\Fields\IntegerField('USER_ID'),
new \Bitrix\Main\ORM\Fields\IntegerField('FUSER_ID'),
new \Bitrix\Main\ORM\Fields\StringField('STATUS'), // new, email_sent, sms_sent, recovered
new \Bitrix\Main\ORM\Fields\DatetimeField('DETECTED_AT'),
new \Bitrix\Main\ORM\Fields\DatetimeField('EMAIL_SENT_AT'),
new \Bitrix\Main\ORM\Fields\DatetimeField('SMS_SENT_AT'),
new \Bitrix\Main\ORM\Fields\FloatField('CART_VALUE'),
];
}
}
Когда пользователь оформляет заказ — обновляйте статус на recovered через событие OnSaleOrderSaved.
Отчётность: сколько возвращается
После нескольких недель работы у вас есть данные: сколько корзин обнаружено, сколько коммуникаций отправлено, сколько конверсий произошло после коммуникации. Стройте простой отчёт:
SELECT
DATE(detected_at) AS date,
COUNT(*) AS detected,
SUM(CASE WHEN status = 'recovered' THEN 1 ELSE 0 END) AS recovered,
ROUND(SUM(CASE WHEN status = 'recovered' THEN 1 ELSE 0 END) * 100.0 / COUNT(*), 1) AS recovery_rate
FROM local_abandoned_cart
GROUP BY DATE(detected_at)
ORDER BY date DESC;
Сроки выполнения: базовое серверное отслеживание и агент — 1–2 дня. Клиентские GA4/Метрика события — 4 часа. Таблица статусов и отчётность — ещё 1 день.







