ClientID и yclid: как заявка связывается с рекламой

Вся история с офлайн-конверсиями держится на одном: чтобы вернуть сделку в рекламу, нужно точно знать, к какому визиту она относится. Не «примерно к тому дню», а к конкретному заходу конкретного человека. За эту связь отвечают два идентификатора — ClientID и yclid. Разберу, чем они отличаются и почему их нельзя путать.
Тема кажется технической, но без неё офлайн-конверсии просто не работают: заявка без идентификатора никуда не привяжется, и Директ её не увидит. Если вы ещё не читали общий разбор, начните с руководства по офлайн-конверсиям в Яндекс.Директ — там картина целиком.
yclid — метка клика по рекламе
yclid (Yandex Click ID) — это метка, которую Директ добавляет к ссылке объявления. Человек кликнул по рекламе — в адресе появился длинный параметр yclid. Это самый точный способ сказать «этот визит пришёл вот с этого клика по вот этому объявлению».
Но у yclid есть два ограничения. Первое: он появляется только у переходов с рекламы. Пришёл человек из поиска, из закладок, по прямой ссылке — yclid нет. Второе: чтобы Метрика нашла визит по yclid, счётчик должен быть связан с Директом. Если связки нет, метка есть, а привязки не будет. У меня однажды именно на этом заявка не привязалась — yclid был, а связка счётчика с Директом настроена не до конца.
ClientID — идентификатор Метрики
ClientID — это собственный идентификатор Метрики. Счётчик присваивает его браузеру при первом заходе и хранит в куке _ym_uid. По сути это «кто вы для Метрики». Он есть у любого визита — рекламного, органического, прямого, — потому что его ставит сам счётчик, а не реклама.
Отсюда и его сила: ClientID не зависит от источника. Даже если человек пришёл не с рекламы, а вы всё равно хотите отдать по нему конверсию, ClientID это позволит. Это тот же идентификатор, который вы видите в отчётах Метрики по пользователям.
Что выбрать при выгрузке: ClientID важнее
Когда вы отдаёте офлайн-конверсию, у заявки может быть и то, и другое. Какой идентификатор ставить в файл выгрузки? Моё правило, проверенное на практике: сначала ClientID, и только если его нет — yclid.
Логика такая. ClientID — это собственный идентификатор Метрики, она знает его наверняка. yclid же требует, чтобы счётчик нашёл визит по метке клика, а это работает не всегда. Поэтому ClientID даёт больше привязок. yclid остаётся страховкой на случай, когда ClientID у заявки почему-то пустой.
Практика: у меня был проект, где ClientID стоял всего у одной заявки из двадцати одной, и выгрузка возвращала ошибку «не найдены идентификаторы». Оказалось, идентификатор просто не успевал попасть в заявку.
Почему ClientID «не успевает» в заявку
Самая частая поломка — идентификатор уходит позже, чем событие. запрос getClientID к счётчику отвечает асинхронно: счётчик подумает и вернёт значение через долю секунды. А человек с объявления жмёт на телефон через две-три секунды после загрузки — и клик-заявка успевает уйти раньше, чем счётчик отдал ClientID. В итоге заявка есть, а идентификатора в ней нет.
Как я это лечу:
- Беру ClientID сразу из куки _ym_uid — это он и есть, ждать счётчик не нужно.
- Кеширую его на время визита, чтобы не дёргать счётчик на каждое событие.
- Уточняю у счётчика и, если он ответил позже, досылаю идентификатор отдельным запросом — сервер проставляет его событиям и заявкам этого визита задним числом.
Ещё одна тонкость: ClientID живёт в браузере и относится к посетителю, а не к одному заходу. Поэтому если человек вернётся на сайт снова, старая заявка той же сессии может «дозаправиться» идентификатором. Это нормально и играет в плюс.
Как это связано со звонками
Отдельная ценность идентификаторов — в звонках. Когда человек кликает по номеру на сайте, ClientID уходит на сервер вместе с событием клика. Дальше звонок с рабочего телефона ловит приложение, и клик со звонком склеиваются в одну заявку. У этой заявки уже есть ClientID из клика — значит, звонок, дошедший до сделки, можно вернуть в Директ.
Именно так у меня в Пробите звонок перестаёт быть «тёмной» конверсией: он несёт метки визита и идентификатор, а без подменных номеров. Про саму привязку звонка к визиту я подробнее пишу в статье о том, как привязать звонок к рекламному визиту.
Событие — это не то же, что визит
Ещё одна вещь, которую полезно держать в голове, когда разбираешься с идентификаторами. ClientID относится к браузеру и живёт долго — это скорее «кто вы вообще», чем «этот конкретный заход». Один и тот же человек может зайти сегодня с рекламы, завтра из закладок, послезавтра из поиска, и ClientID у него будет один.
Поэтому цепочку событий одного идентификатора нельзя считать одним визитом. На визиты её режут по паузам: события подряд без перерыва дольше получаса — это один визит, дальше начинается следующий. Для привязки конверсии это важно: вы цепляете сделку не за «человека вообще», а за конкретный визит с его метками. Если в этом визите был yclid — отлично, конверсия уйдёт по клику; если нет — выручает ClientID.
Отсюда же практический вывод: yclid стоит хранить не только в заявке, но и в событиях визита. Тогда, даже если у самой заявки метка потерялась, её можно подставить из события того же захода. Я так и делаю — дублирую метки, потому что «одно место хранения» однажды обязательно окажется пустым в самый неподходящий момент.
Как проверить, что привязка работает
Не полагайтесь на «вроде настроил». Вот что я проверяю на живом сайте:
- Захожу на сайт с рекламного объявления, смотрю, что в адресе появился yclid.
- Смотрю, что первое же событие ушло на сервер с непустым ClientID — а не через пару секунд.
- Кликаю по номеру телефона и проверяю, что клик-заявка несёт и ClientID, и метки визита.
- Через день сверяю в счётчике, что выгруженные конверсии действительно привязались, а не просто «файл принят».
Если на втором шаге ClientID пустой — почти наверняка событие уходит раньше, чем счётчик отдал идентификатор. Лечится это чтением куки и досылкой, о которых я писал выше.
Короткий итог
ClientID — универсальный идентификатор Метрики, он есть у всех и знается наверняка. yclid — точная метка клика по рекламе, но только у рекламных визитов и только при связке с Директом. При выгрузке ставьте ClientID первым, yclid — запасным. И следите, чтобы идентификатор реально попадал в заявку: асинхронность счётчика — главная причина «непривязанных» конверсий. Дальше можно спокойно переходить к настройке самой выгрузки.
Частые вопросы
Чем ClientID отличается от yclid?
ClientID — собственный идентификатор Метрики, он есть у любого визита. yclid — метка клика по рекламе Директа, она появляется только у переходов с объявлений и работает при связке счётчика с Директом.
Что выбрать при выгрузке конверсии?
Сначала ClientID — Метрика знает его наверняка. yclid берётся, когда ClientID нет. Так привязывается больше конверсий.
Где взять ClientID пользователя?
Его можно взять сразу из куки _ym_uid, которую ставит счётчик, а затем уточнить через ym('getClientID'). Ответ приходит асинхронно, поэтому идентификатор стоит кешировать и досылать.
Почему заявка не привязалась к визиту?
Чаще всего у неё пустой идентификатор: событие ушло раньше, чем счётчик успел отдать ClientID. Либо у визита нет yclid, а счётчик не связан с Директом, и по клику Метрика визит не находит.