Налаштування email-сповіщень про покинутий кошик 1С-Бітрікс
Email про покинутий кошик — одне з небагатьох автоматичних листів з конверсією 5–15%. Лист через 1–2 години після відходу з сайту надходить у момент, коли покупець ще не забув про товар. На 1С-Бітрікс це реалізується через агент, модуль 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__ . '();';
}
Відписка та управління згодою
За вимогами ЗУ «Про рекламу» та 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 тижні.







