Установка
Виджет / Установка

Установка виджета на сайт

Один тег с workspace_id в query — и чат на любой странице. Опциональные data-атрибуты + JS-API для identify/control ниже.

Установка за 4 шага

  1. 1
    Найдите свой workspace_id
    В дашборде откройте SettingsWidget Builder — кнопка «Embed» в правом верхнем углу даёт готовый сниппет. Если хотите вставить вручную — workspace_id виден в URL дашборда: /settings/widget-builder?ws=UUID.
  2. 2
    Вставьте loader-сниппет перед </body>
    На каждой странице, где должен быть чат — copy-paste изSettingsWidget BuilderEmbed:
    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>
    По умолчанию loader подключает виджет в анонимном режиме — один <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. 3
    Проверьте, что FAB появился
    Откройте сайт в режиме инкогнито. В правом нижнем углу должна появиться круглая индиго-кнопка с иконкой чата (через ~100ms после полной загрузки). Если её нет — посмотрите в консоли. Самые частые причины:
    • ?ws= опечатка → бандл не запустится (auto-boot ищет валидный UUID)
    • CSP блокирует загрузку bundle → добавьте support.forestsnet.com и api.support.forestsnet.com в script-src и connect-src
    • Adblock — widget-bundle не сматчит ни один популярный фильтр, но отдельные пользователи могут блокировать вручную
  4. 4
    Откройте чат и отправьте тестовое сообщение
    Кликните по FAB → откроется панель → нажмите «Задать вопрос» → отправьте «привет». В дашборде во вкладке «Входящие» моментально появится новый тикет — это значит embed подключён правильно.

Что делает тег

При загрузке /widget-bundle?ws=… выполняет:

  1. Читает ?ws= из URL скрипта + опциональные data-* атрибуты с тега. Конфиг виджета и API URL уже инлайнятся в preamble бандла на стороне сервера, поэтому отдельного запроса за /config нет.
  2. Применяет тему, цвета, custom_css → создаёт DOM-узлы FAB и панели
  3. Подключает WebSocket к /api/ws/widget/{visitor_session}?workspace_id={ws} для real-time входящих
  4. Резолвит visitor session ID через 5-tier storage (cookie + localStorage + sessionStorage + IndexedDB + legacy LS) — подробности в справочнике для разработчиков
  5. Если есть data-email/name/phone/telegram-id — шлёт POST /widget/{ws}/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 буферизуются).

js
// Кнопка «Связаться с поддержкой» где-то у вас на сайте:
document.getElementById("contact-support").addEventListener("click", () => {
  window.SupportHub?.open();
});

Удаление и обновление

Удалить виджет с сайта

Уберите <script>-тег. После следующего деплоя посетители не увидят FAB. Открытые тикеты в системе остаются — операторы продолжают их вести, но новые посетители без виджета обращаться не смогут.

Обновлять не нужно

Bundle — auto-updating. Тег ссылается на ту же URL, мы выпускаем новые версии — посетители получают их при следующей загрузке страницы. Cache-Control стоит на 60 секунд: критичные фиксы разъезжаются в течение минуты, агрессивный CDN-кэш не мешает.

Была ли страница полезной?