Установка виджета на сайт
Один тег с workspace_id в query — и чат на любой странице. Опциональные data-атрибуты + JS-API для identify/control ниже.
Установка за 4 шага
- 1Найдите свой workspace_idВ дашборде откройте SettingsWidget Builder — кнопка «Embed» в правом верхнем углу даёт готовый сниппет. Если хотите вставить вручную — workspace_id виден в URL дашборда:
/settings/widget-builder?ws=UUID. - 2Вставьте loader-сниппет перед </body>На каждой странице, где должен быть чат — copy-paste изSettingsWidget BuilderEmbed:По умолчанию loader подключает виджет в анонимном режиме — один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><script>, никакого бэкенда у вас не требуется. Если хотите cross-device идентификацию (один визитор с iPhone и MacBook → один Contact) — раскомментируйте блокfetch('/api/supporthub/token')и реализуйте endpoint у себя по одному из шаблонов; виджет передаст токен вdata-visitor-tokenавтоматически. Bundle injects черезdocument.createElement('script')сasync=1, не блокирует first paint. Параметр?ws=— единственный обязательный; API URL бэкенда уже зашит в preamble. Полный референс HMAC — /docs/widget/hmac, identify-flow целиком — /docs/widget/identify. - 3Проверьте, что FAB появилсяОткройте сайт в режиме инкогнито. В правом нижнем углу должна появиться круглая индиго-кнопка с иконкой чата (через ~100ms после полной загрузки). Если её нет — посмотрите в консоли. Самые частые причины:
?ws=опечатка → бандл не запустится (auto-boot ищет валидный UUID)- CSP блокирует загрузку bundle → добавьте
support.forestsnet.comиapi.support.forestsnet.comвscript-srcиconnect-src - Adblock —
widget-bundleне сматчит ни один популярный фильтр, но отдельные пользователи могут блокировать вручную
- 4Откройте чат и отправьте тестовое сообщениеКликните по FAB → откроется панель → нажмите «Задать вопрос» → отправьте «привет». В дашборде во вкладке «Входящие» моментально появится новый тикет — это значит embed подключён правильно.
Что делает тег
При загрузке /widget-bundle?ws=… выполняет:
- Читает
?ws=из URL скрипта + опциональныеdata-*атрибуты с тега. Конфиг виджета и API URL уже инлайнятся в preamble бандла на стороне сервера, поэтому отдельного запроса за/configнет. - Применяет тему, цвета, custom_css → создаёт DOM-узлы FAB и панели
- Подключает WebSocket к
/api/ws/widget/{visitor_session}?workspace_id={ws}для real-time входящих - Резолвит visitor session ID через 5-tier storage (cookie + localStorage + sessionStorage + IndexedDB + legacy LS) — подробности в справочнике для разработчиков
- Если есть
data-email/name/phone/telegram-id— шлётPOST /widget/{ws}/identifyи привязывает визитора к контакту автоматически
Параметры тега
.example.com) — чтобы один визитор сохранял одну беседу при переходе между поддоменами. То же самое можно задать через BuilderConversationCookie domain; атрибут на теге выигрывает у конфига./widget/identify.| Поле | Тип | По умолчанию | Описание |
|---|---|---|---|
| ?ws= (query) | uuid | — | Обязательный. UUID workspace в URL скрипта. Найти — SettingsWidget Builder, или Embed-кнопка в правом верхнем. |
| data-api-base | string | https://api.support.forestsnet.com/api | Override базового URL API. Самый редкий параметр — пригождается только для self-hosted / staging инсталляций. По умолчанию бандл уже знает прод-URL (зашит в preamble). |
| data-cookie-domain | string | — | Домен для visitor-session cookie с лидирующей точкой (.example.com) — чтобы один визитор сохранял одну беседу при переходе между поддоменами. То же самое можно задать через BuilderConversationCookie domain; атрибут на теге выигрывает у конфига. |
| data-email | string | — | Email посетителя. Если передан — pre-chat форма пропускается, контакт создаётся / обновляется на бэке через /widget/identify. |
| data-name | string | — | Полное имя посетителя. |
| data-phone | string | — | Номер телефона (E.164 рекомендуется). |
| data-telegram-id | int | — | Telegram ID для связки виджета и TG-канала бота. |
| data-visitor-token | string | — | HMAC-токен для cross-device идентификации (если посетитель залогинен в вашей CRM с подписанным jwt — передайте его сюда, тикеты подцепятся к тому же контакту с других устройств). |
| async | boolean | false | Рекомендуется ставить. Bundle загружается параллельно остальной страницей, не блокирует рендеринг. |
Программное управление
Bundle экспортирует window.SupportHub с публичным API — можно открыть чат, переключить вкладку, идентифицировать визитора из своего JS. Методы доступны сразу после загрузки скрипта (init() даже не обязательно завершиться — вызовы identify буферизуются).
// Кнопка «Связаться с поддержкой» где-то у вас на сайте:
document.getElementById("contact-support").addEventListener("click", () => {
window.SupportHub?.open();
});Удаление и обновление
Удалить виджет с сайта
Уберите <script>-тег. После следующего деплоя посетители не увидят FAB. Открытые тикеты в системе остаются — операторы продолжают их вести, но новые посетители без виджета обращаться не смогут.
Обновлять не нужно
Bundle — auto-updating. Тег ссылается на ту же URL, мы выпускаем новые версии — посетители получают их при следующей загрузке страницы. Cache-Control стоит на 60 секунд: критичные фиксы разъезжаются в течение минуты, агрессивный CDN-кэш не мешает.