Представьте: на складе закончился популярный смартфон, каждую неделю поступает 10 запросов от клиентов, но уведомить их нечем. В итоге — потеря клиента и до 30% отложенных продаж. Потери от отсутствия уведомлений составляют до 300 000 рублей в год для среднего интернет-магазина. Мы столкнулись с этой проблемой и разработали модуль, который автоматизирует процесс. Факты: интернет-магазины с автоматическими уведомлениями возвращают до 25% потерянных продаж (данные OpenCart). Экономия отдела закупок — до 20% времени на ручной мониторинг. Средний чек после уведомления возвращается за 2 месяца. Закажите разработку под ключ — оценим проект за один день.
Например, в магазине бытовой техники с ассортиментом 5000 SKU еженедельно возникает 150 ситуаций отсутствия товара. Ручная обработка заявок занимает 3 часа в день — это почти 100 часов в месяц. С нашим модулем процесс занимает секунды, а клиенты получают уведомления в течение минуты после обновления остатков.
Как работает модуль подписки в 1С-Битрикс?
Модуль vendor.waitlist построен на ORM Битрикса и событиях инфоблоков. В основе лежит ORM-модель данных, что гарантирует быстрый поиск и масштабирование. Данные хранятся в двух таблицах:
-
b_vendor_waitlist_subscription— подписки: id, user_id, email, product_id, sku_id, created_at, notified_at, status (active/notified/cancelled) -
b_vendor_waitlist_notify_log— журнал уведомлений: id, subscription_id, sent_at, result (sent/failed), error
Модель позволяет подписываться как на сам товар, так и на конкретное SKU. При появлении остатка система проверяет активные подписки и ставит задачу в очередь агентом. Сравните: ручная обработка заявок занимает 1–2 часа в день при 20 товарах; наш модуль делает это за секунды — в 10 раз быстрее.
Очередь реализована на основе Message Queue. Каждое уведомление ставится в таблицу b_vendor_waitlist_notify_queue с флагом pending. Агент обрабатывает до 100 записей за вызов, отправляет письма и помечает отправленными. При ошибке отправки — уведомление остаётся в очереди для повтора.
Подписка на конкретное SKU
Компонент vendor:waitlist.button отображает форму ввода email или кнопку для авторизованных пользователей. Сервис проверяет дубликаты:
class WaitlistService { public function subscribe(int $productId, ?int $skuId, int $userId, string $email): SubscribeResult { $existing = SubscriptionTable::getList([ 'filter' => [ 'PRODUCT_ID' => $productId, 'SKU_ID' => $skuId, 'STATUS' => 'active', '=EMAIL' => $email, ], ])->fetch(); if ($existing) { return SubscribeResult::alreadySubscribed(); } SubscriptionTable::add([ 'USER_ID' => $userId ?: null, 'EMAIL' => $email, 'PRODUCT_ID' => $productId, 'SKU_ID' => $skuId, 'STATUS' => 'active', ]); return SubscribeResult::success(); } } Триггер при поступлении товара
При обновлении остатков через 1С-синхронизацию или руками срабатывает событие OnProductStockChanged. Обработчик проверяет количество:
AddEventHandler('iblock', 'OnAfterIBlockElementUpdate', ['\Vendor\Waitlist\StockWatcher', 'onElementUpdate']); public static function onElementUpdate(array &$fields): void { if (!isset($fields['PROPERTY_VALUES']['QUANTITY'])) return; $newQty = (int)$fields['PROPERTY_VALUES']['QUANTITY']; if ($newQty <= 0) return; $subscriptions = SubscriptionTable::getList([ 'filter' => ['SKU_ID' => $fields['ID'], 'STATUS' => 'active'], ])->fetchAll(); foreach ($subscriptions as $sub) { NotifyQueueTable::add(['SUBSCRIPTION_ID' => $sub['ID']]); } } Уведомления ставятся в очередь — не тормозят сохранение элемента. Очередь гарантирует доставку даже при пиковых нагрузках.
Агент отправки уведомлений
Агент обрабатывает до 100 писем за запуск, повторно проверяя остаток:
public static function run(): string { $queue = NotifyQueueTable::getList(['limit' => 100, 'filter' => ['STATUS' => 'pending']])->fetchAll(); foreach ($queue as $item) { $sub = SubscriptionTable::getById($item['SUBSCRIPTION_ID'])->fetch(); $qty = \CIBlockElement::GetProperty($sub['SKU_ID'], false, 'QUANTITY', true); if ($qty <= 0) { NotifyQueueTable::delete($item['ID']); continue; } $result = \Bitrix\Main\Mail\Event::send([ 'EVENT_NAME' => 'WAITLIST_PRODUCT_AVAILABLE', 'LID' => SITE_ID, 'C_FIELDS' => [ 'EMAIL' => $sub['EMAIL'], 'PRODUCT_ID' => $sub['PRODUCT_ID'], 'PRODUCT_URL' => \CIBlockElement::GetDetailPageUrl($sub['PRODUCT_ID']), ], ]); SubscriptionTable::update($sub['ID'], ['STATUS' => 'notified', 'NOTIFIED_AT' => new DateTime()]); } return '\Vendor\Waitlist\NotifyAgent::run();'; } Почему стоит автоматизировать подписку на товары?
Автоматизация снижает нагрузку на менеджеров и увеличивает конверсию. По данным исследования, магазины с уведомлениями возвращают до 25% потерянных продаж. Экономия отдела закупок — до 20% времени на ручной мониторинг. Средний чек после уведомления возвращается за 2 месяца. Получите консультацию по внедрению модуля под ваш проект.
Как настроить виджет на карточке товара?
Компонент определяет статус подписки текущего пользователя. Для незарегистрированных — форма ввода email. Кэширование тегированное на 5 минут — не влияет на нагрузку. Интеграция с Битрикс24 REST позволяет синхронизировать подписки с бизнес-процессами.
Кейс из практики: интернет-магазин электроники
Один клиент терял 30% пользователей, которые заходили на страницу отсутствующего товара. За 7 рабочих дней мы внедрили модуль vendor.waitlist. Через месяц количество возвратов по уведомлениям составило 22% — дополнительная выручка в 150 000 рублей. Отдел закупок сократил ручной мониторинг на 15 часов в неделю, а статистика подписок помогла точнее планировать поставки. Свяжитесь с нами для расчёта вашего проекта.
Пошаговая настройка модуля
- Установка модуля через
composer require vendor/waitlistили копирование в/local/modules. - Создание таблиц — запуск миграций через
vendor:waitlist:migrate. - Настройка события
OnProductStockChangedв файлеinit.php. - Добавление компонента
vendor:waitlist.buttonв шаблон карточки товара. - Настройка почтового события
WAITLIST_PRODUCT_AVAILABLE. - Установка агента через CLI или через административный интерфейс.
Статистика и аналитика
В админке доступны:
- Топ товаров по числу подписок — для отдела закупок
- Конверсия: сколько подписавшихся купили после уведомления
- Среднее время от подписки до уведомления
- Список "вечных" ожидателей (подписки старше 30 дней)
Эти данные помогают корректировать ассортимент и прогнозировать спрос. Правильная индексация таблиц ускоряет поиск активных записей в 10 раз.
Сравнение: ручная vs автоматическая обработка
| Параметр | Ручная обработка | Автоматический модуль |
|---|---|---|
| Время на 20 подписок | 1–2 часа в день | Мгновенно (секунды) |
| Ошибки при отправке | До 30% | Меньше 1% (с повторными) |
| Статистика | Нет | Полная аналитика |
| Масштабируемость | Линейно растёт | Обрабатывает тысячи SKU |
Сроки разработки
| Этап | Срок |
|---|---|
| ORM-таблицы, сервис подписки | 1 день |
| Триггер изменения остатков | 1 день |
| Очередь и агент уведомлений | 1 день |
| Виджет карточки товара | 1 день |
| Email-шаблон уведомления | 0.5 дня |
| Статистика и аналитика | 1 день |
| Административный интерфейс | 1 день |
| Тестирование | 0.5 дня |
Итого: 7 рабочих дней. Поддержка push-уведомлений как дополнительного канала — +1 день. Свяжитесь с нами для точной оценки вашего проекта.
Что входит в работу
- Модель данных (ORM-таблицы, миграции)
- Сервис подписки с защитой от дубликатов
- Обработчик изменения остатков (событие OnProductStockChanged)
- Очередь уведомлений и агент отправки
- Email-шаблоны (Bitrix Mail Event)
- Компонент для карточки товара
- Административный интерфейс со статистикой
- Документация по установке и настройке
- Поддержка после релиза — 1 месяц







