Налаштування SMS-сповіщень про покинутий кошик 1С-Бітрікс
SMS про покинутий кошик — більш агресивний інструмент, ніж email: його відкривають у 95% випадків проти 20–30% для email. Саме тому використовувати його потрібно обережно: лише для користувачів, які дали явну згоду, і лише один раз у циклі — без нагадувань через SMS.
Коли SMS виправданий
SMS-канал для покинутих кошиків дає результат у кількох сценаріях:
- Висока середня вартість замовлення (від 3 000 грн) — цінність нагадування перекриває вартість SMS
- Користувач не відкрив email протягом 3–4 годин
- Категорії товарів з високим «імпульсним» попитом (електроніка, одяг)
Для дешевих товарів вартість SMS-каналу нівелює прибуток від повернення кошиків.
Отримання телефону користувача з Бітрікс
Телефон береться з профілю користувача. 1С-Бітрікс зберігає його в користувацьких полях (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-шлюзу
1С-Бітрікс має вбудований модуль розсилки 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 порушує законодавство про рекламу.
Терміни: налаштування SMS-шлюзу та агента відправки — 1–2 дні. З управлінням згодою та інтеграцією у форму реєстрації — 2–3 дні.







