
Баннер с запросом согласия на cookie есть почти на каждом сайте. Но часто он существует «для галочки» — данные в аналитику улетают сразу при загрузке страницы, независимо от того, что выбрал пользователь. И если раньше это была просто недоработка, то с 1 сентября прошлого года в 152-ФЗ (Федеральный закон «О персональных данных») был внесен ряд изменений, в том числе, появились новые требования к оформлению согласия на обработку персональных данных. Во-первых, оно должно быть получено в явном виде, а во-вторых, существенно вырос штраф за несоблюдение этого пункта. Компаниям было дано время на устранение несоответствий закону, а со второй половины этого года должны начаться массовые проверки того, как компании собирают и хранят персональные данные. Так что если вы до сих пор не привели эту часть вашего сайта в порядок — сейчас самое время этим заняться.
Разберемся с этими настройками на примере нашего сайта cleverdata.ru: если ничего не делать/использовать дефолтные настройки/использовать стандартный набор Tilda с Яндекс.Метрикой, то ... баннер отображается, но Яндекс.Метрика загружается и собирает данные ещё до того, как пользователь успевал нажать хоть какую-то кнопку. Конечно, такие настройки использовать нельзя — это нарушает требования 152-ФЗ и GDPR, которые обязывают получить явное согласие пользователя до начала сбора данных. И мы так, естественно, не делаем. А можно ли как-то исправить эту ситуацию? – Можно!
Привет, я Анна Таюрская, инженер технической поддержки (L1) компании CleverData. Я знаю, как решить эту проблему.
В этой статье я расскажу, как мы:
Настроили сбор согласий на cookie в CDP CleverData Join, чтобы хранить историю согласий с IP-адресами и иметь возможность предоставить её по запросу.
Настроили логику загрузки Яндекс.Метрики, чтобы данные передавались только после явного согласия пользователя.
Сайт собран на Tilda, аналитика настроена через CleverData Tag Manager.
Часть 1. Сбор согласий на cookie в CDP
Архитектура решения
При нажатии любой кнопки баннера (Принять все / Отклонить все / Подтвердить) CleverData Tag Manager читает cookie Tilda и отправляет событие cookie_consent_given в CDP CleverData Join. Событие содержит:
статус согласия:
all/partial/rejectedфлаг аналитических cookie:
1/0флаг рекламных cookie:
1/0IP-адрес посетителя
Вся история попадает в ClickHouse, где хранится 3 года и доступна для выгрузки по запросу.
Шаг 1. Создать атрибуты в таксономии CDJ
В интерфейсе CDP создать группу Cookie Consent с атрибутами типа string:
Атрибут | Значения |
|
|
|
|
|
|

Шаг 2. Настроить триггеры в Tag Manager
Создать 4 триггера:
Три триггера типа «Клик» на кнопки баннера T972:
Триггер | Тип |
Принять все | Клик |
Отклонить все | Клик |
Подтвердить | Клик |
Один специальный триггер для прослушивания события из Data Layer:
Триггер | Тип |
cookie_consent_ready | Специальное событие |



Шаг 3. Создать переменные в Tag Manager
Создать 3 переменные типа JavaScript Function, которые читают cookie Tilda в момент срабатывания триггера.
Переменная var_cc_status: function() { var dl = window.dmpkitdl || []; for (var i = dl.length - 1; i >= 0; i--) { if (dl[i].event === 'cookie_consent_ready') return dl[i].cc_status; } return ''; } Переменная var_cc_analytics: function() { var dl = window.dmpkitdl || []; for (var i = dl.length - 1; i >= 0; i--) { if (dl[i].event === 'cookie_consent_ready') return dl[i].cc_analytics; } return ''; } Переменная var_cc_advertising: function() { var dl = window.dmpkitdl || []; for (var i = dl.length - 1; i >= 0; i--) { if (dl[i].event === 'cookie_consent_ready') return dl[i].cc_advertising; } return ''; }


Шаг 4. Создать теги в Tag Manager
Нужно создать два тега.
Тег 1 — «Отправка согласия на cookie», тип «Произвольный JavaScript-код», триггеры: Принять все, Отклонить все, Подтвердить.
Этот тег ждёт появления cookie t_cookiesConsentGiven, читает выбор пользователя, вычисляет значения cc_status, cc_analytics, cc_advertising и пушит событие cookie_consent_ready в Data Layer:
Код тега на JavaScript
(function() { var start = Date.now(); var interval = setInterval(function() { if (Date.now() - start > 5000) { clearInterval(interval); return; } var consentGiven = document.cookie.match(/t_cookiesConsentGiven=([^;]+)/); if (!consentGiven) return; clearInterval(interval); var rejectAll = document.cookie.indexOf('t_cookiesRejectAll=true') !== -1; var match = document.cookie.match(/t_cookiesCategories=([^;]+)/); var cats = match ? JSON.parse(decodeURIComponent(match[1])) : []; var status, action; if (rejectAll || cats.length === 0) { status = 'rejected'; action = 'reject_all'; } else if (cats.indexOf('analytics') !== -1 && cats.indexOf('advertising') !== -1) { status = 'all'; action = 'accept_all'; } else { status = 'partial'; action = 'custom_confirm'; } var analytics = cats.indexOf('analytics') !== -1 ? '1' : '0'; var advertising = cats.indexOf('advertising') !== -1 ? '1' : '0'; window.dmpkitdl = window.dmpkitdl || []; window.dmpkitdl.push({ event: 'cookie_consent_ready', cc_status: status, cc_analytics: analytics, cc_advertising: advertising, cc_action: action }); }, 50); })();

Тег 2 — «Согласие на cookie», тип «Событие, поставляемое в CDP», триггер: cookie_consent_ready.
Этот тег слушает событие из Data Layer и отправляет данные в CDP с атрибутами:
Переменная | Атрибут CDJ |
var_cc_status | cc_status |
var_cc_analytics | cc_analytics |
var_cc_advertising | cc_advertising |

Шаг 5. Добавить колонки в ClickHouse
ALTER TABLE cleverdata.t_customer_journey_local ADD COLUMN IF NOT EXISTS `cc_status` Nullable(String), ADD COLUMN IF NOT EXISTS `cc_analytics` Nullable(String), ADD COLUMN IF NOT EXISTS `cc_advertising` Nullable(String), ADD COLUMN IF NOT EXISTS `ip_address` Nullable(String);
Шаг 6. Изменить TTL таблицы
По умолчанию TTL таблицы — 1 месяц. Для хранения истории согласий меняем на 3 года:
ALTER TABLE cleverdata.t_customer_journey_local MODIFY TTL created_date + toIntervalYear(3);
Шаг 7. Обновить Groovy-маппинг
Добавить в Groovy-файл маппинг новых атрибутов (ID атрибутов подставить после создания на шаге 1):
// Cookie Consent Attributes attr(500002).lastValue().asString() into 'cc_status' attr(500003).lastValue().asString() into 'cc_analytics' attr(500004).lastValue().asString() into 'cc_advertising' attr(10066).lastValue().asString() into 'ip_address'
Шаг 8. Проверить данные в ClickHouse
После тестового нажатия кнопок баннера убедиться что события попадают в таблицу:
SELECT created_date, ip_address, cc_status, cc_analytics, cc_advertising FROM cleverdata.t_customer_journey_local WHERE event_name = 'cookie_consent_given' ORDER BY created_date DESC LIMIT 10

Часть 2. Корректная загрузка Яндекс.Метрики
В чём была проблема
Открываем DevTools → Network, фильтруем по watch и заходим на сайт — ещё до любого взаимодействия с баннером видим запросы к mc.yandex.ru. В параметре t запроса: gdpr(14)clc(0-0-0) — Яндекс.Метрика сама фиксирует что согласия нет, но данные всё равно отправляет.

Диагностика
Смотрим исходный код страницы (Ctrl+U) и находим три разных загрузки tag.js:
<script async src="https://mc.yandex.ru/metrika/tag.js">— загружается сразу<script type="text/plain" data-tilda-cookie-type="analytics" data-src="...">— правильный, ждёт согласияИнлайн-скрипт с
ym(85465294, "init", ...)— тоже загружаетtag.jsсразу
Первый и третий вариант оказались в блоке T123 в шапке сайта — он дублировал счётчик без каких-либо ограничений.

Решение
Шаг 1. Удалить блок T123 с кодом ЯМ из шапки сайта.
Шаг 2. В настройках сайта Tilda → Вставка кода → HTML-код для вставки внутрь HEAD заменить код ЯМ на следующий:
<!-- Yandex.Metrika counter --> <script type="text/plain" data-tilda-cookie-type="analytics"> (function(m,e,t,r,i){ m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); })(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym"); ym(85465294, "init", { clickmap:true, trackLinks:true, accurateTrackBounce:true, webvisor:true }); </script> <script type="text/plain" data-tilda-cookie-type="analytics" data-src="https://mc.yandex.ru/metrika/tag.js"></script> <!-- /Yandex.Metrika counter -->
Почему именно такой порядок: init-скрипт создаёт очередь window.ym сразу при принятии cookie, а tag.js загружается следом и обрабатывает её. Если поменять порядок — tag.js загрузится раньше чем появится очередь, и инициализация не произойдёт.
Важно: убрать тег <noscript> с пикселем mc.yandex.ru/watch/ — он отправляет данные независимо от согласия.
Шаг 3. Переопубликовать сайт.
Проверка
Открываем сайт в режиме инкогнито с включённым Disable cache в DevTools.
До принятия cookie — в Network при фильтре tag список пустой:
// В консоли: typeof ym // "undefined" document.querySelector('script[src*="metrika"]') // null

После нажатия «Принять все» — tag.js появляется в Network, инициатор t972_acceptCookies:
typeof ym // "function"

При запрете аналитических cookie:
typeof ym // "undefined" !!document.querySelector('script[src*="metrika"]') // false

Итоговая таблица сценариев
Аналитика | Реклама | Результат |
✅ | ✅ | ЯМ работает, данные доступны в Директе |
✅ | ❌ | ЯМ работает, сегменты для Директа не передаются |
❌ | ✅ | ЯМ не загружается, Директ недоступен |
❌ | ❌ | ЯМ не загружается |
Важно: разделить отправку данных в Метрику и Директ технически невозможно — данные с сайта идут в Метрику, и уже внутри Яндекса становятся доступны для Директа. Поэтому управление осуществляется только через аналитические cookie.
Результат
После настройки:
История согласий каждого посетителя хранится в ClickHouse 3 года и доступна для выгрузки по запросу
Яндекс.Метрика загружается строго после явного согласия пользователя
Сайт соответствует требованиям 152-ФЗ
Оба сценария — сбор согласий и управление аналитикой — реализованы через CleverData Tag Manager без привлечения разработчиков и без изменения основного кода сайта.
