Рецепты
Готовые решения частых задач. Везде, где написано «в коде установки», фрагмент заменяет строку w.SvyazioConfig = {…} внутри кода из раздела «Установка».
Открыть чат через 30 секунд на странице тарифов
// Страница тарифов: открыть чат через 30 секунд, один раз за визит
if (location.pathname.startsWith('/pricing') && !sessionStorage.getItem('chatOffered')) {
setTimeout(function () {
sessionStorage.setItem('chatOffered', '1');
Svyazio('openChat');
}, 30000);
}Показать кнопку, когда посетитель долистал до середины
// В коде установки: startHidden: true
function revealChat() {
var scrolled = window.scrollY + window.innerHeight;
if (scrolled >= document.documentElement.scrollHeight / 2) {
Svyazio('show');
window.removeEventListener('scroll', revealChat);
}
}
window.addEventListener('scroll', revealChat, { passive: true });Скрыть чат на странице оплаты
var HIDDEN_ON = ['/checkout', '/payment'];
function syncChatVisibility() {
var hidden = HIDDEN_ON.some(function (path) {
return location.pathname.startsWith(path);
});
Svyazio(hidden ? 'hide' : 'show');
}
syncChatVisibility();
// в SPA — ещё и при каждой смене маршрута, например router.afterEach(syncChatVisibility)Разные отделы для разных разделов сайта
Отдел закрепляется при загрузке, поэтому надёжнее всего выбирать его в коде установки:
// В коде установки: отдел по разделу сайта
var DEPARTMENTS = {
'/b2b': 'ID_ОТДЕЛА_ОПТОВЫХ_ПРОДАЖ',
'/support': 'ID_ОТДЕЛА_ПОДДЕРЖКИ'
};
var section = Object.keys(DEPARTMENTS).find(function (prefix) {
return location.pathname.startsWith(prefix);
});
w.SvyazioConfig = {
orgId: "ВАШ_ORG_ID",
serverUrl: "https://app.svyazio.ru",
groupId: section ? DEPARTMENTS[section] : undefined
};Сменить отдел на уже открытой странице — перезапуском с новой конфигурацией:
// Посетитель выбрал «Вопрос по оплате» — сменить отдел без перезагрузки
function switchDepartment(departmentId) {
window.SvyazioConfig = {
orgId: "ВАШ_ORG_ID",
serverUrl: "https://app.svyazio.ru",
groupId: departmentId
};
Svyazio('restart');
}Новый отдел получат следующие обращения. Диалог, который уже идёт, останется в прежнем отделе.
Кнопка «Спросить о товаре» с контекстом
Оператор увидит в карточке посетителя, о каком товаре вопрос.
<button type="button" class="ask" data-product="Кресло «Орион»" data-sku="OR-2041">
Спросить о товаре
</button>
<script>
document.addEventListener('click', function (event) {
var button = event.target.closest('.ask');
if (!button) return;
Svyazio('updateIntegrationData', {
product: button.dataset.product,
sku: button.dataset.sku,
productUrl: location.href
});
Svyazio('openChat', true);
});
</script>Выход из аккаунта
Виджет запоминает посетителя в браузере. Если на общем компьютере один человек вышел из аккаунта, а другой вошёл, второй увидит переписку первого. Чтобы этого не случилось, при выходе удалите сохранённый ID посетителя — после перезагрузки страницы виджет начнёт с чистого листа:
// Вызовите при выходе — до перехода на страницу входа
function forgetSvyazioVisitor() {
var orgId = "ВАШ_ORG_ID";
[
'svyazio_visitor_id_' + orgId,
'svyazio_conv_id_' + orgId,
'svyazio_visitor_token_' + orgId,
'svyazio_visitor_id', // ключи старых версий виджета
'svyazio_conv_id'
].forEach(function (key) {
try { localStorage.removeItem(key); } catch (e) {}
});
}
function logout() {
forgetSvyazioVisitor();
location.href = '/login'; // или location.reload() в одностраничном приложении
}Загружать виджет только после согласия на cookie и обработку данных
Виджет не ставит cookie, но хранит в браузере анонимный ID посетителя и передаёт на сервер адрес страницы и UTM-метки (подробнее — что хранит виджет). Если ваша политика требует согласия заранее, загружайте код по кнопке баннера:
<script>
// Вызовите, когда посетитель согласился на обработку персональных данных
function loadSvyazio() {
if (window.SvyazioWidget) { // уже загружался — вернуть после kill
Svyazio('restart');
return;
}
(function(d, w, c) {
w.SvyazioConfig = { orgId: "ВАШ_ORG_ID", serverUrl: "https://app.svyazio.ru" };
w[c] = w[c] || function() { (w[c].q = w[c].q || []).push(arguments); };
var s = d.createElement('script');
s.async = true;
s.src = 'https://app.svyazio.ru/widget/svyazio.js';
if (d.head) d.head.appendChild(s);
})(document, window, 'Svyazio');
}
// Согласие отозвано — убрать виджет со страницы
function unloadSvyazio() {
if (window.Svyazio) Svyazio('kill');
}
</script>Цвет виджета из фирменных цветов сайта
// Цвет берётся из CSS-переменной сайта. Нужен HEX из шести цифр: #0F8770
var brand = getComputedStyle(document.documentElement)
.getPropertyValue('--brand-color').trim();
if (/^#[0-9a-f]{6}$/i.test(brand)) {
Svyazio('setColors', { buttonBg: brand });
}Кнопка слева на телефоне и справа на компьютере
// В коде установки: на телефоне кнопка слева, чтобы не закрывать корзину
var isNarrow = window.matchMedia('(max-width: 600px)').matches;
w.SvyazioConfig = {
orgId: "ВАШ_ORG_ID",
serverUrl: "https://app.svyazio.ru",
buttonPosition: isNarrow ? 'bl' : 'br'
};Установка через Google Tag Manager
- Создайте тег типа «Пользовательский HTML».
- Вставьте в него код установки целиком, вместе с тегами
<script>. - Триггер — «All Pages» (все страницы). Сохраните и опубликуйте контейнер.
Вызовы Svyazio(…) из других тегов работают, если эти теги срабатывают после тега виджета — задайте порядок в настройке «Упорядочивание тегов».