Настройка SMS-уведомлений о брошенной корзине 1С-Битрикс
SMS о брошенной корзине — более агрессивный инструмент, чем email: его открывают в 95% случаев против 20–30% для email. Именно поэтому использовать его нужно аккуратно: только для пользователей, давших явное согласие, и только один раз в цикле — без напоминаний через SMS.
Когда SMS оправдан
SMS-канал для брошенных корзин даёт результат в нескольких сценариях:
- Высокая средняя стоимость заказа (от 3 000 руб.) — ценность напоминания перекрывает стоимость SMS
- Пользователь не открыл email в течение 3–4 часов
- Категории товаров с высоким «импульсным» спросом (электроника, одежда)
Для дешёвых товаров стоимость SMS-канала (3–8 руб. за сообщение) нивелирует прибыль от возврата корзин.
Получение телефона пользователя из Битрикс
Телефон берётся из профиля пользователя. Битрикс хранит его в пользовательских полях (b_user_field) или в свойствах заказа (b_sale_order_props_value):
function getUserPhone(int $userId): string
{
// Способ 1: из пользовательского поля UF_PHONE
$user = \Bitrix\Main\UserTable::getById($userId)->fetch();
if (!empty($user['UF_PHONE'])) return $user['UF_PHONE'];
// Способ 2: из последнего заказа пользователя
$order = \Bitrix\Sale\Order::getList([
'filter' => ['USER_ID' => $userId],
'order' => ['DATE_INSERT' => 'DESC'],
'limit' => 1,
'select' => ['ID'],
])->fetch();
if (!$order) return '';
$orderObj = \Bitrix\Sale\Order::load($order['ID']);
foreach ($orderObj->getPropertyCollection() as $prop) {
if ($prop->getField('CODE') === 'PHONE') {
return (string)$prop->getValue();
}
}
return '';
}
Подключение SMS-шлюза
Битрикс имеет встроенный модуль рассылки SMS (main.smsmanager), но он ориентирован на стандартные уведомления. Для брошенных корзин лучше использовать прямой API SMS-провайдера.
Популярные провайдеры с REST API: SMS.ru, SMSC.ru, МТС Коммуникатор, SMPP.
Пример интеграции с SMS.ru:
class SmsRuClient
{
private string $apiId;
public function __construct(string $apiId)
{
$this->apiId = $apiId;
}
public function send(string $phone, string $message, string $from = 'SHOP'): bool
{
$phone = preg_replace('/[^0-9]/', '', $phone);
if (strlen($phone) === 10) $phone = '7' . $phone;
$ch = curl_init('https://sms.ru/sms/send');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query([
'api_id' => $this->apiId,
'to' => $phone,
'msg' => $message,
'from' => $from,
'json' => 1,
]),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 10,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
return isset($response['status']) && $response['status'] === 'OK';
}
}
Текст SMS о брошенной корзине
SMS ограничено 160 символами (кириллица — 70 символов на часть). Текст должен быть коротким и содержать прямую ссылку:
function buildCartSmsText(string $userName, float $cartTotal, string $cartUrl): string
{
$shortUrl = shortenUrl($cartUrl); // сокращатель ссылок или ваш домен
$total = number_format($cartTotal, 0, '.', ' ');
return "{$userName}, в вашей корзине товары на {$total} руб. Оформите заказ: {$shortUrl}";
}
Не упоминайте конкретные товары — 70 символов не хватит. Указывайте сумму — это создаёт контекст.
Агент отправки SMS
function sendAbandonedCartSms(): string
{
$smsClient = new SmsRuClient(getenv('SMSRU_API_ID'));
// Берём корзины: email уже отправлен 3 часа назад, SMS ещё нет
$candidates = AbandonedCartTable::getList([
'filter' => [
'STATUS' => 'email_sent',
'<EMAIL_SENT_AT' => new \Bitrix\Main\Type\DateTime('-3 hours'),
'=SMS_SENT_AT' => false,
],
'limit' => 20, // не больше 20 за раз — контролируем нагрузку на шлюз
])->fetchAll();
foreach ($candidates as $row) {
// Проверяем согласие на SMS
$user = \Bitrix\Main\UserTable::getById($row['USER_ID'])->fetch();
if (empty($user['UF_SMS_CONSENT'])) continue;
$phone = getUserPhone($row['USER_ID']);
if (!$phone) continue;
// Проверяем, не оформил ли заказ после email
if (hasRecentOrder($row['USER_ID'])) {
AbandonedCartTable::update($row['ID'], ['STATUS' => 'recovered']);
continue;
}
$basket = \Bitrix\Sale\Basket::loadItemsForFUser($row['FUSER_ID'], SITE_ID);
if ($basket->isEmpty()) continue;
$smsText = buildCartSmsText($user['NAME'], $basket->getPrice(), '/basket/');
$sent = $smsClient->send($phone, $smsText);
AbandonedCartTable::update($row['ID'], [
'STATUS' => $sent ? 'sms_sent' : 'sms_failed',
'SMS_SENT_AT' => $sent ? new \Bitrix\Main\Type\DateTime() : null,
]);
}
return __FUNCTION__ . '();';
}
Управление согласием
Поле согласия на SMS-маркетинг (UF_SMS_CONSENT) должно устанавливаться при регистрации или в личном кабинете — явным чекбоксом «Хочу получать SMS с персональными предложениями». Без явного согласия отправка SMS нарушает ФЗ-38.
Сроки: настройка SMS-шлюза и агента отправки — 1–2 дня. С управлением согласием и интеграцией в форму регистрации — 2–3 дня.







