Задача: перевести процесс учета офлайн-конверсий из ручного режима в полностью автоматизированный. Создать систему, которая ежедневно собирает данные о звонках и заказах из CRM (система управления взаимоотношениями с клиентами), формирует отчет и загружает его в Яндекс.Метрику с минимальным участием человека.
При ручной загрузке CSV (простой текстовый формат для хранения табличных данных) могут возникать сложности:
Определились с типом офлайн-конверсии и типом идентификатора. Типы офлайн-конверсий:
Типы идентификаторов согласно документации Яндекс.Метрики:
Использовать решили ClientID или UserID как самый распространенный способ.
Реализовали получение ClientID или UserID. Это отдельная тема, требующая настройки на сайте и в CRM-системе. Необходимо обеспечить сохранение идентификаторов для последующей идентификации офлайн-конверсий.
Здесь время реализации зависит от знаний разработчика. Может занимать долгое время, если специалист не знаком с темой.
Создали цель типа «Javascript-событие» в Яндекс.Метрике. Придумали уникальный идентификатор цели (например, GOAL1), который будем использовать далее. Для цели можно указать ценность.
Вместо ручного создания CSV-файла настроили автоматическую подготовку данных. Файл может формироваться скриптом на Python или быть выгрузкой из сторонней системы (например, CRM).
Пример реализации csv файла:
import csv
import time
from datetime import datetime
def prepare_offline_conversions(crm_data, target_name="offline_order"):
"""
Преобразует данные из CRM в формат Яндекс.Метрики
Параметры:
crm_ список словарей с полями ['user_id', 'order_date', 'amount']
target_name: имя цели из Метрики
Возвращает:
список словарей для записи в CSV
"""
conversions = []
current_ts = int(time.time())
for row in crm_data: # ← исправлено: двоеточие и правильное имя переменной
# Проверка наличия обязательного поля user_id
if not row.get('user_id'):
print(f"⚠️ Пропущена запись без user_id: {row}")
continue
# Парсим дату из формата "2026-02-01 14:30:00"
dt = datetime.strptime(row['order_date'], "%Y-%m-%d %H:%M:%S")
# Конвертируем в Unix timestamp (целое число секунд)
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, # ← целое число Unix timestamp
"Price": f"{float(row['amount']):.2f}",
"Currency": "RUB"
}
conversions.append(conversion)
return conversions
# Пример использования
if __name__ == "__main__":
# Данные из CRM (только с user_id)
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")
# Запись CSV
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())
На этом этапе настроили автоматическую отправку данных через API Яндекс.Метрики. Процесс:
Пример реализации:
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}")
Полностью автоматизированный процесс учета офлайн-конверсий обеспечивает точную атрибуцию и позволяет оптимизировать рекламные кампании на основе полных данных:
1. Оперативная оптимизация рекламы: Данные об офлайн-конверсиях доступны гораздо быстрее, что позволяет:
2. Точная атрибуция: автоматическая система устраняет человеческие ошибки, что приводит к:
3. Масштабирование: система легко адаптируется под рост бизнеса:
Автоматизация офлайн-конверсий – это не роскошь, а необходимость для любого бизнеса с офлайн-продажами. Ручная обработка данных не масштабируется и приводит к ошибкам.
Можно начать с автоматизации самого важного типа конверсий (например, звонков), отладить процесс, а затем постепенно добавить другие типы. Это минимизирует риски и позволит быстрее получить первые результаты.