Яндекс.Метрика роняет Core Web Vitals — что с этим делать?
Почти в каждом аудите скорости сайта всплывает один и тот же пункт: «уберите Яндекс.Метрику, она тормозит сайт». PageSpeed Insights действительно показывает счётчик в списке главных виновников, а после его отключения оценка вырастает на 10–20 баллов. Отсюда вечный спор между маркетологом, которому нужна аналитика, и разработчиком, которому нужны зелёные метрики.
Правда посередине, и она устроена сложнее, чем «Метрика тормозит». Разберём по порядку.
- Сначала проверьте, какой код у вас стоит. Если в исходниках
watch.js— это устаревшая версия, её нужно заменить наtag.js. Это самая частая и самая дешёвая причина проблемы. - Отделяйте лабораторные метрики от полевых. Метрика сильно бьёт по баллу Lighthouse (через TBT), но TBT не входит в Core Web Vitals. Реальные LCP, INP и CLS страдают заметно реже.
- Главный пожиратель ресурсов — не сам счётчик, а Вебвизор. Отключите его там, где он не нужен, и половина проблемы уходит.
- Google Tag Manager не ускоряет сайт. Он даёт управляемость (в том числе отложенную загрузку без своего кода), но добавляет собственный вес.
- Ленивая загрузка — крайняя мера для старых сайтов. Работает, но стоит части данных. Соглашайтесь на неё осознанно.
Часть 1. Где проблема настоящая, а где мнимая
Заголовок раздела «Часть 1. Где проблема настоящая, а где мнимая»Что именно измеряет PageSpeed
Заголовок раздела «Что именно измеряет PageSpeed»Отчёт PageSpeed Insights состоит из двух блоков, и их постоянно путают.
Лабораторные данные (Lighthouse) — синтетический прогон на эмуляции медленного мобильного устройства с четырёхкратным замедлением процессора. Именно отсюда берётся цветной балл от 0 до 100. Больше всего в этом балле весит TBT (Total Blocking Time) — суммарное время, на которое главный поток был заблокирован выполнением JavaScript.
Любой сторонний скрипт бьёт по TBT почти линейно: он должен скачаться, распарситься и выполниться. Метрика — не исключение.
Полевые данные (CrUX) — реальные замеры у реальных пользователей за последние 28 дней. Это и есть Core Web Vitals: LCP (когда отрисовался главный элемент), INP (насколько быстро страница отвечает на действия) и CLS (сдвиги вёрстки).
Ключевой факт: TBT не входит в Core Web Vitals. Балл Lighthouse не является фактором ранжирования. Фактором ранжирования являются полевые LCP, INP и CLS.
Что это значит на практике
Заголовок раздела «Что это значит на практике»Типичная картина: балл Lighthouse падает с 92 до 74 при подключении Метрики, а полевые CWV остаются зелёными. Формально сайт не стал хуже для поиска — стало хуже число в отчёте.
Но это не значит, что проблемы нет вовсе. Метрика реально ухудшает CWV в трёх случаях:
- Скрипт подключён блокирующе. Если счётчик вставлен без
async, браузер останавливает разбор HTML и ждёт загрузки — страдает LCP. Современный код Метрики ставитasyncсам, но на старых сайтах и в самописных обёртках это регулярно ломают. - Включён Вебвизор. Запись сессии постоянно отслеживает мутации DOM, движения курсора и ввод. На слабых мобильных это заметная нагрузка на главный поток — то есть прямой удар по INP.
- Счётчиков несколько. Классика: код вшит в шаблон, а потом ещё раз добавлен через тег-менеджер. Двойной вес, двойное выполнение и заодно испорченная статистика.
Проверять надо по полевым данным. Если сайт молодой и полевых данных нет, ориентируйтесь на замеры INP в реальном браузере, а не на балл Lighthouse.
Часть 2. Решения по возрастанию радикальности
Заголовок раздела «Часть 2. Решения по возрастанию радикальности»Шаг 1. Обновите код счётчика (15 минут, бесплатно)
Заголовок раздела «Шаг 1. Обновите код счётчика (15 минут, бесплатно)»Самая частая причина «Метрика тормозит» — на сайте стоит код десятилетней давности.
Яндекс полностью переписал счётчик: по данным самого Яндекса, размер сборки уменьшился примерно на 45%, а время загрузки — на 20% на десктопе и мобильных. Вебвизор 2.0 переработали так, чтобы запись шла в фоне и не конкурировала с отрисовкой страницы. Побочный эффект: счётчик стал фиксировать короткие визиты, которые раньше не успевали записаться в отчёты, — статистика после обновления может немного вырасти.
Как проверить, какая версия у вас:
- Откройте исходный код страницы и найдите подключение счётчика.
tag.js— актуальная версия, всё в порядке.watch.js— устаревшая, обновляйте.
Актуальный код выглядит так:
<script type="text/javascript"> (function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(XXXXXXXX, "init", { clickmap: true, trackLinks: true, accurateTrackBounce: true, webvisor: false });</script><noscript><div><img src="https://mc.yandex.ru/watch/XXXXXXXX" style="position:absolute; left:-9999px;" alt="" /></div></noscript>Важные детали:
k.async=1— скрипт грузится асинхронно и не блокирует разбор HTML. Если в вашем коде этого нет, вы нашли проблему.- Скрипт берётся с
mc.yandex.ru. Тем, у кого домен недоступен части аудитории, Яндекс предлагает зеркало на jsDelivr —https://cdn.jsdelivr.net/npm/yandex-metrica-watch/tag.js. - Переустанавливать работающий
tag.jsне нужно: обновления счётчика прилетают автоматически.
Отдельно про параметр defer. В настройках инициализации есть опция defer: true, и её постоянно путают с HTML-атрибутом defer. Она не про загрузку скрипта — она отключает автоматическую отправку данных при инициализации, чтобы отправить их позже вручную. К скорости загрузки отношения не имеет.
Шаг 2. Отключите то, чем не пользуетесь
Заголовок раздела «Шаг 2. Отключите то, чем не пользуетесь»Метрика — модульная. Стоимость каждого модуля разная.
| Опция | Что делает | Цена по скорости |
|---|---|---|
| Базовый хит | Отправляет визит | Минимальная |
clickmap | Карта кликов | Низкая |
trackLinks | Внешние переходы | Низкая |
accurateTrackBounce | Точный отказ (таймер 15 с) | Низкая |
webvisor | Запись сессий | Высокая |
ecommerce | Данные о заказах | Зависит от объёма dataLayer |
Практическое правило: Вебвизор — это инструмент разбора, а не мониторинга. Он нужен, когда вы садитесь смотреть, как люди проходят конкретную форму или страницу оформления. Держать его включённым круглосуточно на всех страницах — платить производительностью за записи, которые никто не откроет.
Варианты:
- Включать Вебвизор только на ключевых страницах (корзина, оформление, длинная форма).
- Включать его периодами — на неделю сбора данных перед разбором, потом выключать.
- Оставить включённым, если сайт лёгкий и полевые метрики зелёные: не чините то, что не сломано.
Заодно найдите и удалите дубли: поиском по исходному коду страницы по mc.yandex.ru и ym( должно находиться ровно одно подключение.
Шаг 3. Тег-менеджер: управляемость, а не скорость
Заголовок раздела «Шаг 3. Тег-менеджер: управляемость, а не скорость»Официально поддерживаемых способа установки два: код на всех страницах и установка через тег-менеджер. Google Tag Manager подходит для второго — в галерее шаблонов есть готовый шаблон Яндекс.Метрики, а сам GTM Метрика официально поддерживает.
Что GTM реально даёт:
- Управление счётчиком и целями без правок кода сайта.
- Условия срабатывания: можно повесить Метрику на триггер
Window Loadedили на таймер — то есть получить отложенную загрузку без единой строки собственного кода. - Один контейнер вместо россыпи скриптов от рекламных кабинетов.
Чего GTM не даёт — ускорения. Контейнер сам весит около сотни килобайт и тоже выполняется в главном потоке. Если у вас на сайте один счётчик, вы добавите вес, а не уберёте. GTM окупается с третьего-четвёртого стороннего скрипта.
Отдельно стоит учитывать, что googletagmanager.com из России грузится нестабильно — для проекта, у которого вся аудитория российская, это дополнительный риск: пропадёт контейнер — пропадёт вся аналитика разом, а не один счётчик.
Вывод: ставьте через GTM, если у вас уже есть GTM и много тегов. Не заводите GTM ради ускорения Метрики.
Шаг 4. Ленивая загрузка — крайняя мера
Заголовок раздела «Шаг 4. Ленивая загрузка — крайняя мера»Подходит для старых сайтов, где нельзя тронуть шаблон, где балл PageSpeed нужен для отчёта, и где уже перепробовано всё выше.
Идея: не грузить счётчик при загрузке страницы, а дождаться первого действия пользователя (скролл, касание, клик, движение мыши) либо таймера как страховки. К этому моменту LCP уже отрисован, и Lighthouse считает свои метрики по «чистой» странице.
(function () { 'use strict';
var loadedMetrica = false, metricaId = XXXXXXXX, timerId;
// Бот Метрики должен увидеть счётчик сразу, иначе проверка установки не пройдёт if (navigator.userAgent.indexOf('YandexMetrika') > -1) { loadMetrica(); } else { window.addEventListener('scroll', loadMetrica, {passive: true}); window.addEventListener('touchstart', loadMetrica); document.addEventListener('mouseenter', loadMetrica); document.addEventListener('click', loadMetrica); document.addEventListener('DOMContentLoaded', loadFallback); }
function loadFallback() { timerId = setTimeout(loadMetrica, 1000); }
function loadMetrica() { if (loadedMetrica) return;
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)}; m[i].l=1*new Date(); k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)}) (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
ym(metricaId, "init", {clickmap: true, trackLinks: true, accurateTrackBounce: true});
loadedMetrica = true; clearTimeout(timerId);
window.removeEventListener('scroll', loadMetrica); window.removeEventListener('touchstart', loadMetrica); document.removeEventListener('mouseenter', loadMetrica); document.removeEventListener('click', loadMetrica); document.removeEventListener('DOMContentLoaded', loadFallback); }})();Ключевая деталь, которую чаще всего забывают, — проверка на бота Метрики. Без неё Яндекс не находит счётчик и помечает его как неустановленный.
Чем вы за это платите — честный список:
- Недосчёт визитов. Пользователь, который открыл страницу и закрыл её, не пошевелив мышью, не попадёт в статистику. При задержке в секунду погрешность обычно единицы процентов; при трёх секундах — заметно больше.
- Искажение показателя отказов. Счётчик стартует только у тех, кто хоть как-то взаимодействовал со страницей. Отказы механически падают, и данные до и после внедрения несравнимы.
- Вебвизор теряет начало сессии. Записи начинаются с момента первого действия, самое интересное — первые секунды на странице — пропадает.
- Риск для рекламы. Если на Метрике завязаны конверсии Директа, ретаргетинг или офлайн-конверсии, недосчёт визитов бьёт по оптимизации кампаний. Это самая дорогая часть цены, и её обычно недооценивают.
Именно поэтому это крайняя мера, а не оптимизация по умолчанию. Если сайт живёт на платном трафике — сначала посчитайте, что дороже: пара баллов Lighthouse или сбитая оптимизация кампаний.
Про Partytown — коротко
Заголовок раздела «Про Partytown — коротко»В экосистеме Astro есть интеграция @astrojs/partytown, которая уносит сторонние скрипты в Web Worker и полностью снимает нагрузку с главного потока. Звучит как идеальное решение.
На практике с Метрикой работает частично: базовые хиты проходят, а Вебвизор и карта кликов, которым нужен прямой доступ к DOM, ломаются или отдают неполные данные. Рассматривайте это как эксперимент под замер, а не как готовое решение. Обязательно проверьте отчёты Метрики после подключения — тишина в отчётах здесь худший сценарий, чем медленный сайт.
Часть 3. Итого: в каком порядке действовать
Заголовок раздела «Часть 3. Итого: в каком порядке действовать»Пройдите по списку сверху вниз и остановитесь там, где результат вас устроил.
- Замерьте полевые данные, а не балл. Откройте PageSpeed Insights и посмотрите блок реальных данных CrUX. Если LCP, INP и CLS зелёные — у вас проблема с цифрой в отчёте, а не со скоростью сайта. Дальше можно не идти.
- Найдите код счётчика в исходниках.
watch.js→ заменить наtag.js. Нетk.async=1→ добавить. Счётчиков больше одного → оставить один. - Проверьте место вставки. Код должен идти в
<head>или в конце<body>— но не в середине разметки первого экрана и не внутри синхронного бандла. - Отключите Вебвизор на страницах, где вы его не разбираете. Перезамерьте INP.
- Пересмотрите остальные опции инициализации. Отключите
ecommerce, если вы не работаете с электронной торговлей, иclickmap, если картой кликов никто не пользуется. - Перезамерьте. На этом этапе большинство сайтов уже приходит в норму. Если да — остановитесь.
- Оцените, нужен ли GTM. Если сторонних скриптов много (Метрика, пиксели соцсетей, коллтрекинг, чат) — контейнер имеет смысл, и через триггер
Window Loadedвы получите отложенную загрузку бесплатно. Если скрипт один — не надо. - Только если ничего не помогло — ленивая загрузка. Перед внедрением зафиксируйте текущие цифры визитов и отказов, чтобы потом понимать масштаб потерь. И не трогайте, если на Метрике завязана оптимизация платного трафика.
Что мы думаем об этом
Заголовок раздела «Что мы думаем об этом»Три вещи, которые стоит держать в голове дольше, чем этот чек-лист.
Метрика редко бывает главной проблемой. Когда сайт медленный по-настоящему, счётчик стоит четвёртым-пятым в списке причин. Впереди почти всегда: неоптимизированные картинки, шрифты без font-display, тяжёлая тема CMS с десятком плагинов и отсутствие кэширования. Оптимизация начинается не с аналитики.
Балл PageSpeed — не цель. Цель — чтобы страница быстро открывалась и отвечала на действия у реальных людей на реальных телефонах. Балл — приблизительный индикатор, и гонка за ним ради круглой цифры регулярно приводит к решениям, которые вредят бизнесу: отключённой аналитике, сломанному ретаргетингу, отчётам, которым нельзя верить.
Аналитика, которой нельзя доверять, хуже её отсутствия. Ленивая загрузка даёт зелёный балл и статистику с систематическим смещением. Если по этой статистике потом принимаются решения о бюджете — экономия на паре баллов обойдётся дороже любого тормозящего скрипта.
Если сомневаетесь — начинайте с шагов 1–5. Они бесплатны, обратимы и в большинстве случаев закрывают вопрос.
Смежные материалы
Заголовок раздела «Смежные материалы»- Стратегия разработки сайта: четыре этапа от смысла к впечатлению — почему производительность фиксируется до анимаций, а не после.
- Миграция сайта на новую платформу без потери SEO — что ещё нельзя терять при переезде.
- Astro.js для контентных сайтов — платформа, на которой описанная проблема почти не возникает.