Перейти до основного вмісту
megapromotingПоговорімо

Рішення · Онлайн-торгівля

Асистент, який читає ціну й доступність у вашому магазині в ту ж секунду, коли клієнт запитує.

Ми під’єднуємо асистента до каталогу магазину через його публічний портал, запускаємо його на каналах, де клієнти вже пишуть, і даємо йому правило, яке він не може порушити: не називати ціну, якої немає в магазині. Коли він виходить за межі ролі, він передає розмову людині, з фіксацією.

Вже збудованоSe poate verifica din exterior, fără să ne întrebi pe noi. Punctul nostru de catalog livrat unui distribuitor răspunde 200 și spune „154 rezultate”, iar interfața publică a magazinului lui, interogată direct, întoarce antetul `x-wp-total: 154` — aceeași cifră, două surse independente, 06.09.2026. A doua implementare e funcția de catalog din platforma de asistenți: `storeCatalog.service.js` plus trei unelte încorporate pe care agentul le poate chema în timpul conversației. Rezerva pe care o spunem înainte de contract: mesajele din șablon WhatsApp nu există în codul platformei, deci nu promitem niciun mesaj proactiv în afara ferestrei de 24 de ore; iar traseul de catalog stă pe o ramură de dezvoltare care nu e unificată în trunchi — e livrat pentru magazinele pe care le-am conectat, nu pornit implicit pentru toți.

Асистент магазину не ламається через те, що не розуміє запит. Він ламається через те, що відповідає з копії каталогу. Хтось одного разу експортував товари, вставив їх у файл, і відтоді асистент читає стару фотографію магазину: ціну з тритижневої давнини, запас до вихідних. Працює ідеально аж до першої зміни ціни та до першого розпроданого товару — і тоді помиляється впевнено, а це гірше, ніж мовчати. У торгівлі це не помилка нюансу: клієнт приходить у магазин із ціною, яку йому сказав бот.

Наш вибір простий і має наслідки: каталог не копіюється, а читається. Для магазинів на WooCommerce інтерфейс Store API є публічним — отже, під’єднання відбувається за адресою сайту, без ключа споживача й без секрету. Коли клієнт запитує про товар, агент викликає інструмент, інструмент запитує магазин, магазин відповідає актуальною ціною та доступністю. Те, що з’являється в розмові, — це те, що є в магазині, а не те, що було під час інтеграції.

Вартість цього вибору видно в коді, а не сховано: каталог завантажується пагіновано, до тридцяти сторінок по сто товарів, зберігається в тимчасовій пам’яті на десять хвилин на сайт і нормалізується в одну форму, без змін читану всіма споживачами — включно з каруселлю товарів у месенджері, якій потрібна числова ціна, і віджетом на сторінці. Десять хвилин — це компроміс: зміна ціни, зроблена зараз, буде видна максимум за десять хвилин, не миттєво. Ми називаємо цифру, щоб ви могли її оскаржити.

Інші обмеження не від нас, а від каналів, і чесніше знати їх заздалегідь: Meta відмовляє у вільному тексті поза 24-годинним вікном від останнього повідомлення клієнта, в Instagram взагалі немає каруселей товарів, а фото, надіслане клієнтом, позначається в розмові, а не прикріплюється автоматично до замовлення. Кожне з цих речень нижче процитовано з файлом і рядком.

Що входить

Що конкретно змінюється в онлайн-торгівлі

Запит стає пошуком у вашому каталозі, а не вгадуванням

Агент має три вбудовані інструменти поверх спільного сервісу каталогу: `store_catalog_search` для пошуку, `store_catalog_match` для зіставлення формулювання клієнта з конкретним товаром, `store_catalog_product` для повної картки. Це не окремо написані інструменти для кожного магазину — це функція платформи. Практична різниця: коли ми виправляємо щось у зіставленні, це виправляється для всіх під’єднаних магазинів одразу.

Ціна й запас читаються з магазину в момент запиту

Результат інструменту надходить із вашого магазину, а не з файлу від нас. Тимчасова пам’ять — десять хвилин на сайт, а каталог переглядається пагіновано — до 30 сторінок по 100 товарів. Наслідок, який ви маєте прийняти: зміна ціни з’являється в розмові з затримкою максимум десять хвилин. Наслідок, який ви отримуєте: немає сценарію, у якому агент місяцями повторює ціну, прибрану з магазину.

Відповідь виходить у каналі, з якого написав клієнт

Шість каналів мають власний код у платформі: Messenger, Instagram Direct, Telegram, віджет на сторінці, локальна платформа оголошень і WhatsApp через Cloud API на Graph v22.0. Це не один «чат», перейменований шість разів: кожен канал має власні правила формату і власні способи падіння, а ми перевіряємо й неприємний випадок — прострочений page token мовчки зупиняє канал, якщо його не моніторити.

Під’єднання магазину на WooCommerce відбувається за його адресою, без ключів

Store API є публічним, тож ми не просимо `consumer_key` і `consumer_secret`. Це не зручність, а рішення щодо ризику: деякі з інструментів, написаних вручну, які замінив цей шлях, містили ключі магазину, записані відкритим текстом у базі даних. Новий шлях замінив 109 інструментів, написаних вручну, з яких 28 були скрейперами поверх HTML — тобто інтеграціями, що ламалися при першій зміні теми магазину.

Карусель товарів має умови, і вони різняться від каналу до каналу

У Messenger карусель показується лише тоді, коли одночасно виконано три умови; якщо однієї бракує, відповідь лишається текстом, а не ламається. В Instagram каруселі товарів немає — Meta не має загальних шаблонів в Instagram, тож ніхто не може доставити це там, незалежно від того, що написано в оферті. Це той тип речення, який ми воліємо, щоб ви почули від нас до контракту.

Вікно 24 години у WhatsApp, назване номером помилки

Поза вікном 24 години від останнього повідомлення клієнта Meta відхиляє вільний текст з помилкою 131047, а повідомлення залишається позначеним як невдале на платформі. Повідомлення шаблону — єдиний законний спосіб написати першим після вікна — у коді платформи немає: пошук за типом `template` повертає нуль результатів, надсилається лише тип `text`. Отже: відновлення покинутого кошика у WhatsApp через 48 годин ми сьогодні вам не можемо обіцяти.

Серії повідомлень і дублікати повідомлень обробляються, а не ігноруються

Webhook Meta справді надсилає те саме повідомлення повторно: дублювання робиться за ідентифікатором повідомлення, з пам’яттю на 120 секунд. А клієнт, який пише «добрий день», «у вас є», «чорна модель» у три рядки, отримує одну відповідь на все, що написав, а не три часткові відповіді — повідомлення збираються в буфер на 15 секунд. У торгівлі це важить більше, ніж здається: три часткові відповіді на один намір виглядають точно як робот.

Передача людині має стан, це не обіцянка

Гілка діалогу має явний стан `bot` або `human`. Журнал передачі знає три дії: передача людині, повернення до bot, автоматична реактивація. Окремо гілка має стан дотримання часу відповіді — `ok`, `warning`, `breached` — тож видно, яка розмова залишилася без людської відповіді, а не лише скільки їх було.

Що не вирішує асистент магазину

Не приймає платіж. Не створює замовлення в магазині, якщо в магазину немає шляху запису — читання є публічним, запис — ні. Не додає фото, надіслане клієнтом, до замовлення: отримана фотографія позначається в розмові, і все, а генерації PDF у платформі немає. І не повторює попереднє замовлення клієнта без авторизованого доступу до його історії. Кожну з цих речей можна побудувати, але як окрему роботу, а не як галочку в пропозиції.

Traseul

Як запит проходить через систему.

01

Спочатку перевіряємо, який публічний вхід має ваш магазин

Перша перевірка, не остання: запитуємо каталог ззовні й рахуємо, що повертається. Якщо магазин на WooCommerce з активним Store API, інтеграція не потребує ключів. Якщо ні, переходимо до автентифікації — і тоді ключ стає елементом, який адмініструється, з усім, що це означає. Результат цієї перевірки ми надаємо письмово, зокрема й тоді, коли відповідь — що це неможливо.

02

Підключаємо каталог і канали, з протестованим поганим випадком

Підключення Meta здійснюється через Embedded Signup. Для кожного каналу перевіряємо не лише перше успішне повідомлення, а й що відбувається, коли token закінчується або коли магазин не відповідає. Ми надаємо підключені канали й письмовий список поведінки для кожного режиму збою.

03

Пишемо роль, інструменти та межу

Кожен інструмент має письмовий опис для моделі, типізовані параметри та власний час виконання — за замовчуванням 15 секунд. Роль агента прямо каже, що він не має права стверджувати: непубліковану ціну, строк доставки, доступність, яку він не прочитав. Ми надаємо конфігурацію агента та список інструментів, приєднаних до нього — не всі інструменти платформи, лише ті, які йому потрібні.

04

Запускаємо з активною передачею людині й налаштовуємо пороги

Запускаємо з налаштованою передачею людині та ввімкненим журналом запитів, щоб було видно, які фрагменти використав агент і з якими оцінками. Далі налаштовується поріг схожості та кількість фрагментів на запитання. Ми надаємо звіт про розмови з рішеннями щодо налаштувань, а не лише запущеного асистента.

1Întrebarea clientului2unealta de catalog3interfața publică amagazinului4preț șidisponibilitate deacum5răspuns pe canalul pecare a scrisMemorie temporară: zece minute. Nicio copie a catalogului la noi.
Traseul, în 5 pași

Дані

Чого торкаємося, де воно лежить і скільки лишається

Правила відрізняються від галузі до галузі. Це ті, що застосовуються в онлайн-торгівлі.

Каталог не копіюється до нас
Товари, ціни та запас залишаються у вас. Через платформу проходить відповідь на запитання, яка зберігається в тимчасовій пам’яті десять хвилин. У нас немає бази з вашим каталогом, яку хтось міг би експортувати, бо немає чого експортувати.
Де зберігаються розмови
MySQL, на власному сервері в Microsoft Azure. Схема має понад 80 таблиць, змодельованих у Prisma, з окремими таблицями для Meta-тредів, Telegram-тредів, тредів із платформи оголошень, коментарів, етикеток, внутрішніх нотаток і журналу аудиту. Токен каналу зберігається в зашифрованому вигляді Fernet.
Дані замовлення вводяться у вільне поле
У розмові магазину потрапляють ім’я, телефон, адреса доставки і, іноді, розмір або медична проблема, через яку клієнт купує продукт. Технічно це не можна зупинити. Це можна обробити: визначається, що зберігається, як довго, хто має доступ і що команда навчена не запитувати в каналі. Реєстр обробок впровадження складається під час впровадження, а не після.
Віджет на сторінці та список джерел
Віджет має список дозволених джерел для кожного асистента, але потрібно знати поведінку за замовчуванням: якщо список порожній, перевірка проходить. Це вибір сумісності зі старими інсталяціями, записаний у коді саме так. Практично, обмеження за доменом вашого магазину налаштовується явно під час кожного впровадження — воно не вмикається готовим.
Строк зберігання
Це визначається для кожного впровадження і записується у вашу опубліковану політику. Правило, яке ми застосовуємо у себе і вимагаємо також у проєктах: якщо зміна коду змінює те, що збирається, кому воно надходить або як довго зберігається, опублікована політика змінюється в тому самому коміті.

Випадок

Каталог із 154 продуктів, перевірений з двох сторін

Ситуація

Дистриб’ютор із Кишинева продавав через магазин WooCommerce і відповідав на запитання про продукти в месенджер-каналах. Очевидна інтеграція — експорт продуктів, доданий у базу знань агента — спрацювала б до першої кампанії знижок.

Що ми збудували

Ми підключили каталог через публічний інтерфейс магазину, який не потребує ключів, і додали поверх нього три інструменти, які агент викликає в розмові: пошук, зіставлення та картку продукту. Результати нормалізуються в єдину форму, яку однаково читають карусель у месенджері та віджет на сторінці, щоб не було двох правд про одну й ту саму ціну.

Що вийшло

Перевірку можна зробити ззовні, не вірячи нам на слово: наша точка каталогу відповідає 200 і повідомляє 154 результати, а публічний інтерфейс магазину, запитаний напряму, повертає заголовок `x-wp-total: 154`. Та сама цифра, два незалежні джерела, в один і той самий день.

Чого цей випадок не каже

Цифра належить тому дню, 06.09.2026, і змінюється, коли дистриб’ютор додає продукти — у цьому й суть. Це не показник продуктивності і не говорить нічого про продажі; воно лише показує, що агент читає реальний каталог.

Питання

Що запитує хтось з онлайн-торгівлі

Звідки я знаю, що він не назве стару ціну?

Бо він не має звідки її взяти. Ціна надходить із відповіді вашого магазину на момент запиту, збереженої в тимчасовій пам’яті максимум десять хвилин. У нас немає копії каталогу, з якої б він читав. Перевірити це можете самі: питаєте агента про продукт, змінюєте ціну в магазині, чекаєте десять хвилин і питаєте знову.

Що він відповідає, коли продукт розпродано?

Те, що каже магазин. Доступність надходить із тієї самої відповіді, що й ціна. Чого він не робить — і це рішення, а не недогляд — це не вигадує дату поповнення. Якщо ви хочете, щоб агент пропонував альтернативи, коли продукту немає, це правило, яке ми явно записуємо в його роль і тестуємо, а не щось, що відбувається само собою.

Чи може він завершити замовлення?

Не з читання каталогу. Store API публічне — це шлюз для читання; запис замовлення вимагає автентифікованого шляху до магазину, отже, це окрема робота з ключами, які потрібно адмініструвати. Що робить сьогодні: веде клієнта до правильного продукту, з правильною ціною, і дає йому посилання або передає розмову людині.

Чи може він першим написати клієнту, який покинув кошик?

У WhatsApp — ні, поза вікном 24 години. Meta відхиляє вільний текст із помилкою 131047, а шаблонні повідомлення не існують у коді платформи. У Telegram і Messenger, в межах правил кожного каналу, є заплановані автоматизації, які відновлюють розмови, що залишилися без відповіді, з видимими лічильниками того, скільки було надіслано і скільки було пропущено.

Працює з каруселлю продуктів в Instagram?

Ні. У Meta немає загальних шаблонів в Instagram, тож каруселі там немає ні для кого. У Messenger вона є, але вимагає одночасно три умови; коли однієї бракує, відповідь залишається текстом. Ми краще скажемо це зараз, а не на третій тиждень впровадження.

Мій магазин не на WooCommerce. Що змінюється?

Змінюється перший етап: замість того, щоб підключати адресу, ми перевіряємо, який публічний інтерфейс має ваша платформа і чи відповідає вона достатньо швидко для розмови. Якщо жодного немає, або ми пишемо автентифікований конектор — і тоді обговорюємо, хто адмініструє ключ — або кажемо, що чесно не можна зробити живий каталог і залишаємося на періодично оновлюваній базі знань, позначеній як такій.

Клієнт надсилає фото продукту, який хоче. Що відбувається?

Фотографія позначається в розмові й залишається там для людини, яка приймає. Вона не додається автоматично до замовлення і з неї не генерується жоден документ — для цього немає коду. Агент, який би стверджував, що зареєстрував замовлення з фото, збрехав би, а це виявляється під час доставки.

Що відбувається, коли клієнт пише чотири повідомлення одне за одним?

Він отримує одну відповідь на все, що написав. Повідомлення збираються в буфері 15 секунд перед тим, як їх надіслати моделі. Окремо, якщо платформа Meta повторно надсилає те саме повідомлення — а вона це робить — дедублювання за ідентифікатором повідомлення з пам’яттю 120 секунд запобігає другій відповіді.

Хто відповідає, коли агент не знає?

Людина з вашої команди, і передача видно в системі: нитка переходить зі стану `bot` у `human`, журнал прийому зазначає хто і коли, а стан дотримання часу відповіді показує, чи нитка залишилася висіти. Без цього механізму «передає оператору» — це обіцянка, яку ніхто не може перевірити через кілька місяців.

Що вам хотілося б налагодити?

Розкажіть про свій процес. Разом визначимо, що варто збудувати, що можна підключити і як перевіримо результат.

Поговорімо