Установка виджета на сайт
Один тег с ID проекта в адресе — и чат на любой странице. Ниже — необязательные data-атрибуты и JS-API для идентификации и управления.
Установка за 4 шага
- 1Возьмите кодВ дашборде откройте НастройкиКонструктор виджета — кнопка «Код для вставки» внизу левой панели открывает готовый код с ID вашего проекта. Тот же код есть в НастройкиКаналы, в карточке Web Widget. ID проекта — это UUID в параметре
?ws=. - 2Вставьте код перед </body>На каждой странице, где должен быть чат:По умолчанию код подключает виджет в анонимном режиме — никакого бэкенда у вас не требуется. Если хотите узнавать посетителя на разных устройствах (iPhone и MacBook → один контакт) — раскомментируйте блокindex.htmlhtml
<script> (function(w, d){ function loadWidget(token){ var s = d.createElement('script'); s.async = 1; s.src = 'https://support.forestsnet.com/widget-bundle?ws=00000000-0000-0000-0000-000000000000'; if (token) s.setAttribute('data-visitor-token', token); d.head.appendChild(s); } // ── Optional: cross-device HMAC visitor token ───────────────── // Uncomment + implement /api/supporthub/token on your backend to // bind the same visitor across devices. Recipes per stack: // https://support.forestsnet.com/docs/widget/hmac-examples // // fetch('/api/supporthub/token', { credentials: 'include' }) // .then(function(r){ return r.ok ? r.json() : null; }) // .then(function(data){ loadWidget(data && data.token); }) // .catch(function(){ loadWidget(); }); // // Default — anonymous (no token): loadWidget(); })(window, document); </script>fetch('/api/supporthub/token')и реализуйте endpoint у себя по одному из шаблонов; код сам передаст токен в атрибутdata-visitor-token. Скрипт добавляется черезdocument.createElement('script')сasync=1и не блокирует отрисовку страницы. Обязательный параметр один —?ws=; адрес API виджет знает сам. Полный референс HMAC — /docs/widget/hmac, идентификация целиком — /docs/widget/identify. - 3Проверьте, что кнопка появиласьОткройте сайт в режиме инкогнито. В правом нижнем углу должна появиться кнопка виджета — по умолчанию с иконкой чата и текстом. Если её нет или что-то не работает, посмотрите в консоль браузера. Частые причины:
- Опечатка в
?ws=— кнопка всё равно появится, но с оформлением по умолчанию, и сообщения не будут доходить. - CSP сайта: нужны
support.forestsnet.comвscript-src,https://api.support.forestsnet.comиwss://api.support.forestsnet.comвconnect-src,api.support.forestsnet.comиdata:вimg-src. Стили виджет добавляет тегом<style>, поэтомуstyle-srcдолжен разрешать inline-стили. - Блокировщик рекламы или расширение, которое режет сторонние скрипты.
- Опечатка в
- 4Откройте чат и отправьте тестовое сообщениеНажмите кнопку → откроется панель → нажмите «Задать вопрос» → отправьте «привет». В дашборде во «Входящих» сразу появится новое обращение — значит, код подключён правильно.
Что делает тег
При загрузке /widget-bundle?ws=…:
- Читает
?ws=из адреса скрипта и необязательныеdata-*-атрибуты тега. Опубликованный конфиг и адрес API сервер обычно вставляет прямо в начало бандла, так что отдельного запроса за/configнет; если не вышло, виджет запросит конфиг сам. - Применяет тему, цвета и свой CSS, добавляет на страницу кнопку и панель.
- Находит или создаёт ID посетителя — он хранится в пяти местах (cookie, localStorage, sessionStorage, IndexedDB и старый общий ключ); подробности — в справочнике для разработчиков.
- Если заданы
data-email/name/phone/telegram-id, отправляетPOST /api/webhooks/widget/{ws}/identify— контакт создаётся или обновляется сразу, ещё до первого сообщения. - Когда у посетителя есть обращение, подключает WebSocket
/api/ws/widget/{visitor_id}?workspace_id={ws}для ответов в реальном времени.
Параметры тега
SupportHub.init().NEXT_PUBLIC_API_URL..example.com), — чтобы у посетителя была одна переписка на всех поддоменах. То же самое задаётся в Конструктор виджетаРасширенныеCookie-домен (опционально); атрибут на теге важнее конфига.ru или en (теги вида en-GB тоже подходят, берутся первые две буквы). Полезно, если у сайта несколько языковых версий: на каждой ставите свой data-locale. Заданный так язык действует всегда. Без атрибута виджет берёт <html lang="…"> страницы, потом язык браузера — каждый, только если тексты проекта есть на этом языке, — а иначе основной язык проекта. Неподдерживаемые значения (fr, xx) пропускаются. Если в Конструктор виджетаБрендингЯзык виджета выбран «Всегда русский» или «Всегда английский», атрибут не действует (подробнее — на странице «Бренд и шапка»). Программный аналог — SupportHub.init({ locale: "en" }).identify вместе с остальными data-*. Пошаговая pre-chat форма (стиль по умолчанию) уже известные поля не спрашивает."true" скрывает кнопку-лончер. Виджет тогда открывается только программно — вызовите window.SupportHub.open() со своей кнопки или ссылки. Действует при автозапуске по ?ws=; при ручной инициализации используйте SupportHub.init({ hideLauncher: true }).| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
| ?ws= (query) | uuid | — | Обязательный. UUID проекта в адресе скрипта. Без него виджет сам не запустится — только через SupportHub.init(). |
| data-api-base | string | — | Свой адрес API. Обычно не нужен и не срабатывает: сервер, который отдаёт бандл, сам прописывает адрес API в его начало, и тогда атрибут игнорируется. Нужен, только если бандл отдаётся без этого — например, из своей сборки без NEXT_PUBLIC_API_URL. |
| data-cookie-domain | string | — | Домен cookie с ID посетителя, с точкой в начале (.example.com), — чтобы у посетителя была одна переписка на всех поддоменах. То же самое задаётся в Конструктор виджетаРасширенныеCookie-домен (опционально); атрибут на теге важнее конфига. |
| data-locale | string (BCP-47) | — | Язык виджета — ru или en (теги вида en-GB тоже подходят, берутся первые две буквы). Полезно, если у сайта несколько языковых версий: на каждой ставите свой data-locale. Заданный так язык действует всегда. Без атрибута виджет берёт <html lang="…"> страницы, потом язык браузера — каждый, только если тексты проекта есть на этом языке, — а иначе основной язык проекта. Неподдерживаемые значения (fr, xx) пропускаются. Если в Конструктор виджетаБрендингЯзык виджета выбран «Всегда русский» или «Всегда английский», атрибут не действует (подробнее — на странице «Бренд и шапка»). Программный аналог — SupportHub.init({ locale: "en" }). |
| data-email | string | — | Email посетителя. Уходит в identify вместе с остальными data-*. Пошаговая pre-chat форма (стиль по умолчанию) уже известные поля не спрашивает. |
| data-name | string | — | Имя посетителя. Заменяет только временное имя вроде «Гость». |
| data-phone | string | — | Телефон (рекомендуется E.164). Записывается, если у контакта телефона ещё нет. |
| data-telegram-id | int | — | Telegram ID посетителя. Записывается, если у контакта его ещё нет. |
| data-visitor-token | string | — | HMAC-токен посетителя, который выдаёт ваш бэкенд (см. /docs/widget/hmac). С ним обращения с разных устройств попадают в один контакт. |
| data-hide-launcher | boolean | false | Значение "true" скрывает кнопку-лончер. Виджет тогда открывается только программно — вызовите window.SupportHub.open() со своей кнопки или ссылки. Действует при автозапуске по ?ws=; при ручной инициализации используйте SupportHub.init({ hideLauncher: true }). |
| async | boolean | false | Рекомендуется ставить. Бандл грузится параллельно остальной странице и не блокирует отрисовку. |
Программное управление
Бандл создаёт window.SupportHub. Сразу после загрузки скрипта в нём есть только init() и identify() — вызовы identify до запуска виджета копятся и отправляются после него. Остальные методы (open, close, isOpen, setTab, applyConfig, showState, destroy) появляются, когда виджет запустится, поэтому вызывайте их с проверкой: window.SupportHub?.open?.().
// Кнопка «Связаться с поддержкой» где-то у вас на сайте:
document.getElementById("contact-support").addEventListener("click", () => {
window.SupportHub?.open?.();
});Автооткрытие
Сам по себе виджет открывается в двух случаях — оба настраиваются в НастройкиКонструктор виджетаПриветствие.
- «Задержка авто-открытия» — через заданное число секунд (1–3600) после загрузки страницы, один раз за сессию и только если посетитель ещё не открывал виджет сам. Пусто или 0 — выключено.
- «Сразу открывать чат в Telegram Mini App» — если сайт запущен как Mini App, панель открывается сразу, а кнопка прячется (закрывает Telegram). Выключите, если Mini App — это ваш сайт, а чат в нём вспомогательный: тогда виджет останется обычной кнопкой. Ссылки, открытые из чатов Telegram (встроенный браузер), — не Mini App: там виджет сам не открывается никогда.
- «Где открывать само» — для задержки: везде, только в обычном браузере (не внутри приложений вроде Telegram или Instagram и не у сайта, установленного на экран) или только на компьютере. Поисковым роботам виджет сам не открывается.
- «Что открыть» — экран, на котором виджет откроется сам (по задержке или в Mini App): вкладка, а для «Помощи» и «Новостей» — конкретный раздел, статья или новость. Вкладка, которую посетитель не видит, игнорируется — виджет откроется как обычно.
Удаление и обновление
Удалить виджет с сайта
Уберите <script>-тег. После следующего деплоя посетители не увидят кнопку. Открытые обращения в системе остаются — операторы продолжают их вести, но новые посетители без виджета обращаться не смогут.
Обновлять не нужно
Бандл обновляется сам: тег ссылается на тот же адрес, и новые версии посетители получают при следующей загрузке страницы. Браузер кеширует бандл на 5 минут (max-age=300) и ещё какое-то время может один раз показать старую копию, пока обновляет её в фоне (stale-while-revalidate), — так что обновления и опубликованные настройки доходят за несколько минут.

