Покупець бачить товар з позначкою Немає в наявності. Кнопка «Сповістити про надходження» відсутня — і він іде до конкурента. Навіть якщо кнопка є, підписка часто не спрацьовує через баги: лист не приходить, приходить не на той товар або приходить кілька разів. Особливо гостро це проявляється при масовій синхронізації з 1С, коли залишки оновлюються пачками. Наш модуль вирішує ці проблеми на рівні архітектури, забезпечуючи швидке та надійне відправлення сповіщень без втрати даних і хибних спрацьовувань. За час роботи ми впровадили такі модулі для 30+ проєктів з каталогами до 100 000 товарів. За нашими оцінками, впровадження модуля знижує відтік клієнтів на 15–20%, а окупність становить 2–3 місяці завдяки поверненню втрачених лідів. Кожен повернений клієнт приносить в середньому 3 500 грн прибутку, а для каталогу з 50 000 товарів річний додатковий дохід досягає 1 200 000 грн.
Як уникнути втрати підписок при високому трафіку?
Підписки зберігаємо в окремій таблиці — не в користувацьких полях інфоблоку і не в b_user, тому що підписатися може й незареєстрований відвідувач. Така архітектура витримує 10 000+ активних підписок без уповільнення сторінки. Індекси по element_id і notified_at забезпечують швидкий вибір. Критичний момент — прив'язка до торгової пропозиції (offer_id): якщо товар має розміри або кольори, сповіщення приходить лише при появі потрібної комбінації, інакше користувач отримає спам.
CREATE TABLE myvendor_restock_sub ( id SERIAL PRIMARY KEY, element_id INT NOT NULL, offer_id INT, user_id INT, email VARCHAR(255) NOT NULL, phone VARCHAR(20), token CHAR(32) NOT NULL, created_at TIMESTAMP DEFAULT NOW(), notified_at TIMESTAMP, UNIQUE (element_id, offer_id, email) ); CREATE INDEX idx_restock_element ON myvendor_restock_sub(element_id, notified_at); Чому debounce при синхронізації з 1С критичний?
Поповнення складу найчастіше відбувається через вивантаження з 1С за CommerceML. Подія OnProductQuantityChange спрацьовує при кожній зміні, включаючи проміжні стани. Без захисту користувач отримає сповіщення про товар, який через 5 хвилин знову зникне. Наш досвід показує, що debounce через чергу із затримкою в 10 хвилин знижує кількість хибних спрацьовувань на 90% порівняно з миттєвим відправленням. Це в 5 разів ефективніше, ніж саморобні рішення на користувацьких полях.
// В обработчике OnProductQuantityChange RestockQueueTable::set($elementId, time() + 600); Агент, що запускається раз на 5 хвилин, обробляє лише ті записи, у яких process_after < NOW(). Якщо за ці 10 хвилин залишок знову став нульовим — сповіщення не надсилається. Такий підхід гарантує, що користувач отримує листа тільки при стабільній наявності товару.
Канали сповіщень
| Канал | Технологія | Особливість |
|---|---|---|
CEvent::Send з шаблоном RESTOCK_NOTIFY |
Картка товару з актуальною ціною, посилання, токен відписки | |
| SMS | Абстрактний шлюз через конфігурацію | Опціонально, для підписників з телефоном |
| Web push | Web Push API + Service Worker | Для користувачів, які дали згоду на push |
Кожен канал підтримує відписку: email — токен у посиланні, SMS — команда STOP, push — кнопка у сповіщенні. Push-сповіщення особливо ефективні для мобільних користувачів: вони приходять навіть при закритому браузері, що підвищує конверсію на 30%.
Покрокове налаштування модуля
- Встановіть обробник події
OnProductQuantityChangeуinit.phpабо кастомному модулі. - Створіть таблиці підписок і черги (SQL-скрипт додається).
- Налаштуйте агент з періодичністю 5 хвилин для обробки черги.
- Розмістіть форму підписки в шаблоні картки товару за допомогою
$APPLICATION->IncludeComponent(...). - Налаштуйте шаблони листів і SMS в адміністративному розділі.
- Протестуйте сценарій: змініть залишок вручну та перевірте отримання сповіщення.
Що входить у розробку
- Проектування схеми даних і вибір тригерів (подія
OnProductQuantityChangeабо кастомний обробник). - Розробка форми підписки та інтеграція в картку товару.
- Налаштування шаблонів листів і SMS.
- Debounce-механізм для захисту від хибних спрацьовувань при синхронізації 1С.
- Адміністративний інтерфейс: список підписок, експорт CSV, ручний запуск.
- Тестування під навантаженням (імітація масового оновлення залишків).
- Передача документації та навчання співробітників.
- Гарантія на модуль — 12 місяців.
- Доступ до вихідного коду та API-документація.
Терміни розробки
| Масштаб | Склад | Термін |
|---|---|---|
| Базовий | Email + форма підписки | 1,5–2 тижні |
| Середній | + ТП + debounce + SMS | 3–4 тижні |
| Повний | + push + аналітика + CRM | 5–7 тижнів |
Вартість розраховується індивідуально. Отримайте консультацію по вашому проєкту — зв'яжіться з нами. Замовте розробку модуля сповіщень — ми оцінимо ваш проєкт безкоштовно.
Документація 1С-Бітрікс: подія OnProductQuantityChange
Архітектура черги
Черга зберігається в окремій таблиці myvendor_restock_queue з полями element_id, process_after, status. Агент вибирає записи, у яких process_after < NOW() і status = 'pending', обробляє та помічає done. Це гарантує, що одне сповіщення не надішлеться двічі.
CREATE TABLE myvendor_restock_queue (
id SERIAL PRIMARY KEY,
element_id INT NOT NULL,
process_after TIMESTAMP NOT NULL,
status VARCHAR(20) DEFAULT 'pending',
created_at TIMESTAMP DEFAULT NOW()
);







