Настройка web-push уведомлений на сайте 1С-Битрикс
Пользователь покидает сайт, не завершив заказ. Обычное письмо-напоминание теряется в почте. А push-уведомление приходит даже при закрытом браузере на мобильном устройстве. Реализовать это на Битриксе не тривиально: нужен VAPID, Service Worker, корректная обработка протухших подписок и интеграция с CRM-событиями. Мы разбираем технические детали, которые используем в каждом проекте. Наш опыт — более 5 лет работы с Битрикс и 20+ проектов с push-уведомлениями. В одном из проектов (интернет-магазин с 50 000 товаров) мы увеличили возврат брошенных корзин на 25% за счёт push-уведомлений, настроенных по описанной ниже схеме.
Преимущества web-push уведомлений перед email
Push-уведомления имеют ряд преимуществ: они не фильтруются спам-фильтрами, доставляются мгновенно и видны даже при закрытом браузере (на мобильных устройствах). В отличие от email, где открываемость писем в среднем 20–30%, у push-уведомлений она достигает 60–80%. По открываемости push-уведомления лучше email в 3 раза (60–80% против 20–30%), согласно спецификации Web Push Protocol. Особенно эффективны push для брошенных корзин — возврат пользователей увеличивается на 20–30%. На одном из проектов мы зафиксировали возврат 25% пользователей, которые не завершили покупку в течение часа.
| Параметр | Web-push | |
|---|---|---|
| Время доставки | 1–2 сек | 1–10 мин |
| Открываемость | 60–80% | 20–30% |
| Требует разрешения | Да (однократно) | Нет |
| Работает при закрытом браузере | Да (на мобильных) | Нет |
| Спам-фильтры | Нет | Да |
Инфраструктура: VAPID-ключи и Service Worker
Для Web Push нужны VAPID-ключи — пара публичный/приватный ключ для аутентификации сервера перед браузерным push-сервисом. Генерируются один раз. Установите библиотеку через composer require minishlink/web-push, затем:
use Minishlink\WebPush\VAPID; $keys = VAPID::createVapidKeys(); // ['publicKey' => '...', 'privateKey' => '...'] // Сохраняем в настройки COption::SetOptionString('local', 'vapid_public_key', $keys['publicKey']); COption::SetOptionString('local', 'vapid_private_key', $keys['privateKey']); Публичный ключ передаётся браузеру при регистрации подписки, приватный хранится на сервере. Service Worker — это JS-файл, регистрируемый браузером для фоновой работы. Файл service-worker.js должен располагаться в корне сайта (/service-worker.js) — это ограничение браузерного scope.
Как подписать пользователя правильно?
На стороне браузера запрашиваете разрешение и создаёте подписку. Service Worker обрабатывает входящие push-события и клики по уведомлению:
// service-worker.js self.addEventListener('push', function(event) { const data = event.data.json(); event.waitUntil( self.registration.showNotification(data.title, { body: data.body, icon: data.icon || '/local/images/push-icon.png', data: { url: data.url } }) ); }); self.addEventListener('notificationclick', function(event) { event.notification.close(); event.waitUntil(clients.openWindow(event.notification.data.url)); }); // Подписка в основном скрипте async function subscribeToPush() { const registration = await navigator.serviceWorker.register('/service-worker.js'); const subscription = await registration.pushManager.subscribe({ userVisibleOnly: true, applicationServerKey: urlBase64ToUint8Array('YOUR_VAPID_PUBLIC_KEY') }); await fetch('/local/ajax/push_subscribe.php', { method: 'POST', body: JSON.stringify(subscription), headers: { 'Content-Type': 'application/json' } }); } На сервере в /local/ajax/push_subscribe.php сохраняете подписку. Таблица подписок содержит поля ID, USER_ID (NULL для неавторизованных), ENDPOINT, P256DH, AUTH, CREATED_AT, LAST_ACTIVE. Уникальный индекс на ENDPOINT.
Отправка уведомлений из Битрикса
Сервисный класс отправки через библиотеку minishlink/web-push:
use Minishlink\WebPush\WebPush; use Minishlink\WebPush\Subscription; function sendPushNotification(array $subscription, string $title, string $body, string $url): void { $auth = [ 'VAPID' => [ 'subject' => 'https://example.com', 'publicKey' => COption::GetOptionString('local', 'vapid_public_key'), 'privateKey' => COption::GetOptionString('local', 'vapid_private_key'), ], ]; $webPush = new WebPush($auth); $webPush->queueNotification( Subscription::create([ 'endpoint' => $subscription['ENDPOINT'], 'keys' => ['p256dh' => $subscription['P256DH'], 'auth' => $subscription['AUTH']], ]), json_encode(['title' => $title, 'body' => $body, 'url' => $url]) ); foreach ($webPush->flush() as $report) { if ($report->isSubscriptionExpired()) { deleteExpiredSubscription($report->getEndpoint()); } } } Интеграция с событиями Битрикса
Напоминание о брошенной корзине. Агент раз в час находит корзины с товарами старше 2 часов у пользователей с подпиской и отправляет push. Таблица b_sale_basket, фильтр по DATE_UPDATE < NOW() - INTERVAL 2 HOUR и ORDER_ID IS NULL.
Уведомление о смене статуса заказа. Обработчик OnSaleOrderStatusUpdate:
AddEventHandler("sale", "OnSaleOrderStatusUpdate", function($orderId, $arFields) { if ($arFields['STATUS_ID'] === 'D') { // Delivered $userId = CSaleOrder::GetByID($orderId)['USER_ID']; sendPushToUser($userId, 'Заказ доставлен', 'Ваш заказ #' . $orderId . ' ожидает вас'); } }); Массовые рассылки. Выбираете всех подписчиков из b_local_push_subscription, отправляете батчами по 100 через webPush->queueNotification() + flush(). Большие рассылки — через агент с постраничной обработкой, чтобы не исчерпать лимит времени выполнения скрипта.
Как обрабатывать протухшие подписки?
Протухшие подписки (endpoint вернул 404 или 410) удаляйте сразу — они накапливаются быстро и замедляют рассылки. Рекомендуется добавить агент для периодической очистки: например, раз в сутки проверять все подписки и удалять те, которые не обновлялись более 30 дней. Это снижает нагрузку на базу данных и повышает доставляемость.
Поддержка браузеров
| Браузер | Минимальная версия | Особенности |
|---|---|---|
| Chrome | 42 | Полная поддержка |
| Firefox | 44 | Полная поддержка |
| Safari | 16.4 | Требуется macOS 13+ |
| Edge | 17 | Полная поддержка |
| Opera | 29 | Полная поддержка |
Что входит в настройку web-push уведомлений под ключ
- Установка и настройка VAPID-ключей
- Регистрация Service Worker на корне сайта
- Создание таблицы подписок и скрипта сохранения
- Интеграция с событиями: брошенные корзины, смена статуса заказа, массовые рассылки
- Обработка протухших подписок (агент очистки)
- Тестирование на всех поддерживаемых браузерах
- Документация по расширению функционала
- Анализ текущей схемы уведомлений клиента и рекомендации
Свяжитесь с нами для консультации — оценим ваш проект и предложим оптимальное решение. Закажите настройку web-push уведомлений под ключ и получите рабочий прототип уже через 3–5 дней. Для оперативного тестирования push-уведомлений на вашем сайте обращайтесь к нашим инженерам.







