Спасибо! Ваша заявка успешно отправлена.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.
Задача: отказаться от ручного учета офлайн-конверсий и перевести этот процесс в автоматический режим. Нужно было выстроить систему, которая каждый день получает из CRM данные о звонках и заказах, формирует файл в нужном формате и отправляет его в Яндекс.Метрику почти без участия специалиста.
Ручная загрузка CSV-файлов удобна только на старте, пока объем данных небольшой. Как только конверсий становится больше, у такого подхода быстро проявляются слабые места. Подготовка файлов вручную может занимать у аналитика по несколько часов в неделю. Дополнительно возникает риск ошибок: можно неверно указать дату, перепутать идентификатор или допустить сбой в структуре файла. Еще одна проблема — задержка в передаче данных. Пока отчет подготовят, проверят и загрузят, проходит несколько дней, а это уже мешает оперативно корректировать рекламные кампании. При росте числа обращений и заказов ручной процесс становится все менее управляемым и плохо масштабируется.
Сначала необходимо было определить, какие именно офлайн-действия будут передаваться в Яндекс.Метрику. В качестве конверсий можно использовать лиды, покупки или сделки — в зависимости от бизнес-логики компании и структуры CRM.
После этого выбирается идентификатор, по которому офлайн-действие будет связываться с визитом пользователя на сайт. Документация Яндекс.Метрики предусматривает несколько вариантов. Первый — ClientID или UserID. В этом случае офлайн-конверсия привязывается к последнему подходящему визиту пользователя. Например, если человек заходил на сайт 1, 5 и 11 марта, а покупку совершил 10 марта, то система свяжет конверсию с визитом 5 марта. Второй вариант — yclid, то есть идентификатор рекламного клика из Яндекс.Директа. Тогда офлайн-конверсия будет относиться к конкретному объявлению. Третий вариант — PurchaseId, который используется для привязки к определенной онлайн-покупке.
В данном случае в качестве основного решения были выбраны ClientID или UserID, поскольку именно такой способ чаще всего используется на практике и подходит для большинства сценариев.
Следующий этап — обеспечить сбор и хранение выбранного идентификатора. Для этого требуется настройка как на стороне сайта, так и внутри CRM. Важно не просто получить ClientID или UserID в момент визита пользователя, но и сохранить его в карточке клиента, чтобы в дальнейшем можно было корректно связать офлайн-событие с конкретным визитом.
Это уже техническая задача, и сроки её реализации напрямую зависят от опыта разработчика. Если специалист уже сталкивался с такой интеграцией, настройка проходит быстро. Если нет, процесс может заметно затянуться. Но без этого шага полноценная автоматизация невозможна, потому что именно идентификатор становится основой для корректной передачи данных в Метрику.
После настройки идентификаторов необходимо подготовить саму Метрику к приему офлайн-конверсий. Для этого в счетчике создается цель типа «JavaScript-событие». Ей задается уникальное имя, например GOAL1, которое потом будет использоваться в передаваемых данных. При необходимости можно сразу указать и ценность цели, если в аналитике важно учитывать денежный эквивалент конверсии.
По сути, эта цель становится точкой, к которой впоследствии будут привязываться все автоматически загружаемые офлайн-действия.
Чтобы исключить ручную подготовку отчета, был настроен автоматический сценарий формирования CSV-файла. Источником данных может выступать сама CRM или отдельный скрипт, который преобразует данные в формат, подходящий для Яндекс.Метрики.
Ниже приведен пример такой реализации на Python:
import csv
import time
from datetime import datetime
def prepare_offline_conversions(crm_data, target_name="offline_order"):
"""
Преобразует данные из CRM в формат Яндекс.Метрики
Параметры:
crm_data: список словарей с полями ['user_id', 'order_date', 'amount']
target_name: имя цели из Метрики
Возвращает:
список словарей для записи в CSV
"""
conversions = []
current_ts = int(time.time())
for row in crm_data:
if not row.get('user_id'):
print(f"⚠️ Пропущена запись без user_id: {row}")
continue
dt = datetime.strptime(row['order_date'], "%Y-%m-%d %H:%M:%S")
timestamp = int(dt.timestamp())
if timestamp > current_ts:
print(f"⚠️ Пропущена будущая дата: {row['order_date']} (timestamp: {timestamp})")
continue
conversion = {
"UserId": row['user_id'],
"Target": target_name,
"DateTime": timestamp,
"Price": f"{float(row['amount']):.2f}",
"Currency": "RUB"
}
conversions.append(conversion)
return conversions
if __name__ == "__main__":
crm_orders = [
{"user_id": "user_789", "order_date": "2026-02-01 14:30:00", "amount": "15990.50"},
{"user_id": "user_456", "order_date": "2026-02-02 09:15:00", "amount": "8450.00"},
{"user_id": "user_123", "order_date": "2026-02-02 18:22:00", "amount": "12300.75"}
]
conversions = prepare_offline_conversions(crm_orders, target_name="offline_order")
with open("offline-conversions.csv", "w", encoding="utf-8", newline='') as f:
writer = csv.DictWriter(f, fieldnames=["UserId", "Target", "DateTime", "Price", "Currency"])
writer.writeheader()
writer.writerows(conversions)
print(f"✅ Подготовлено {len(conversions)} конверсий")
print("Файл сохранён: offline-conversions.csv")
print("\nСодержимое файла:")
with open("offline-conversions.csv", "r", encoding="utf-8") as f:
print(f.read())
В результате файл создается автоматически и уже не требует участия аналитика на каждом этапе. Это снимает рутинную нагрузку и снижает вероятность ошибок при подготовке данных.
После формирования CSV-файла остается автоматизировать его передачу в Яндекс.Метрику. Для этого используется API сервиса. На практике процесс состоит из двух частей: получения OAuth-токена для доступа и настройки скрипта, который отправляет POST-запрос с файлом.
Пример такого запроса может выглядеть так:
import requests
counter = 123456
token = "ваш_oauth_token"
with open("offline-conversions.csv", "rb") as f:
url = f"https://api-metrika.yandex.net/management/v1/counter/{counter}/offline_conversions/upload"
headers = {"Authorization": f"OAuth {token}"}
response = requests.post(url, headers=headers, files={"file": f})
print(f"Загружено: {response.status_code}")
После этого система может ежедневно в автоматическом режиме формировать файл и сразу отправлять его в Метрику. Данные попадают в аналитику быстрее, а команда получает актуальную информацию без лишних ручных действий.
Полная автоматизация учета офлайн-конверсий дает не только техническое удобство, но и ощутимый бизнес-эффект.
Во-первых, компания получает возможность быстрее реагировать на результаты рекламы. Когда данные о звонках и продажах поступают почти без задержки, можно оперативно отключать слабые кампании, усиливать те каналы, которые реально приводят клиентов, и быстрее проверять новые гипотезы.
Во-вторых, повышается точность атрибуции. Автоматическая передача сведений снижает влияние человеческого фактора, а значит, аналитика становится надежнее. Это помогает корректнее считать ROI по каждому источнику трафика, грамотнее распределять бюджеты между онлайн- и офлайн-активностями и использовать данные для автоматических стратегий в Яндекс.Директе.
В-третьих, решение легко масштабируется. Для автоматизированной системы нет принципиальной разницы между сотней и десятью тысячами конверсий — обработка будет происходить по одному и тому же сценарию. При необходимости можно подключать новые типы офлайн-событий и расширять интеграцию на дополнительные CRM-системы.
Автоматизация учета офлайн-конверсий через API Яндекс.Метрики — это уже не просто удобное техническое решение, а необходимый шаг для бизнеса, в котором продажи происходят не только онлайн. Ручной процесс быстро упирается в ограничения: он отнимает время, плохо масштабируется и создает почву для ошибок.
Оптимальный подход — начать с самого важного типа конверсий, например со звонков или подтвержденных заказов. После отладки процесса можно постепенно подключать остальные сценарии. Такой путь позволяет снизить риски, быстрее получить первые результаты и выстроить устойчивую систему аналитики, которая действительно помогает принимать решения, а не просто собирает данные.
Спасибо! Ваша заявка успешно отправлена.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.
18 марта в 11:00 МСК Тандем Групп совместно с Яндекс проведет практический онлайн-вебинар, на тему «Топ-5 мест, где дилер теряет конверсии в контекстной рекламе»
На вебинаре вы узнаете:
Регистрируйтесь, чтобы найти способ увеличить конверсии
Спасибо! Ваша заявка успешно отправлена.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.
Наш менеджер свяжется с Вами в ближайшее время для уточнения всех деталей заявки.