# Отчетность и аналитика



# Инструкция настройки Яндекс.Метрики для отслеживания открытия виджета

1\. Стандартное добавление цели в Яндекс.Метрике.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/OWxyaPvQEn46DIIc-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/OWxyaPvQEn46DIIc-image.png)

2\. Поскольку открытие виджета считается нажатием по кнопке. Выбираем этот пункт.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/TuXmhQHNSRP4T70s-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/TuXmhQHNSRP4T70s-image.png)

3\. И добавим название цели.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/HJYZlIsn1K7Ljumv-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/HJYZlIsn1K7Ljumv-image.png)

4\. Добавляем url адрес страницы, на которой необходимо отслеживать клики.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/tSrCjcc1M3pwi7OP-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/tSrCjcc1M3pwi7OP-image.png)

5\. Нажимаем выбрать кнопку и нас перенаправит на страницу.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/6p89eC19N1L7KeDs-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/6p89eC19N1L7KeDs-image.png)

6\. После этого нам необходимо, чтобы был выбран пункт **Выбор элемента**, далее уже выбрать сам виджет.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/NSHqQONBEYUreFHx-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/NSHqQONBEYUreFHx-image.png)

7\. Автоматически подхватит виджет. И нам останется только подтвердить отслеживание кликов.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/g1CyVpvuBe7xADQd-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/g1CyVpvuBe7xADQd-image.png)

8\. Останется только подтвердить создание цели.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2023-10/scaled-1680-/f41srSGlaUaW2Fqr-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2023-10/f41srSGlaUaW2Fqr-image.png)

# Подключение Яндекс Метрики через платформу Metabot

<span style="font-weight: 400;">В этом уроке мы рассмотрим, как интегрировать Яндекс Метрику с платформой Metabot для отслеживания переходов пользователей с вашего сайта в Telegram-бот. Это позволит вам собирать данные о конверсиях, анализировать эффективность маркетинговых кампаний и улучшать взаимодействие с аудиторией.  
</span>

<p class="callout info align-left"><span style="font-weight: 400;">Все приведенное ниже можно посмотреть в бизнесе 1 РЕХАУ Сервис в боте [Рехау Бот (ОСНОВНОЙ)](https://bots1.metabot24.com/bot/1010).</span></p>

## Общая схема интеграции

1. **Настройка Яндекс.Метрики**<span style="font-weight: 400;"> — создаем счетчик и настраиваем цели для отслеживания;</span>
2. **Добавление кода на сайт**<span style="font-weight: 400;"> — устанавливаем счетчик и специальный код на страницу с кнопкой перехода в Telegram;</span>
3. **Настройка платформы Metabot**<span style="font-weight: 400;"> — создаем таблицу, маршрут, скрипт и плагин для обработки и передачи данных;</span>
4. **Передача данных**<span style="font-weight: 400;"> — данные о конверсиях передаются обратно в Яндекс.Метрику для анализа.</span>

<p class="callout info align-left">**Важно!** В текущей версии связь осуществляется через аккаунт Павла (@mr\_result). Для подключения новых счетчиков необходимо предоставить полный доступ к нужным счетчикам для пользователя **<a rel="noopener">pavel.borisov@metabot.org</a>** в настройках Яндекс Метрики.</p>

## Шаги по настройке интеграции

### Создание счетчика и целей в Яндекс Метрике

#### Создание счетчика

1. <span style="font-weight: 400;">Перейдите на сайт</span>[<span style="font-weight: 400;"> </span><span style="font-weight: 400;">Яндекс.Метрики</span>](https://metrika.yandex.ru/)<span style="font-weight: 400;"> и войдите в свой аккаунт.</span>
2. <span style="font-weight: 400;">Нажмите на кнопку </span>**Добавить счетчик**<span style="font-weight: 400;">.</span>
3. <span style="font-weight: 400;">Заполните необходимые поля и получите код счетчика.</span>
4. <span style="font-weight: 400;">Установите код счетчика на все страницы вашего сайта, где планируется отслеживание.</span>

#### Создание цели

1. <span style="font-weight: 400;">В настройках вашего счетчика перейдите в раздел </span>**Цели**<span style="font-weight: 400;"> и нажмите </span>**Добавить цель**<span style="font-weight: 400;">.</span>
2. <span style="font-weight: 400;">Выберите тип цели </span>**JavaScript-событие**<span style="font-weight: 400;">.</span>
3. <span style="font-weight: 400;">Укажите </span>**Название цели**<span style="font-weight: 400;"> и </span>**Идентификатор цели**<span style="font-weight: 400;"> (например, </span><span style="font-weight: 400;">tg\_bot</span><span style="font-weight: 400;">). Идентификатор цели потребуется в дальнейшем.</span>

Пример настройки цели:

- **Тип условия**<span style="font-weight: 400;"> — JavaScript-событие;</span>
- **Идентификатор цели**<span style="font-weight: 400;"> — </span><span style="font-weight: 400;">tg\_bot;</span>
- **Название**<span style="font-weight: 400;"> — переход в Telegram-бот.</span>

<p class="callout info">**Примечание**<span style="font-weight: 400;">**:** Название и идентификатор цели могут быть любыми, но важно использовать корректный идентификатор в дальнейшем коде.</span></p>

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-09/scaled-1680-/29TONqTH1V0FEtKV-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-09/29TONqTH1V0FEtKV-image.png)

### Добавление кода на страницу

Добавьте следующий код на страницу, с которой осуществляется переход в Telegram-бота:

```HTML
<script>
    document.addEventListener('DOMContentLoaded', function () {
        let clientID = 0;
        try {
            ym(ВАШ_НОМЕР_СЧЕТЧИКА, 'getClientID', function (id) {
                clientID = id || 0;
                console.log('Received clientID:', clientID);
            });
        } catch (e) {
            console.warn('Yandex Metrika is blocked or failed, using clientID = 0');
        }
        let telegramBtn = document.getElementById('telegramBtn');
        if (telegramBtn) {
            telegramBtn.onclick = function () {
                window.location.href = 'https://bots1.metabot24.com/deeplink/telegram/ВАШ_БОТ/ВАШ_ХЭШ?ym_client_id=' + clientID + '&ym_counter_id=' + ВАШ_НОМЕР_СЧЕТЧИКА + '&ym_target_name=ВАШ_ИЦ';
            };
        } else {
            console.error('Telegram button not found');
        }
    });
</script>
```

Пояснения:

- **ВАШ\_НОМЕР\_СЧЕТЧИКА** — замените на номер вашего счетчика Яндекс Метрики;
- **telegramBtn** — убедитесь, что кнопка перехода в бота имеет **id="telegramBtn"**. Если у нее другой id, измените его в коде;
- **ВАШ\_БОТ** и **ВАШ\_ХЭШ** — замените на соответствующие значения вашего бота и хэша диплинка;
- **ВАШ\_ИЦ** — укажите идентификатор цели, созданной ранее;

Пример для нескольких кнопок:

Если у вас есть несколько кнопок с разными целями, используйте следующий код:

```JavaScript
// Кнопка 1
let telegramBtnLearning = document.getElementById('telegramBtnLearning');
if (telegramBtnLearning) {
    telegramBtnLearning.onclick = function () {
        window.location.href = 'https://bots1.metabot24.com/deeplink/telegram/ВАШ_БОТ/ХЭШ1?ym_client_id=' + clientID + '&ym_counter_id=' + ВАШ_НОМЕР_СЧЕТЧИКА + '&ym_target_name=ЦЕЛЬ1';
    };
} else {
    console.error('Telegram button not found');
}

// Кнопка 2
let telegramBtnBuyOriginal = document.getElementById('telegramBtnBuyOriginal');
if (telegramBtnBuyOriginal) {
    telegramBtnBuyOriginal.onclick = function () {
        window.location.href = 'https://bots1.metabot24.com/deeplink/telegram/ВАШ_БОТ/ХЭШ2?ym_client_id=' + clientID + '&ym_counter_id=' + ВАШ_НОМЕР_СЧЕТЧИКА + '&ym_target_name=ЦЕЛЬ2';
    };
} else {
    console.error('Telegram button not found');
}
```

Пояснения:

- Каждая кнопка имеет свой id и ссылается на разный диплинк и цель;
- Замените **ХЭШ1**, **ХЭШ2**, **ЦЕЛЬ1**, **ЦЕЛЬ2** на соответствующие значения.

### Получение параметров в Metabot

При переходе по диплинку в Metabot в атрибут **sys\_last\_script\_request\_params** запишутся следующие значения:

```JSON
{
  "deeplink": {
    "hash": "ВАШ_ХЭШ",
    "name": "Название диплинка",
    "ym_client_id": "ИДЕНТИФИКАТОР_КЛИЕНТА",
    "ym_counter_id": "ВАШ_НОМЕР_СЧЕТЧИКА",
    "ym_target_name": "ВАШ_ИЦ"
  }
}
```

### Создание таблицы

В Metabot создайте кастомную таблицу **ym\_conversion** со следующими полями:

- **lead\_id** — ID лида;
- **client\_id** — идентификатор клиента в Яндекс Метрике;
- **counter\_id** — номер счетчика Яндекс Метрики;
- **target** — идентификатор цели;
- **is\_uploaded** — статус загрузки (0 — не загружено, 1 — загружено);
- **created\_at** — дата и время создания записи.

[![image.png](https://docs.metabot24.ru/uploads/images/gallery/2024-09/scaled-1680-/AhldlcweonIDalc1-image.png)](https://docs.metabot24.ru/uploads/images/gallery/2024-09/AhldlcweonIDalc1-image.png)

### Код для маршрутов

Добавьте следующий код в соответствующий маршрут:

```JavaScript
// Получение параметров последнего запроса
let params = lead.getJsonAttr("sys_last_script_request_params");

// Извлечение данных из параметров
let ymClientId = params?.deeplink?.ym_client_id || 0;
let ymCounterId = params?.deeplink?.ym_counter_id || 0;
let ymTargetName = params?.deeplink?.ym_target_name || '';

if (ymClientId !== 0) {
    lead.setAttr("ym_client_id", ymClientId);
    table.createItem("ym_conversion", {
		"lead_id": leadId, 
		"client_id": ymClientId, 
		"counter_id": ymCounterId, 
		"target": ymTargetName 
    });
}
```

Пояснения:

- Извлекаем данные из **sys\_last\_script\_request\_params**;
- Сохраняем данные в таблицу **ym\_conversion**.

[![1.jpg](https://docs.metabot24.ru/uploads/images/gallery/2024-09/scaled-1680-/0nliuwBgfOihkBMY-1.jpg)](https://docs.metabot24.ru/uploads/images/gallery/2024-09/0nliuwBgfOihkBMY-1.jpg)

### Скрипт для отправки данных

Создайте скрипт **send\_request\_ym** со следующим кодом:

```JavaScript
const moment = require("moment");

// Подключение плагина YandexMetrika
let yandexMetrika = snippet("Business.Integrations.YandexMetrika");

// Массив счетчиков
let metrikaCounterIds = [ВАШ_НОМЕР_СЧЕТЧИКА1, ВАШ_НОМЕР_СЧЕТЧИКА2]; // Добавьте свои счетчики

// Обработка каждого счетчика
for (let metrikaCounterId of metrikaCounterIds) {

    // Получение данных для загрузки
    let conversionData = table.find("ym_conversion", [], [
        ["is_uploaded", "=", 0],
        ["counter_id", "=", metrikaCounterId]
    ]);

    let processedData = [];

    if (conversionData.length) {
        for (let record of conversionData) {

            // Преобразование даты в Unix-время
            let unixTimestamp = moment(record.created_at).unix();

            // Формирование объекта данных
            processedData.push({
                "UserId": Number(record.lead_id),
                "ClientId": record.client_id.toString(),
                "Target": record.target,
                "DateTime": unixTimestamp
            });
        }

        // Загрузка данных в Яндекс Метрику
        let uploadResponse = yandexMetrika.uploadData(processedData, metrikaCounterId);

        // Проверка статуса загрузки
        if (JSON.parse(uploadResponse?.body)?.uploading?.status === "UPLOADED") {
            for (let record of conversionData) {
                // Обновление статуса записи
                record.update({
                    "is_uploaded": 1
                });
            }
        }

        bot.sendMessage(JSON.stringify(uploadResponse));
    }
}

// Перезапуск скрипта через 6 часов
bot.runScriptByCodeForLead("send_request_ym", leadId, null, false, {
    "run_after_sec": 21600
});
```

Пояснения:

- Скрипт отправляет данные о конверсиях в Яндекс Метрику;
- Использует плагин **YandexMetrika** для взаимодействия с API;
- Запишите в маршрут с регулярным выражением **/metrika**;
- Отключите опцию **Обрабатывать Deep Link**;
- Перезапускается автоматически каждые 6 часов.

### Код плагина YandexMetrika

1\. В разделе **Плагины** перейдите в **Плагины бизнеса** — **Integrations**.

2\. Создайте плагин **YandexMetrika** (если он отсутствует) и добавьте ниже представленный код.

```JavaScript
{
    _token: bot.getAttr("sys_yandex_metrika_token"),

    get token() {
        return this._token;
    },

    set token(token) {
        this._token = token;
    },

    uploadData: function(csvData, counterId, clientIdType = "CLIENT_ID") {
        require("Common.Integrations.Utils");
        const utils = CommonIntegrationsUtils;

        const fileData = {
            "file_path": "file",
            "file_name": "data.csv"
        };

        const headers = {
            "Authorization": `OAuth ${this._token}`
        };

        const method = 'POST';
        let uri = `https://api-metrika.yandex.net/management/v1/counter/${counterId}/offline_conversions/upload?client_id_type=${clientIdType}`;
        const jsonBody = {};

        let response = utils.sendCsvFile(method, uri, jsonBody, csvData, fileData, headers);

        return response;
    }
}
```

Пояснения:

- Плагин обеспечивает взаимодействие с API Яндекс Метрики;
- Необходимо указать OAuth-токен доступа.

### Добавление OAuth-токена

Перейдите в настройки бота и добавьте атрибут **sys\_yandex\_metrika\_token** со значением вашего OAuth-токена Яндекс Метрики.

## Завершение настройки

После выполнения всех шагов вы настроите интеграцию Яндекс Метрики с платформой Metabot. Теперь вы сможете отслеживать конверсии и переходы пользователей из вашего сайта в Telegram-бота.

Примечания:

- **Безопасность** — храните OAuth-токен в безопасности и не распространяйте его публично;
- **Тестирование** — после настройки рекомендуем протестировать работу системы, чтобы убедиться в корректности данных.

# OAuth-токен для Яндекс Метрики

### Зарегистрируйте приложение в Яндекс OAuth

1. Перейдите на [страницу регистрации](https://oauth.yandex.ru/client/new) приложений Яндекса.
2. Войдите в свой аккаунт Яндекса, если вы еще не авторизованы.

### Создайте новое приложение

- **Название приложения** — укажите понятное название вашего приложения или проекта;
- **Описание** — кратко опишите назначение приложения (опционально);
- **Платформы** — выберите платформу, например, **Веб-сервисы**;
- **Callback URI** — если требуется, укажите URL для обратного вызова (для серверных приложений это не обязательно).

### Укажите права доступа (Scope)

1. В разделе **Доступ к данным** выберите необходимые права для работы с Яндекс Метрикой: 
    - **Яндекс Метрика (metrika)**: 
        - **Метрика: чтение статистики** — для доступа к статистике;
        - **Метрика: редактирование счетчиков** — если нужно создавать или изменять счетчики;
        - **Метрика: управление конфигурацией** — для управления целями, фильтрами и прочими настройками;
2. Убедитесь, что выбранные права соответствуют вашим потребностям.

### Сохраните приложение

1. Нажмите кнопку **Создать приложение**.
2. После сохранения вы будете перенаправлены на страницу с информацией о вашем приложении.

### Получите идентификаторы

- **ID приложения (Client ID)** — уникальный идентификатор вашего приложения;
- **Пароль приложения (Client Secret)** — секретный ключ вашего приложения.

<p class="callout warning">**Важно!** Бережно храните **Client Secret** и не передавайте его третьим лицам.</p>

### Получите OAuth-токен

Существует два способа получения OAuth-токена: вручную через веб-интерфейс или программно через OAuth-протокол.

#### Способ 1: Получение токена через веб-интерфейс (для личного использования)

1\. Перейдите по ссылке для получения токена, заменив **YOUR\_CLIENT\_ID** на ваш **Client ID**:

<div class="dark bg-gray-950 contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative" id="bkmrk-"><div class="dark bg-gray-950 contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative"><div class="overflow-y-auto p-4" dir="ltr">  
</div></div></div>```HTML
https://oauth.yandex.ru/authorize?response_type=token&client_id=YOUR_CLIENT_ID&scope=metrika
```

2\. Выберите аккаунт Яндекса, для которого хотите получить токен.

3\. Разрешите доступ приложению, нажав кнопку **Разрешить**.

4\. После этого вы будете перенаправлены на указанный **Callback URI**, а в адресной строке будет содержаться ваш **OAuth-токен**.

Пример адресной строки:

```HTML
https://your-callback-url.com/#access_token=YOUR_OAUTH_TOKEN&token_type=bearer&expires_in=31536000
```

5\. Скопируйте значение **access\_token** — это и есть ваш OAuth-токен.

#### Способ 2: Получение токена программно через OAuth-протокол

1\. Сформируйте запрос на получение кода авторизации:

```HTML
https://oauth.yandex.ru/authorize?response_type=code&client_id=YOUR_CLIENT_ID&scope=metrika
```

2\. Получите код авторизации после разрешения доступа.

3\. Обменяйте код на токен с помощью POST-запроса к API:

```
POST https://oauth.yandex.ru/token
```

Параметры запроса:

- grant\_type=authorization\_code;
- code=AUTHORIZATION\_CODE (полученный на предыдущем шаге);
- client\_id=YOUR\_CLIENT\_ID;
- client\_secret=YOUR\_CLIENT\_SECRET.

Пример запроса с использованием curl:

```
curl -X POST https://oauth.yandex.ru/token \
  -d 'grant_type=authorization_code' \
  -d 'code=AUTHORIZATION_CODE' \
  -d 'client_id=YOUR_CLIENT_ID' \
  -d 'client_secret=YOUR_CLIENT_SECRET'
```

В ответе вы получите JSON с вашим **OAuth-токеном**:

```JSON
{
  "access_token": "YOUR_OAUTH_TOKEN",
  "expires_in": 31536000,
  "token_type": "bearer"
}
```

<div class="dark bg-gray-950 contain-inline-size rounded-md border-[0.5px] border-token-border-medium relative" id="bkmrk-%D0%9F%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B0-%D1%82%D0%BE%D0%BA%D0%B5%D0%BD%D0%B0-%28%D0%BE%D0%BF%D1%86"><div class="overflow-y-auto p-4" dir="ltr"><span style="color: #222222; font-size: 2.333em;">Проверка токена (опционально)</span>  
</div></div>Вы можете проверить работоспособность токена, отправив тестовый запрос к API Яндекс Метрики:

```HTML
GET https://api-metrika.yandex.net/management/v1/counters
```

Добавьте заголовок авторизации:

```
Authorization: OAuth YOUR_OAUTH_TOKEN
```

Пример запроса с использованием curl:

```
curl -H "Authorization: OAuth YOUR_OAUTH_TOKEN" \
https://api-metrika.yandex.net/management/v1/counters
```

Если токен действителен, вы получите список ваших счетчиков.

### Используйте OAuth-токен в вашем приложении

1. Сохраните токен в безопасном месте, например, в настройках вашего приложения или бота.
2. Передавайте токен в заголовках **Authorization** при запросах к API Яндекс Метрики.

### Важные замечания

- **Безопасность** — никогда не публикуйте ваш OAuth-токен и **Client Secret** в открытых источниках или репозиториях;
- **Срок действия токена** — по умолчанию токен действует один год (**expires\_in**: 31536000 секунд). По истечении срока потребуется получить новый токен;
- **Отзыв токена** — вы можете в любой момент отозвать токен в настройках своего аккаунта Яндекса в разделе **Приложения с доступом к аккаунту**.