Настройка email-уведомлений о брошенной корзине 1С-Битрикс
Email о брошенной корзине — одно из немногих автоматических писем с конверсией 5–15%. Письмо через 1–2 часа после ухода с сайта попадает в момент, когда покупатель ещё не забыл о товаре. На Битрикс это реализуется через агент, модуль main.mail и шаблоны почтовых событий.
Основная логика: когда отправлять
Оптимальные временны́е интервалы:
- Первое письмо — через 1–2 часа. «Вы забыли в корзине». Без скидки.
- Второе письмо — через 24 часа (если не оформил). Подчёркиваем ценность товара.
- Третье письмо — через 72 часа (опционально). Со скидкой или истечением резервирования.
Не отправляйте все три письма подряд — это создаёт негативный опыт. Остановитесь после первого, если пользователь открыл письмо, или после второго, если кликнул по ссылке.
Шаблон почтового события
Создайте тип почтового события в Битрикс: Настройки → Почтовые события → Типы событий → Добавить.
- Код события:
ABANDONED_CART_REMINDER - Поля:
USER_NAME,USER_EMAIL,CART_ITEMS(HTML-таблица с товарами),CART_TOTAL,CART_RESTORE_URL,SITE_URL
Шаблон письма (Почтовые события → Шаблоны → Добавить):
Тема: #USER_NAME#, вы оставили товары в корзине
Здравствуйте, #USER_NAME#!
Вы не завершили оформление заказа. В вашей корзине:
#CART_ITEMS#
Итого: #CART_TOTAL# руб.
<a href="#CART_RESTORE_URL#">Вернуться к корзине</a>
Формирование данных для письма
class AbandonedCartMailer
{
public function send(int $userId, int $fuserId): bool
{
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
if (!$user || !$user['EMAIL']) return false;
// Проверяем, не оформил ли уже заказ
if ($this->hasRecentOrder($userId)) return false;
// Получаем позиции корзины
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($fuserId, SITE_ID);
if ($basket->isEmpty()) return false;
$cartItems = $this->buildCartItemsHtml($basket);
$cartTotal = number_format($basket->getPrice(), 0, '.', ' ');
// URL для восстановления корзины (просто URL корзины — товары уже там)
$cartUrl = SITE_SERVER_NAME . '/basket/';
\CEvent::Send('ABANDONED_CART_REMINDER', SITE_ID, [
'USER_NAME' => $user['NAME'],
'USER_EMAIL' => $user['EMAIL'],
'CART_ITEMS' => $cartItems,
'CART_TOTAL' => $cartTotal . ' руб.',
'CART_RESTORE_URL' => $cartUrl,
'SITE_URL' => SITE_SERVER_NAME,
]);
return true;
}
private function buildCartItemsHtml(\Bitrix\Sale\Basket $basket): string
{
$html = '<table width="100%" style="border-collapse:collapse">';
foreach ($basket as $item) {
$name = htmlspecialchars($item->getField('NAME'));
$qty = (int)$item->getField('QUANTITY');
$price = number_format($item->getPrice() * $qty, 0, '.', ' ');
$img = $this->getProductImage($item->getProductId());
$html .= "<tr>
<td width='80'><img src='{$img}' width='70' height='70'></td>
<td>{$name}<br>Кол-во: {$qty}</td>
<td align='right'>{$price} руб.</td>
</tr>";
}
$html .= '</table>';
return $html;
}
private function hasRecentOrder(int $userId): bool
{
$cutoff = new \Bitrix\Main\Type\DateTime();
$cutoff->add('-24 hours');
$order = \Bitrix\Sale\Order::getList([
'filter' => ['USER_ID' => $userId, '>DATE_INSERT' => $cutoff],
'select' => ['ID'],
'limit' => 1,
])->fetch();
return (bool)$order;
}
}
Агент для запуска рассылки
// Агент запускается каждые 30 минут
function sendAbandonedCartEmails(): string
{
$mailer = new AbandonedCartMailer();
// Берём корзины, обнаруженные 1–2 часа назад, первое письмо ещё не отправлено
$candidates = AbandonedCartTable::getList([
'filter' => [
'STATUS' => 'new',
'<DETECTED_AT' => new \Bitrix\Main\Type\DateTime('-1 hour'),
'>DETECTED_AT' => new \Bitrix\Main\Type\DateTime('-2 hours'),
],
'limit' => 50,
])->fetchAll();
foreach ($candidates as $row) {
$sent = $mailer->send($row['USER_ID'], $row['FUSER_ID']);
AbandonedCartTable::update($row['ID'], [
'STATUS' => $sent ? 'email_sent' : 'skipped',
'EMAIL_SENT_AT' => $sent ? new \Bitrix\Main\Type\DateTime() : null,
]);
}
return __FUNCTION__ . '();';
}
Отписка и управление согласием
По требованиям ФЗ-38 «О рекламе» и GDPR — пользователь должен иметь возможность отказаться. Добавьте в шаблон письма ссылку отписки:
<a href="#UNSUBSCRIBE_URL#">Отказаться от уведомлений о корзине</a>
На стороне Битрикс — обработчик /local/api/cart-unsubscribe.php, который устанавливает пользовательское поле UF_NO_CART_EMAIL = Y. Перед отправкой проверяйте это поле.
Отслеживание результатов
Добавьте UTM-метки к ссылке на корзину в письме:
$cartUrl = SITE_SERVER_NAME . '/basket/?utm_source=email&utm_medium=abandoned_cart&utm_campaign=reminder_1h';
В GA4 и Метрике будет видно, сколько пользователей перешло из письма и сколько из них оформило заказ.
Сроки: создание шаблона письма, агент, логика отправки — 3–5 дней. С многоступенчатой цепочкой писем, управлением согласием и отчётностью — 1–2 недели.







