Налаштування відстеження покинутих кошиків 1С-Бітрікс
Покинутий кошик — товар додано, але замовлення не оформлено. За статистикою, 65–75% кошиків кидають. Повернути хоча б 10% з них — означає підняти виручку без збільшення трафіку. Перший крок — налаштувати відстеження: зрозуміти, скільки кошиків кидається, хто ці користувачі і що в них лежало.
Де зберігаються дані кошика в Бітрікс
Кошик у 1С-Бітрікс пов'язаний з віртуальним користувачем (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 день.







