Перейти к основному содержимому

Отправка целей из бота через свой сайт

Как настроить отправку целей Яндекс.Метрики для бота в Telegram — связав действия в боте с конкретным посетителем сайта.

Для какого случая
  • Бот живёт в мессенджере Telegram.
  • Не используется бот-лендинг или виджет для сайта.
  • Нужно отправлять цели Метрики из бота, связывая их с пользователем сайта.

Шаг 1. Включение офлайн-конверсий

В настройках счётчика Яндекс.Метрики:

  1. Перейдите в «Загрузка данных».
  2. Включите учёт офлайн-конверсий.
  3. Дождитесь активации — это занимает около суток.
Без активации цели не дойдут

До завершения активации офлайн-конверсий цели из бота не будут засчитываться — настройку лучше начать заранее.


Шаг 2. Добавление Яндекс-аккаунта в конструкторе

В Quescha добавьте Яндекс-аккаунт, в котором находится счётчик Метрики для сайта.


Шаг 3. Получение clientID на сайте

На вашем сайте через JavaScript получите clientID посетителя из Яндекс.Метрики и подставьте его в параметр start ссылки на бот.

Базовая логика

// Получаем clientID посетителя сайта
var yaID;
ym(XXXXXXX, 'getClientID', function(clientID) { yaID = clientID });

// Связываем его с userID Метрики
ym(XXXXXXX, 'setUserID', yaID);

// Подставляем в ссылку на бот
var botlink = 'https://t.me/mybot?start=' + yaID;

Где XXXXXXX — номер вашего счётчика Метрики. Эту ссылку выводите посетителю сайта.

Готовый скрипт

Скрипт ниже ждёт инициализации Метрики, получает clientID и автоматически дописывает его во все ссылки и кнопки, ведущие на бот.

<script type="text/javascript">
const counterId = 12345678; // замените на свой счётчик метрики
const botlink = 'https://t.me/mybot'; // замените на свою ссылку на бот

function waitForYandexMetrika(counterId, timeout = 5000) {
return new Promise((resolve, reject) => {
const startTime = Date.now();
const interval = setInterval(() => {
if (typeof window['yaCounter' + counterId] !== 'undefined') {
clearInterval(interval);
resolve(true);
} else if (Date.now() - startTime > timeout) {
clearInterval(interval);
reject(new Error('Таймаут ожидания Яндекс.Метрики'));
}
}, 100);
});
}

waitForYandexMetrika(counterId)
.then(() => {
var yaID;
ym(counterId, 'getClientID', function (clientID) { yaID = clientID });
ym(counterId, 'setUserID', yaID);
var newlink = botlink + '?start=' + yaID;

document.querySelectorAll('a').forEach(link => {
if (link.href.includes(botlink)) {
link.href = link.href.replace(botlink, newlink);
}
});
document.querySelectorAll('button[onclick]').forEach(button => {
if (button.getAttribute('onclick').includes(botlink)) {
button.setAttribute('onclick', `window.location.href='${newlink}'`);
}
});
})
.catch(err => console.error(err.message));
</script>

Шаг 4. Сохранение start в боте

В сценарии бота присвойте значение start переменной metrikauserid — например, в стартовом блоке через сценарий действий.

Проверка на пустоту

Перед присвоением проверьте, что start не пуст — иначе вы запишете пустое значение для пользователей, пришедших не с сайта:

'#{start}' != ''

Отправка целей в метрику на своем сайте 1


Шаг 5. Отправка целей

  1. В счётчике Яндекс.Метрики создайте цели типа «JavaScript-событие».
  2. В нужных блоках бота настройте отправку цели.

Отправка целей в метрику на своем сайте 2

Теперь действия подписчиков в боте будут засчитываться как конверсии в Метрике — связанные с конкретным посетителем сайта.