Я обычно настраиваю UTM-метки так, чтобы потом не ловить хаос в отчётах. И честно говоря, в 2026 году это уже не про «просто пометить ссылку», а про нормальную сквозную аналитику, где CRM, сайт, коллтрекинг и рекламные кабинеты говорят на одном языке.
У меня был клиент из b2b-ниши на Bitrix24: трафик шёл из Google Ads, Яндекс.Директа, Telegram и email-рассылок, а менеджеры вручную вбивали источники в карточки сделок. Итог — в отчётах 40% лидов оказывались «прямыми заходами», а реальная ROMI считалась на глаз. После настройки UTM, сохранения данных в cookie и проброса в CRM картина стала нормальной уже через неделю. И это, по опыту, обычная история.
Что такое UTM в 2026 году и почему без них аналитика врёт
UTM-метки — это параметры URL, по которым аналитика и CRM понимают, откуда пришёл пользователь, по какой кампании, объявлению, каналу и даже по какому креативу. Базовый набор никто не отменял: utm_source, utm_medium, utm_campaign, utm_content, utm_term. Но на деле в 2026 году этого часто мало. Я всё чаще вижу дополнительные параметры: utm_id, utm_partner, utm_region, utm_device, иногда свои служебные поля под CRM.
Почему это важно? Потому что браузеры режут third-party cookies, часть рекламных переходов теряется, часть пользователей возвращается через прямой заход, а офлайн-конверсии и звонки вообще живут отдельно, если не связать всё руками. Если вы не храните UTM на стороне сайта и не отправляете их в CRM, то потом начинается классика: «Лидов много, а откуда они — непонятно». Это плохая идея. В 2026 году так работать уже стыдно.
Я обычно объясняю клиенту просто: UTM — это не маркетинговая украшалка, а технический идентификатор сделки. Если вы хотите внятную аналитику, вам нужна не только настройка Google Analytics и Яндекс.Метрики на сайте, но и сохранение UTM-цепочки на всём пути пользователя: от первого клика до создания сделки в CRM.
Как построить структуру UTM-меток без бардака
Самая частая ошибка — когда каждый маркетолог пишет метки по-своему. Один ставит utm_source=google, другой — utm_source=googleads, третий вообще utm_source=gads. Потом CRM честно собирает это в три разных источника, а руководитель смотрит на отчёт и не понимает, почему цифры не сходятся.
Я обычно начинаю с таблицы правил. В ней фиксируются все допустимые значения, и всё. Например:
- utm_source — источник: google, yandex, telegram, email, vk, direct;
- utm_medium — тип размещения: cpc, cpm, organic, email, referral, messenger;
- utm_campaign — название кампании: sale_winter_2026, b2b_leads_q1;
- utm_content — креатив, баннер, текст, кнопка;
- utm_term — ключевая фраза или сегмент;
- utm_id — внутренний ID кампании из рекламной системы или CRM.
Грубо говоря, метки должны быть одинаково понятны и маркетологу, и разработчику, и менеджеру продаж. Если у вас интернет-магазин, то я бы ещё разделил кампании по типам: бренд, категорийные, ретаргетинг, распродажи, брошенные корзины. Если B2B — по источнику лида, сегменту и воронке. У одного клиента на Laravel и MySQL 8.0 мы сделали отдельный стандарт для франчайзинга и для корпоративных продаж, и это сильно упростило отчёты в CRM.
И ещё момент. Если вы уже делали интеграцию CRM с сайтом, не думайте, что UTM «как-нибудь сами доедут». Нет, не доедут. Обычно их нужно отдельно сохранять в hidden-поля формы, в localStorage или cookie, а потом отправлять вместе с лидом.
Как сохранить UTM на сайте, чтобы они не потерялись
Вот тут начинается самая техническая часть. Пользователь кликает по рекламе, попадает на лендинг, листает страницы, потом возвращается через пару часов и оставляет заявку. Если вы не сохранили UTM с первого захода, то в CRM уйдёт либо пусто, либо последний источник. А последний источник — не всегда реальный.
Я обычно храню UTM в cookie и дублирую в localStorage. Cookie удобны для отправки на сервер, localStorage — для фронтенда и подстановки в формы. На проектах под Bitrix и WordPress это работает нормально, особенно если сайт на PHP 8.2 или 8.3 и формы кастомные. Если сайт на Bitrix, часто проще доработать логику через обработчики событий. Если WordPress — через hooks и `functions.php`, но аккуратно.
Ниже пример простого JavaScript-кода для сохранения UTM в cookie на 30 дней:
function getUtmParams() {
const params = new URLSearchParams(window.location.search);
const utmKeys = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_content', 'utm_term', 'utm_id'];
const result = {};
utmKeys.forEach((key) => {
const value = params.get(key);
if (value) result[key] = value;
});
return result;
}
function setCookie(name, value, days) {
const expires = new Date(Date.now() + days * 864e5).toUTCString();
document.cookie = `${name}=${encodeURIComponent(value)}; expires=${expires}; path=/; SameSite=Lax; Secure`;
}
const utmData = getUtmParams();
if (Object.keys(utmData).length) {
setCookie('utm_data', JSON.stringify(utmData), 30);
localStorage.setItem('utm_data', JSON.stringify(utmData));
}
Но это ещё не всё. Если пользователь впервые пришёл без UTM, а потом вернулся с них, важно решать, перезаписывать ли старые данные. Я обычно ставлю правило атрибуции отдельно: first touch для верхней части воронки и last non-direct click для заявки. Иначе в отчётах будет спор между маркетологом и продажами, а оно вам точно не нужно.
Если вам нужна именно доработка сайта под такую логику, я бы не растягивал задачу на «потом». Нормальная настройка трекинга, hidden-полей и отправки в CRM — это типовая доработка, которую однозначно стоит делать сразу вместе с настройкой целей и событий. А если хотите сначала понять объём работ, можно посмотреть калькулятор стоимости сайта или заказать проверку сайта на технические проблемы и потери лидов.
Как передать UTM в CRM: Bitrix24, amoCRM, HubSpot и другие
Теперь к самому вкусному. В CRM UTM нужно не просто сохранить, а правильно разложить по полям. Иначе потом менеджер будет видеть набор строк в комментариях, а не нормальную карточку сделки. На моей практике лучше всего работает отдельная группа полей: источник, канал, кампания, объявление, ключ, посадочная страница, client_id, landing_page, first_utm, last_utm.
Если у вас Bitrix24, можно использовать стандартные поля лида и сделки, но я чаще создаю свои пользовательские поля. В amoCRM похожая история. В HubSpot тоже всё упирается в структуру свойств. Главное — не пихать UTM в одно поле «Комментарий», это ужасная идея. Потом вы не сможете нормально строить отчёты и фильтры.
У одного клиента в Bitrix24 мы сделали так: при отправке формы JS считывал UTM из cookie, `client_id` из GA4, `ym_client_id` из Метрики и отправлял это на сервер. PHP-обработчик уже пробрасывал данные в CRM через API. На стороне менеджеров всё выглядело чисто: источник, кампания, ключ, устройство, посадка. И вот тогда продажи впервые начали доверять аналитике.
<?php
$utmJson = $_COOKIE['utm_data'] ?? '';
$utmData = json_decode(urldecode($utmJson), true);
$payload = [
'TITLE' => 'Заявка с сайта',
'NAME' => $_POST['name'] ?? '',
'PHONE' => $_POST['phone'] ?? '',
'UF_CRM_UTM_SOURCE' => $utmData['utm_source'] ?? '',
'UF_CRM_UTM_MEDIUM' => $utmData['utm_medium'] ?? '',
'UF_CRM_UTM_CAMPAIGN' => $utmData['utm_campaign'] ?? '',
'UF_CRM_UTM_CONTENT' => $utmData['utm_content'] ?? '',
'UF_CRM_UTM_TERM' => $utmData['utm_term'] ?? '',
'UF_CRM_UTM_ID' => $utmData['utm_id'] ?? '',
];
$ch = curl_init('https://example.bitrix24.ru/rest/1/webhook/crm.lead.add.json');
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query(['fields' => $payload]),
]);
$response = curl_exec($ch);
curl_close($ch);
echo $response;
Если же вы работаете на WordPress, я бы смотрел в сторону hooks для Contact Form 7, Fluent Forms, WPForms или Gravity Forms. Там логика похожая: прочитать cookie, проставить hidden fields, отправить в CRM. По опыту, на WordPress чаще всего ломается не интеграция, а дисциплина полей и плагины кэша. Особенно если стоит что-то вроде LiteSpeed Cache, WP Rocket или серверный FastCGI cache на Nginx.
Кстати, если CRM-интеграция у вас уже есть, но UTM не долетают, это почти всегда можно поправить без полной переделки проекта. Иногда нужна просто настройка силами специалиста и точечная правка формы, иногда — полноценный аудит цепочки. Тут много зависит от CMS и от того, как именно устроен фронтенд.
Настройка в GA4 и Яндекс.Метрике: что смотреть в 2026 году
GA4 в 2026 году уже давно не воспринимается как «тот самый старый Universal Analytics». Но проблема осталась прежней: данные есть, а толку мало, если события не связаны с UTM и CRM. В Яндекс.Метрике похожая история. Я обычно настраиваю цели не только на отправку формы, но и на клики по телефону, мессенджерам, скачивание прайса, просмотр ключевых страниц, открытие popup-форм.
Если вы продаёте услуги, то UTM в связке с событиями дают очень приятную картину. Например, у клиента в нише ремонта после такой настройки выяснилось, что Telegram приносит лиды дешевле контекста в 1.8 раза, но конверсия в договор хуже. А в CRM стало видно, что часть лидов с UTM `utm_source=telegram` попадала в сделку только после второго касания. Без сквозной аналитики это было бы не видно вообще.
Я обычно советую строить отчётность так:
- Верхний уровень — источник и канал.
- Средний уровень — кампания и креатив.
- Нижний уровень — лид, сделка, выручка, маржа.
- Дополнительно — звонки, чаты, повторные визиты, офлайн-статусы.
Но есть нюанс. Если у вас на сайте не настроены корректно cookies consent и пользователь отказался от маркетинговых cookies, часть UTM может не сохраниться. В 2026 году это уже реальная история. Поэтому я всегда рекомендую проверять цепочку не только в браузере, но и в сценарии с ограниченным трекингом. Это особенно важно, если вы работаете с европейским трафиком или мульти-региональными проектами.
И если у вас аналитика уже стоит, но вы видите расхождения между Метрикой, GA4 и CRM, я бы сначала сделал проверку сайта и прошёлся по всей воронке: формы, редиректы, кэш, JS-ошибки, блокировки скриптов и прокси. Иногда дело вообще не в UTM, а в том, что события не срабатывают из-за ошибки в фронтенде или конфликта плагинов.
Сквозная аналитика, атрибуция и офлайн-конверсии
В 2026 году просто сохранить UTM недостаточно. Нужно ещё понимать, как именно вы атрибутируете выручку. First touch, last touch, linear, position-based, data-driven — вариантов много, но я обычно советую начать с двух схем: первая — для маркетинга, вторая — для отчётности руководству. Иначе будет вечный спор, кто «привёл» клиента.
У меня был случай с e-commerce проектом на Битрикс, MySQL 8.0 и PHP 8.3. Маркетолог смотрел на last click и говорил, что контекст «не работает». Руководитель продаж показывал, что клиенты приходят с email и возвращаются через ретаргетинг. Мы собрали цепочку касаний, добавили UTM, `client_id`, статусы в CRM и офлайн-конверсии из 1С. В итоге стало ясно, что email закрывает 18% сделок, а ретаргетинг помогает добирать тех, кто уже прогрелся.
Если у вас много офлайн-продаж, телефонии и WhatsApp/Telegram-переписки, UTM нужно связывать ещё и с коллтрекингом. Иначе часть сделок будет «съедена» последним касанием по телефону. Это не баг, это просто неполная картина. В таких проектах я часто советую делать отдельный маршрут данных: сайт → CRM → телефония → BI-система. Никакой магии, только дисциплина.
Технически всё это обычно поддерживается нормальной архитектурой: сервер на Nginx, PHP-FPM 8.2/8.3, MySQL 8.0, Redis для очередей и кеша. И если CRM начинает тормозить на больших объёмах лидов, это уже повод смотреть не только на UTM, но и на общий техдолг. Иногда помогает разбор технического долга сайта, а иногда — нормальная настройка Redis для сайта.
Типичные ошибки при настройке UTM-меток
Самая частая ошибка — потеря UTM при редиректах. Например, ссылка ведёт на http, потом сервер переводит на https, затем ещё и на www, а параметры query string теряются на одном из этапов. Или ссылка идёт через сокращатель, который режет часть параметров. Или лендинг открывается в iframe. Тут нужно проверять всю цепочку. Я обычно начинаю с простого: открыть ссылку, посмотреть полный путь, убедиться, что UTM не пропали после 301/302.
Ещё одна проблема — кэширование. На WordPress это бывает особенно часто, когда страница кэшируется вместе с уже подставленными значениями или наоборот не может считать свежие параметры из URL. На Bitrix тоже встречал случаи, когда компонент формы жил своей жизнью и игнорировал cookie. Поэтому UTM-логику надо тестировать не на одном браузере, а хотя бы на Chrome, Safari и мобильном Safari. И да, PageSpeed тут вообще ни при чём, если у вас источник не доезжает до CRM.
Ещё список типовых ошибок, которые я вижу почти в каждом втором проекте:
- разные форматы написания одних и тех же источников;
- UTM сохраняются только в первой форме и теряются на втором шаге;
- в CRM нет отдельных полей под метки;
- маркетолог меняет структуру параметров без уведомления разработчика;
- UTM не попадают в звонки и офлайн-продажи;
- данные пишутся в комментарий, а не в структурированные поля.
Если у вас ещё и формы отправляются через несколько сторонних сервисов, то без нормальной архитектуры всё развалится. Тут уже нужна не просто установка плагина, а полноценная доработка сайта под ваш сценарий. Это особенно актуально для проектов на WordPress и Bitrix, где много старых модулей, а код писался в разное время разными людьми.
Автоматизация проверки UTM и контроль качества
Я всегда за автоматизацию. Если UTM у вас важны для денег, их надо контролировать автоматически. У меня были проекты, где мы раз в сутки проверяли, сколько лидов пришло без UTM, сколько кампаний ушло в неизвестный источник и где возникли разрывы между формой и CRM. Это простая, но очень полезная дисциплина.
Один из рабочих способов — логировать входящие заявки в отдельную таблицу. Вот пример SQL-структуры, которую я часто использую как основу:
CREATE TABLE lead_utm_log (
id BIGINT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
lead_id BIGINT UNSIGNED NULL,
source VARCHAR(100) NULL,
medium VARCHAR(100) NULL,
campaign VARCHAR(255) NULL,
content VARCHAR(255) NULL,
term VARCHAR(255) NULL,
utm_id VARCHAR(100) NULL,
landing_url TEXT NULL,
referrer TEXT NULL,
client_id VARCHAR(100) NULL,
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
После этого можно строить отчёты хоть в BI, хоть в CRM, хоть в отдельной админке. Иногда я дополнительно добавляю cron-задачу, которая проверяет, что все формы отправляют UTM, а если нет — пишет в Telegram. И это реально экономит деньги. Потому что баг с потерянной меткой на лендинге может незаметно слить бюджет за 2–3 дня.
Если нужна серьёзная настройка контроля, я бы рядом ставил мониторинг ошибок фронтенда и API. Например, Sentry для JavaScript-ошибок, а ещё логирование отказов отправки формы. И да, если у вас проекты с высокой нагрузкой, имеет смысл связать это с очередями задач. На Laravel это вообще нормальная практика, и я бы даже сказал — обязательная.
Что сделать прямо сейчас, если UTM у вас до сих пор «живут сами по себе»
Если у вас аналитика и CRM ещё не связаны нормально, я бы не откладывал. Сначала приведите к единому виду структуру UTM, потом проверьте, как они сохраняются на сайте, затем убедитесь, что CRM принимает и хранит метки в отдельных полях. После этого уже имеет смысл строить сквозные отчёты и считать ROMI. Иначе вы просто будете смотреть на красивые, но бесполезные цифры.
На моей практике лучший результат даёт связка из четырёх вещей: единый стандарт меток, cookie/localStorage на сайте, структурированные поля в CRM и регулярная проверка целостности данных. Всё остальное — вторично. Можно поставить хоть десять сервисов аналитики, но если UTM теряются на первом же редиректе, толку не будет.
Если вам нужна не просто консультация, а реальная настройка и внедрение, я бы смотрел в сторону поддержки Bitrix или поддержки WordPress в зависимости от CMS. Часто задача решается за один-два рабочих дня, если сайт не перепилен десятком подрядчиков и не обвешан конфликтующими плагинами. А если нужно добраться до причины потерь лидов глубже, то без технического разбора и точечной доработки сайта обычно не обойтись.
И ещё один совет из опыта: не пытайтесь внедрить всё сразу «на проде» без тестового стенда. Сначала staging, потом проверка формы, потом передача в CRM, потом отчёты. Иначе получите тот самый звонок в пятницу вечером, когда менеджеры видят пустые поля, а маркетолог обвиняет разработчика. Я такие истории видел не раз, и лучше их не повторять.
Хотите настроить UTM-метки без потери данных?
Поможем выстроить корректную разметку ссылок, аналитику и передачу UTM-меток в CRM для точного учёта заявок.
