Уявіть: на складі закінчився популярний смартфон, щотижня надходить 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 місяць







