JavaScript SDK — интеграция на сайт
Установка JS SDK Trigly: отслеживание событий, идентификация пользователей, push-уведомления.
Обзор JavaScript SDK
Trigly JavaScript SDK позволяет:
- Отслеживать события и действия пользователей на сайте
- Идентифицировать пользователей и обогащать профили
- Подписывать на Web Push уведомления
- Отображать виджеты подписки на каналы
- Записывать e-commerce события (покупки, корзина, просмотры)
SDK работает через публичные эндпоинты Trigly API, авторизация — по API-ключу.
Установка
Шаг 1: Получение API-ключа
Создайте API-ключ через API или интерфейс Trigly:
curl -X POST https://api.trigly.ru/api/v1/cdp/api-keys \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{"name": "Основной сайт"}'
Сохраните значение api_key из ответа.
Шаг 2: Подключение скрипта
Вставьте код инициализации SDK перед закрывающим тегом </body>:
<script>
(function(t,r,i,g,l,y){
t.TriglyQueue=t.TriglyQueue||[];
t.trigly=t.trigly||function(){t.TriglyQueue.push(arguments)};
t.trigly.l=Date.now();
y=r.createElement(i);y.async=1;y.src=g;
l=r.getElementsByTagName(i)[0];l.parentNode.insertBefore(y,l);
})(window,document,'script','https://cdn.trigly.ru/sdk/v1/trigly.min.js');
trigly('init', {
apiKey: 'tgl_live_abc123def456...',
apiUrl: 'https://api.trigly.ru',
// Опциональные настройки:
autoTrackPageViews: true, // Автоматический трекинг page_view
autoTrackClicks: false, // Трекинг кликов по ссылкам
cookieDomain: '.myshop.ru', // Домен для cookie
sessionTimeout: 30, // Таймаут сессии в минутах
debug: false // Логирование в консоль
});
</script>
Шаг 3: Проверка установки
Откройте консоль браузера (F12) и выполните:
trigly('debug', true);
trigly('track', 'test_event', { source: 'manual' });
В консоли должно появиться сообщение об успешной отправке события.
Отслеживание событий
Базовый трекинг
trigly('track', 'event_name', {
// произвольные свойства
property1: 'value1',
property2: 123
});
Стандартные события
Trigly распознаёт следующие стандартные события и использует их для аналитики, сегментации и предикций:
Просмотр страницы
// Автоматический трекинг (если autoTrackPageViews: true)
// или ручной:
trigly('track', 'page_view', {
page: window.location.pathname,
title: document.title,
referrer: document.referrer
});
Покупка
trigly('track', 'purchase', {
order_id: 'ORD-12345',
amount: 4990,
currency: 'RUB',
products: [
{
sku: 'NIKE-AM90-BLK-42',
name: 'Nike Air Max 90',
price: 4990,
quantity: 1,
category: 'Кроссовки'
}
],
coupon: 'SPRING20',
shipping: 290
});
Событие purchase с полем amount автоматически записывается в revenue в ClickHouse и используется для расчёта RFM, LTV и AI-скоринга.
Корзина
// Добавление в корзину
trigly('track', 'add_to_cart', {
product_id: 'NIKE-AM90',
name: 'Nike Air Max 90',
price: 4990,
quantity: 1,
category: 'Кроссовки'
});
// Удаление из корзины
trigly('track', 'remove_from_cart', {
product_id: 'NIKE-AM90'
});
// Начало оформления
trigly('track', 'checkout_started', {
cart_total: 9980,
items_count: 2
});
Поиск
trigly('track', 'search', {
query: 'кроссовки nike',
results_count: 47
});
Регистрация и авторизация
trigly('track', 'signup', {
method: 'email', // email, google, yandex, phone
source: 'header_form'
});
trigly('track', 'login', {
method: 'email'
});
Произвольные события
// Просмотр товара
trigly('track', 'product_viewed', {
product_id: 'NIKE-AM90',
name: 'Nike Air Max 90',
price: 4990,
category: 'Кроссовки',
brand: 'Nike'
});
// Добавление в избранное
trigly('track', 'added_to_wishlist', {
product_id: 'NIKE-AM90'
});
// Просмотр категории
trigly('track', 'category_viewed', {
category: 'Кроссовки',
items_shown: 24
});
// Использование промокода
trigly('track', 'coupon_applied', {
coupon: 'SPRING20',
discount: 998
});
// Отправка формы
trigly('track', 'form_submitted', {
form_id: 'contact_us',
subject: 'Вопрос о доставке'
});
// Просмотр видео
trigly('track', 'video_watched', {
video_id: 'product-review-123',
duration_seconds: 180,
completed: true
});
Пакетная отправка
SDK автоматически группирует события в пакеты для оптимизации сетевых запросов. По умолчанию пакет отправляется:
- Каждые 5 секунд
- При накоплении 10 событий
- При уходе пользователя со страницы (beforeunload)
Вы можете принудительно отправить все накопленные события:
trigly('flush');
Идентификация пользователей
Базовая идентификация
Привяжите действия анонимного посетителя к конкретному контакту:
trigly('identify', {
email: 'ivan@example.com',
first_name: 'Иван',
last_name: 'Петров'
});
Полная идентификация
trigly('identify', {
// Обязательные (хотя бы одно):
email: 'ivan@example.com',
// или phone: '+79161234567',
// или external_id: 'user_123',
// Опциональные:
first_name: 'Иван',
last_name: 'Петров',
phone: '+79161234567',
city: 'Москва',
country: 'RU',
language: 'ru',
timezone: 'Europe/Moscow',
// Произвольные поля:
custom_fields: {
plan: 'premium',
company: 'ООО Технологии',
registration_date: '2026-01-15',
preferred_brand: 'Nike'
}
});
Когда вызывать identify
- После регистрации — привяжите email к текущей сессии
- После авторизации — обновите данные профиля
- При заполнении формы — когда пользователь указал email/телефон
- При изменении профиля — обновите custom_fields
// Пример: после успешной регистрации
async function onRegistration(formData) {
const response = await registerUser(formData);
trigly('identify', {
email: formData.email,
first_name: formData.name,
custom_fields: {
registration_source: 'website',
registration_date: new Date().toISOString()
}
});
trigly('track', 'signup', { method: 'email' });
}
Сброс идентификации
При выходе пользователя из аккаунта сбросьте идентификацию:
trigly('reset');
Это очищает привязку и создаёт новый анонимный идентификатор сессии.
Web Push уведомления
Шаг 1: Регистрация Service Worker
Trigly предоставляет готовый Service Worker. Разместите его в корне вашего сайта:
<script>
// Регистрация SW (вызовите после init)
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/trigly-sw.js')
.then(function(registration) {
console.log('SW зарегистрирован:', registration.scope);
})
.catch(function(error) {
console.error('Ошибка регистрации SW:', error);
});
}
</script>
Получите файл Service Worker:
# Service Worker доступен по URL:
curl "https://api.trigly.ru/api/v1/sdk/push/sw.js" -o public/trigly-sw.js
Содержимое Service Worker обрабатывает:
- Получение push-уведомлений
- Отображение нотификации (title, body, icon, image)
- Клик по уведомлению — переход по URL из payload
Шаг 2: Запрос разрешения и подписка
async function subscribeToPush() {
// 1. Запрос разрешения
const permission = await Notification.requestPermission();
if (permission !== 'granted') {
console.log('Пользователь отклонил push-уведомления');
return;
}
// 2. Получение VAPID-ключа от Trigly
const response = await fetch(
'https://api.trigly.ru/api/v1/sdk/push/vapid-key?org_id=ORG_ID'
);
const { vapid_key } = await response.json();
// 3. Подписка через Push API
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.subscribe({
userVisibleOnly: true,
applicationServerKey: urlBase64ToUint8Array(vapid_key)
});
// 4. Отправка подписки в Trigly
await fetch(
'https://api.trigly.ru/api/v1/sdk/push/subscribe?org_id=ORG_ID',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
customer_id: 'CUSTOMER_UUID', // или email
subscription: subscription.toJSON()
})
}
);
console.log('Подписка на push оформлена!');
}
// Вспомогательная функция
function urlBase64ToUint8Array(base64String) {
const padding = '='.repeat((4 - base64String.length % 4) % 4);
const base64 = (base64String + padding)
.replace(/-/g, '+')
.replace(/_/g, '/');
const rawData = window.atob(base64);
const outputArray = new Uint8Array(rawData.length);
for (let i = 0; i < rawData.length; ++i) {
outputArray[i] = rawData.charCodeAt(i);
}
return outputArray;
}
Шаг 3: Отписка
async function unsubscribeFromPush() {
const registration = await navigator.serviceWorker.ready;
const subscription = await registration.pushManager.getSubscription();
if (subscription) {
await subscription.unsubscribe();
await fetch(
'https://api.trigly.ru/api/v1/sdk/push/unsubscribe?org_id=ORG_ID',
{
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
customer_id: 'CUSTOMER_UUID',
endpoint: subscription.endpoint
})
}
);
}
}
Отправка Push через API
После подписки вы можете отправлять push через кампании или напрямую:
# Через кампанию
curl -X POST https://api.trigly.ru/api/v1/campaigns \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Flash sale Push",
"channel": "push",
"campaign_type": "one_time",
"segment_id": "SEGMENT_ID",
"subject": "Скидки 50% только сегодня!",
"template_id": "PUSH_TEMPLATE_ID"
}'
Формат push-уведомления:
{
"title": "Скидки 50%!",
"body": "Только сегодня на все кроссовки. Промокод FLASH50",
"icon": "https://myshop.ru/icon-192.png",
"url": "https://myshop.ru/sale"
}
Ограничения: title — макс. 50 символов, body — макс. 100 символов.
Виджеты подписки
Trigly предоставляет готовые виджеты для подписки посетителей на каналы.
Получение виджетов
// SDK автоматически загружает и отображает активные виджеты
trigly('widgets', {
position: 'bottom-right', // bottom-left, top-right, top-left
delay: 5000, // Задержка показа (мс)
showOnScroll: 50 // Показать при прокрутке до 50%
});
Типы виджетов
| Тип | Описание |
|---|---|
popup |
Всплывающее окно по центру |
inline |
Встроенный блок (для встраивания в HTML) |
floating |
Плавающая кнопка (bottom-right) |
Создание виджета через API
curl -X POST https://api.trigly.ru/api/v1/channels/config/widgets \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Подписка на рассылку",
"widget_type": "popup",
"channels": ["email", "telegram", "push"],
"design": {
"title": "Подпишитесь на скидки!",
"subtitle": "Получайте персональные предложения первыми",
"button_text": "Подписаться",
"primary_color": "#10b981",
"position": "center"
},
"targeting_rules": {
"pages": ["/", "/products/*"],
"delay_seconds": 10,
"scroll_percent": 30,
"show_once_per_session": true
},
"is_active": true
}'
Подписка через виджет (SDK-эндпоинт)
// SDK вызывает этот эндпоинт автоматически при клике "Подписаться"
fetch('https://api.trigly.ru/api/v1/sdk/channels/subscribe?org_id=ORG_ID', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
email: 'user@example.com',
channels: ['email', 'telegram'],
source: 'widget',
widget_id: 'WIDGET_UUID'
})
});
Ответ включает Telegram-ссылку для привязки, если выбран канал Telegram:
{
"customer_id": "new-customer-uuid",
"channels_subscribed": ["email"],
"telegram_link": "https://t.me/your_bot?start=abc123..."
}
Аналитика виджетов
# Статистика виджета
curl https://api.trigly.ru/api/v1/channels/config/widgets/WIDGET_ID \
-H "Authorization: Bearer $TOKEN"
# Ответ включает:
# "total_views": 12345,
# "total_subscriptions": 567,
# "conversion_rate": 4.59
API Reference (HTTP-эндпоинты)
Все SDK-эндпоинты доступны без JWT-авторизации. Авторизация через API-ключ в заголовке X-API-Key (для track/identify/batch) или через query-параметр org_id (для push/widgets).
Track
POST /api/v1/sdk/track
Header: X-API-Key: tgl_live_...
{
"customer_id": "uuid",
"event_name": "purchase",
"properties": {"amount": 4990},
"page_url": "https://...",
"referrer": "https://...",
"session_id": "session_abc"
}
Batch
POST /api/v1/sdk/batch
Header: X-API-Key: tgl_live_...
{
"events": [
{"customer_id": "id1", "event_name": "page_view", "properties": {}},
{"customer_id": "id1", "event_name": "click", "properties": {"element": "buy_btn"}}
]
}
Максимум 100 событий в одном batch-запросе.
Identify
POST /api/v1/sdk/identify
Header: X-API-Key: tgl_live_...
{
"email": "user@example.com",
"first_name": "Иван",
"phone": "+79161234567",
"custom_fields": {"plan": "premium"}
}
Частые вопросы
Как отслеживать SPA-приложения?
Для React/Vue/Angular-приложений интегрируйте трекинг в роутер:
// React Router пример
import { useEffect } from 'react';
import { useLocation } from 'react-router-dom';
function usePageTracking() {
const location = useLocation();
useEffect(() => {
trigly('track', 'page_view', {
page: location.pathname,
search: location.search
});
}, [location]);
}
Как работать с серверным рендерингом (SSR)?
SDK работает только в браузере. Для серверного трекинга используйте HTTP API напрямую:
// Node.js / Next.js серверный трекинг
import fetch from 'node-fetch';
export async function trackServerEvent(customerId, eventName, properties) {
await fetch('https://api.trigly.ru/api/v1/sdk/track', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-API-Key': process.env.TRIGLY_API_KEY
},
body: JSON.stringify({
customer_id: customerId,
event_name: eventName,
properties
})
});
}
Как тестировать в dev-окружении?
trigly('init', {
apiKey: 'tgl_test_...', // Тестовый API-ключ
apiUrl: 'http://localhost:8000', // Локальный сервер
debug: true // Логирование в консоль
});
Влияет ли SDK на производительность сайта?
- Скрипт загружается асинхронно (
async) — не блокирует рендеринг - Размер SDK: ~8 KB (gzip)
- События отправляются пакетами, не на каждое действие
- Используется
navigator.sendBeacon()при уходе со страницы
Совместим ли SDK с Content Security Policy (CSP)?
Добавьте в CSP:
script-src 'self' https://cdn.trigly.ru;
connect-src 'self' https://api.trigly.ru;
Полный пример интеграции
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<title>Мой магазин</title>
</head>
<body>
<!-- Контент страницы -->
<!-- Trigly SDK -->
<script>
(function(t,r,i,g,l,y){
t.TriglyQueue=t.TriglyQueue||[];
t.trigly=t.trigly||function(){t.TriglyQueue.push(arguments)};
t.trigly.l=Date.now();
y=r.createElement(i);y.async=1;y.src=g;
l=r.getElementsByTagName(i)[0];l.parentNode.insertBefore(y,l);
})(window,document,'script','https://cdn.trigly.ru/sdk/v1/trigly.min.js');
// Инициализация
trigly('init', {
apiKey: 'tgl_live_abc123...',
apiUrl: 'https://api.trigly.ru',
autoTrackPageViews: true
});
// Идентификация (если пользователь авторизован)
var user = getCurrentUser(); // ваша функция
if (user) {
trigly('identify', {
email: user.email,
first_name: user.name,
custom_fields: { user_id: user.id }
});
}
// Виджеты подписки
trigly('widgets', { delay: 5000 });
</script>
<!-- Отслеживание покупки (на странице Thank You) -->
<script>
if (window.orderData) {
trigly('track', 'purchase', {
order_id: window.orderData.id,
amount: window.orderData.total,
currency: 'RUB',
products: window.orderData.items
});
}
</script>
</body>
</html>
Не нашли ответ?
Swagger UI с интерактивной документацией и поддержка в Telegram.