Настройка отслеживания брошенных корзин 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка отслеживания брошенных корзин 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1177
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    747
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка отслеживания брошенных корзин 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.

Определение «брошенной» корзины

Корзина считается брошенной, если:

  1. В b_sale_basket есть позиции
  2. Нет оформленного заказа по этому FUSER_ID за последние N часов
  3. Последнее обновление корзины (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 день.