Когда маркетолог говорит «давайте отслеживать всё», разработчик обычно слышит «давайте усложним жизнь прямо сегодня». И, как ни странно, оба правы. Потому что базовых целей в Яндекс.Метрике вроде «клик по кнопке» или «отправка формы» хватает ровно до того момента, пока бюджет на рекламу не становится больше бюджета на кофе в офисе.

В прошлой статье я рассмотрел самый простой вариант кастомизации целей, когда мы начинаем собирать не просто факт отправки, например, формы, но и смысл, с какими доп параметрами эта форма отправлялась. Сегодня рассмотрим вариант, когда события произошедшие уже офлайн, отправляются обратно в онлайн статистику Яндекс Метрики и обогащают ее. Это позволит делать рекламу и собирать аудитории в Яндекс Директе точнее еще на 30-35%.
А в своем Телеграм канале пишу еще больше про всякое из реального маркетинга.
Что это такое
Это способ подтянуть в Метрику данные о событиях, которые произошли за пределами сайта: звонки, сделки в CRM, визиты в шоурум.
Зачем это нужно маркетологам
Чаще всего это нужно для учёта продаж, которые закрывает отдел продаж — например, в B2B, недвижимости или автосфере. Также часто используется связка «онлайн-заявка → подтверждённая сделка в CRM», чтобы видеть реальный результат рекламных кампаний. Ещё один пример — коллтрекинг с последующей привязкой звонка к конкретному визиту на сайте.
Ограничения
Нужен ClientID или UserID, чтобы связать офлайн-событие с визитом. Т.е. стоит позаботиться его сбором заранее.
Данные попадают в Метрику с задержкой (до 6 часов).
100% соответствие визитов и офлайн-событий не всегда достижимо. Более того потеря до 20% конверсий вполне нормальна.
Пример кода (Python, загрузка CSV в Метрику через API)
# Токен и ID счётчика
TOKEN = "ваш_oauth_токен"
COUNTER_ID = "12345678"
# CSV-файл с офлайн-конверсиями
files = {
'file': open('offline_conversions.csv', 'rb')
}
# Запрос к API Метрики
url = f"https://api-metrika.yandex.net/management/v1/counter/{COUNTER_ID}/offline_conversions/upload"
headers = {
"Authorization": f"OAuth {TOKEN}"
}
response = requests.post(url, headers=headers, files=files)
print(response.status_code)
print(response.json())
Кейc: автосалон и подтверждённые заявки
Представим (на самом деле даже не представим, а у меня был совершенно конкретный автосалон, но он пожелал остаться инкогнито))) автосалон, который получает лиды с сайта через форму «Запишись на тест-драйв». Пользователь оставляет заявку онлайн, но окончательная сделка закрывается офлайн, когда менеджер договаривается о покупке автомобиля.
Задача: привязать каждую офлайн-сделку к визиту, чтобы маркетолог видел, какие каналы приносят реальные продажи, а не просто заявки.
Для этого нужен ClientID или UserID, который мы собираем на сайте сразу при заполнении формы.
Скрипт для сбора ClientID и UserID
// Получаем ClientID Метрики
ym(12345678, 'getClientID', function(clientId) {
// Генерация собственного UserID для авторизованных пользователей
function getOrCreateUserId() {
// Обычно UserID берём из авторизации на сайте
// Если нет, генерируем уникальный
return 'user_' + Date.now() + '_' + Math.floor(Math.random()*1000);
}
var userId = getOrCreateUserId();
// Формируем строку CSV: client_id,user_id,timestamp
var timestamp = new Date().toISOString();
var csvLine = `"${clientId}","${userId}","${timestamp}"\n`;
// Отправляем CSV на сервер через fetch для последующего хранения
fetch('/save_ids_csv', {
method: 'POST',
headers: {
'Content-Type': 'text/csv'
},
body: csvLine
})
.then(response => console.log('ClientID/UserID сохранены в CSV', response.status))
.catch(error => console.error('Ошибка при сохранении ClientID/UserID', error));
});
В скрипте привел пример как собирать их просто в таблику, дальше уже модифицируете самостоятельно, чтобы собирать это все в вашу CRM.
Теперь у нас есть постоянный ClientID для визита и уникальный UserID для зарегистрированного пользователя. Эти значения сохраняются локально и потом передаются при загрузке офлайн-конверсий.
Пример загрузки офлайн-конверсии в Метрику (Python, CSV через API)
CSV может выглядеть так:
client_id,user_id,goal_name,goal_time,param1,param2
1234567890,,test_drive,2025-08-18T12:34:00,car_model:BMW_X5,deal_amount:55000
, user_987654321,test_drive,2025-08-18T12:50:00,car_model:Audi_Q7,deal_amount:72000
Python-код для загрузки:
import requests
TOKEN = "ваш_oauth_токен"
COUNTER_ID = "12345678"
files = {
'file': open('offline_conversions.csv', 'rb')
}
url = f"https://api-metrika.yandex.net/management/v1/counter/{COUNTER_ID}/offline_conversions/upload"
headers = {
"Authorization": f"OAuth {TOKEN}"
}
response = requests.post(url, headers=headers, files=files)
print(response.status_code)
print(response.json())
Настройки в Метрике
-
Цели, по которым будут загружаться офлайн-конверсии, должны быть созданы заранее в интерфейсе Метрики.
-
В настройках счётчика убедитесь, что разрешено использовать API для загрузки офлайн-конверсий. Настройка → Загрузка данных
Для корректной привязки событий к визитам обязательно передавать ClientID или UserID.
Для удобного анализа создайте отдельные сегменты по типу офлайн-конверсий и параметрам (car_model, deal_amount), чтобы маркетолог сразу считал ROI по каналам.
Где смотреть результат в Метрике
В отчётах Метрики выберите счётчик, куда загружали офлайн-конверсии.
Перейдите в Отчёты → Цели. Здесь будут видны все события, включая офлайн-конверсии, с переданными параметрами (param1, param2).
Если хотите связать визиты с офлайн-событиями по UserID, нужно убедиться, что этот параметр передаётся в CSV и корректно отображается в отчётах.
На сегодня пока достаточно. В следующий раз поговорим об уровне когда вы становитесь полновластным владельцем визитов своих пользователей на сайте и вручную можете отправлять в статистику любые важные для вас данные, не только на сайте, но и за пределами его в любых других системах, без каких-либо ограничений, главное не забывайте собирать user и clientID.