Данное руководство описывает техническую сторону вопроса и пошаговую инструкцию настройки тегов для Яндекс Тег Менеджер (YTM) по отслеживанию роботного трафика, конверсий от роботов. Базовые принципы работы и описание функционала можно изучить в этой статье. Так же, если Вам удобнее видеоформат, делюсь ссылками на YouTube и Vk (внизу статьи еще есть iframe с видео, которое удобно смотреть не покидая страницу и копирую с неё код).
Если меня одобрят как автора для каталога тегов YTM, вы сможете найти все эти теги в удобном формате внутри Яндекс Метрики и статья будет дополнена простой инструкцией без кода, поэтому подписывайтесь на tg канал и ждите анонс, когда мои теги начнут публиковаться в библиотеке Метрики. Их будет много.
Что понадобится для настройки антибота
- созданный проект в Google raCaptcha с двумя ключами (ключ сайта и секретный ключ) — как это сделать наглядно в видео к этой инструкции на 6-й минуте;
- Яндекс Метрика с правами на редактирование и публикацию контейнера ЯТМ;
- хостинг или vps, где можно опубликовать серверный скрипт. В Видео я использовал justhost (самый дешевый вариант), а в сам пользуюсь vps от beget с панелью управления Hestia CP.
Что делаем на хостинге
Купите любой хостинг и разместите на нем серверный скрипт. Это может быть бесплатный домен от самого хостинга или поддомен вашего сайта, на котором будет происходить проверка на роботность. Второй вариант предпочтительнее. Если ваш сайт на Тильде, то скорее всего домен вы покупали у другого регистратора. В таком случае, нужно добавить у последнего A-запись в DNS зоне вашего домена с ip адресом хостинга, к примеру так:

После того, как dns зона обновится вам потребуется создать SSL сертификат. Он нужен, чтобы сайт открывался по защищенному протоколу https (а не Http). Без этого антибот не будет работать — это ограничение браузеров. Отмечу, что у предложенных мной выше хостинга и vps есть бесплатный SSL сертификат от Let’s Encrypt. Как правило такой есть на всех хостингах и не нужно покупать платные дорогие сертификаты.
На JustHost добавление сетрификата выглядит так:

Так же сертификат можно создать при добавлении домена, а на бесплатном домене от хостинга, он обычно установлен по умолчанию.
На VPS от beget (панель Hestia CP) сертификат устанавливается в настройках домена так:

Установка серверного скрипта
На хостинге заходим в менеджер файлов (если его нет, тогда заходим на хостинг по ftp) и в корневую папку сайта загружаем серверный скрипт. Его можно скачать по ссылке либо можно создать новый файл с расширением .php (например server_bot-chek.php) и скопировать в него этот код:
<?php // --- CORS: проверка источника --- $allowedDomain = 'zurov.ru'; // замените на ваш домен $secret = 'My key'; // ваш секретный ключ reCaptcha $origin = $_SERVER['HTTP_ORIGIN'] ?? ''; if (preg_match("#^https?://([a-z0-9.-]+\\.)?$allowedDomain\$#i", $origin)) { header("Access-Control-Allow-Origin: $origin"); header('Vary: Origin'); } else { http_response_code(403); echo json_encode(['success' => false, 'error' => 'CORS: origin not allowed']); exit; } header('Access-Control-Allow-Methods: POST, OPTIONS'); header('Access-Control-Allow-Headers: Content-Type'); header('Content-Type: application/json'); // --- preflight --- if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(204); exit; } // --- основной код --- if ($_SERVER['REQUEST_METHOD'] === 'POST') { $input = json_decode(file_get_contents('php://input'), true); $token = $input['recaptchaToken'] ?? ''; if (!$token) { echo json_encode(['success' => false, 'score' => 0, 'error' => 'Missing token']); exit; } $verifyResponse = file_get_contents("https://www.google.com/recaptcha/api/siteverify?secret=$secret&response=$token"); $responseData = json_decode($verifyResponse, true); echo json_encode([ 'success' => $responseData['success'], 'score' => $responseData['score'] ?? 0 ]); } ?>
В скрипте меняем zurov.ru на домен вашего сайта с которого отправляется запрос на проверку на робота (именно хост без https, поддоменом и пр.), а My key меняем на секретный ключ reCaptcha (не ключ сайта, а именно секретный ключ). Не удаляйте кавычки (‘ ‘).
Запомните путь к серверному скрипту. В моем случае это — https://just-bot.zurov.ru/server_bot_chek.php.
Создаем переменные и тригеры в YTM
В YTM идем в переменные и создаем 3 переменные с шаблоном «Переменная уровня данных» и названиями:
- recaptchaScore — оценка в диапазоне 0.1 (робот) — 1.0 (человек), которая будет приходить после проверки на робота.
- recaptchaAction — отправляемое на проверку действие на сайте (клик по email, отправка формы, просмотр страницы и пр.)
- recaptchaPrice — скорректированная на оценку ценность цели для Метрики, например, если вы готовы платить за клик по email 500 руб., а оценка пришла 0.5, то вы заплатите за достижение цели этим посетителем 500*0,5=250 руб.
Добавление переменной в интерфейсе выглядит так:

Создадим 4 триггера:
- два с типом «Специальное событие и названиями событий iNeedScore (для активации запроса на оценку посетителя) и recaptchaVerified (срабатывает после возврата оценки на уровень данных от серверного скрипта);
- 1 с типом «Просмотр страницы» → «Все события» (если у вас уже нет такого конечно);
- любой триггер на отслеживание того действия, которое вы хотите проверять на роботность (у меня это клик по любой ссылке на сайте).
Мои триггеры называются так (но это произвольно):

Создаем теги
У Менеджера Тегов от Яндекса есть свои особенности, например, на момент написания этого материала, в теги с шаблоном «Пользовательский HTML» нельзя добавлять переменные в фигурных скобках, поэтому лучше использовать теги из шаблонов. Пока же будем пользоваться текущим функционалом и обходит ограничения. Нам понадобятся три тега с шаблоном «Пользовательский HTML» и один с шаблоном «Яндекс Метрика».
Тег reCaptcha — badge
Тег добавляет на страницы сайта скрипт raCaptcha с бейджем в правом нижнем углу. Бейдж можно скрыть, убрав <!— и —>, но в таком случае Google требует уведомлять о том, что вы используете raCaptcha самостоятельно.
- Шаблон — Пользовательский HTML;
- Триггер — Просмотр страницы (Все события);
- Заменить {{recaptchaSiteKey}} на ключ сайта из reCaptcha.
<script src='https://www.google.com/recaptcha/api.js?render={{recaptchaSiteKey}}'></script> <!-- <style> .grecaptcha-badge { visibility: hidden; } </style> -->
Тег DL iNeedScore
Срабатывает по любому подвешенному на него триггеру с действием, которое вы хотите проверить на роботность и отправляет на dataLayer событие iNeedScore, которое запускает следующий тег с проверкой. Создавайте аналогичные теги на каждое проверяемое действие.
- Шаблон — Пользовательский HTML;
- Триггер события на сайте, которое вы отправляете на проверку в reCaptcha — у меня это click links;
- Заменить 500 на ту ценность конверсии, которую вы хотите прописать как максимальную для выбранной цели или проигнорируйте, если нужны только оценки. В большинстве случаев приходит оценка в диапазоне 0.7 — 0.9, учитывайте это при выставлении ценности и помните, что это максимальная, а не средняя;
- Заменить click_links на то название целевого действия, которое будете пробрасывать в аналитику (используете только латиницу и подчеркивание _, тире и минусы не принимаются системой).
<script> // Сохраняем tCPA max в sessionStorage sessionStorage.setItem('targetMaxPrice', 500); // Пушим событие только с нужным action window.dataLayer.push({ 'event': 'iNeedScore', 'recaptchaAction': 'click_links' }); </script>
Тег recaptchaChekIn
Отправляет действие на проверку на сервер и ждет результат проверки, декодирует его и возвращает на dataLayer в три созданные ранее переменные (recaptchaAction, recaptchaScore, recaptchaPrice).
- Шаблон — Пользовательский HTML;
- Триггер — event iNeedScore (тот, который срабатывает при наступлении события iNeedScore);
- Заменить {{recaptchaSiteKey}} на ключ сайта из reCaptcha;
- Заменить https://zurov.ru/server_bot_chek.php на путь к своему серверному скрипту.
<script> // Настраиваемые переменные var recaptchaSiteKey = '{{recaptchaSiteKey}}'; //вставить свой ключ сайта вместо {{recaptchaSiteKey}} var recaptchaServerPath = 'https://zurov.ru/server_bot_chek.php'; //Вставить свой URL к серверному скрипту var targetMaxPrice = parseFloat(sessionStorage.getItem('targetMaxPrice')) || 0; var recaptchaAction = null; // Ищем recaptchaAction for (var i = dataLayer.length - 1; i >= 0; i--) { if (dataLayer[i].recaptchaAction && !recaptchaAction) { recaptchaAction = dataLayer[i].recaptchaAction; break; } } grecaptcha.ready(function() { grecaptcha.execute(recaptchaSiteKey, { action: recaptchaAction }) .then(function(token) { var xhr = new XMLHttpRequest(); xhr.open('POST', recaptchaServerPath, true); xhr.setRequestHeader('Content-Type', 'application/json'); xhr.onreadystatechange = function() { if (xhr.readyState === 4 && xhr.status === 200) { try { var data = JSON.parse(xhr.responseText); window.dataLayer.push({ 'event': 'recaptchaVerified', 'recaptchaValid': data.success, 'recaptchaScore': data.score, 'recaptchaAction': recaptchaAction, 'recaptchaPrice': data.score * targetMaxPrice }); } catch (e) { console.error('Ошибка парсинга JSON:', e); } } }; xhr.send(JSON.stringify({ recaptchaToken: token })); }); }); </script>
Тег YM — bot score (отправка цели в Метрику)
Этот тег берем из библиотеки шаблонов, но не импортируем в свои шаблоны, а выбираем на странице добавления тегов (иначе у вас не будет работать обновление этого тега от Яндекса):

В тегах из каталога поддерживаются переменные, поэтому мы можем использовать то, что отправили на dataLayer и сохранили в переменных с типом «Переменная уровня данных». Для использования переменных нужно ввести две фигурные скобки {{, а затем выбрать переменную из выпадающего списка:

Предлагаю следующие настройки тега:
- ID счетчика — вставьте ID счетчика Метрики, но лучше использовать переменную с типом константа и подставлять в дальнейшем её в любые теги. (Лирическое отступление. Эту практику когда-то давно ввел именно я и приятно, что специалисты её подхватили и теперь об этом написано даже в справке Метрики).
- Идентификатор цели — ytm_bot_{{ recaptchaAction }}. Такой шаблон позволит вам создать цели на каждое проверяемое действие на сайте, т.к. оно будет передано в переменную recaptchaAction на уровне данных, например ytm_bot_phone_click (проверка кликов по номеру телефона) или ytm_bot_form_submit (проверка роботности при отправке формы). При этом вы можете создать дополнительно общую цель JavaScrip с условием «содержит» ytm_bot и в нее будут падать все достигнутые цели по всем проверяемым событиям;
- Ставим галку на «Доход по цели» и указываем в поле «Доход» переменную {{ recaptchaScore }} или {{ recaptchaPrice }} (в зависимости от ваших целей), а в валюту RUB, BYN или ту, которую нужно, обязательно в верхнем регистре;
- По необходимости прожимаем галку для добавления параметров события и записываем туда объект JS вида {«Параметр1″:»Значение параметра 1″,»Параметр 2″:»Значение параметра 2»}. Можно использовать переменные, например так — {«{{ recaptchaAction }}»:»{{ recaptchaScore }}»};
- Триггер — event recaptchaVerified (который срабатывает при получении оценки с сервера и отправке данных на dataLayer).

На этом все. Не забудьте опубликовать тег и если у вас не собираются данные, то проверьте в режиме инкогнито, ведь мы чаще всего в счетчике отключаем сбор данных со своих аккаунтов.
Что по итогу
Вы сможете:
- В условиях триггеров ставить ограничение и отправлять данные в Метрику только тогда, когда оценка выше или ниже нужного значения, таким образом собирая конверсии без ботов или только от ботов. Второй подойдет для создания сегментов для отключения показа рекламы в Директе.
- Пробрасывать в Яндекс Директ динамическую ценность цели с корректировкой на роботность.
- Строить отчеты по уровню роботности, средней оценки ботности площадки РСЯ и многое другое.