Автоматизация учета офлайн-конверсий через API Яндекс.Метрики

2026-02-05 10:33:09 Время чтения 7 мин 421

Задача: перевести процесс учета офлайн-конверсий из ручного режима в полностью автоматизированный. Создать систему, которая ежедневно собирает данные о звонках и заказах из CRM (система управления взаимоотношениями с клиентами), формирует отчет и загружает его в Яндекс.Метрику с минимальным участием человека.

При ручной загрузке CSV (простой текстовый формат для хранения табличных данных) могут возникать сложности:

  1. еженедельная ручная подготовка файлов может занимать 2-3 часа работы аналитика;
  2. человеческий фактор может приводить к ошибкам в форматах дат и идентификаторов;
  3. задержка в загрузке данных может достигать 3-5 дней, что мешает оперативной оптимизации рекламных кампаний;
  4. сложности с масштабированием: при росте количества конверсий ручная обработка становится сложной.

Шаг 1: Определение параметров (5-10 минут)

Определились с типом офлайн-конверсии и типом идентификатора. Типы офлайн-конверсий:

  1. лид (звонок, заявка);
  2. покупка;
  3. сделка.

Типы идентификаторов согласно документации Яндекс.Метрики:

  1. ClientID и UserID (идентификатор клиента и кастомный идентификатор пользователя, который вы задаете сами) – офлайн-конверсии добавляются к последнему визиту посетителя. Пример: если были визиты 1, 5 и 11 марта, а покупка была 10 марта, то конверсия привяжется к визиту 5 марта;
  2. yclid (идентификатор рекламного клика из Яндекс.Директа) – конверсии привязываются к визиту от конкретного рекламного объявления;
  3. PurchaseId (идентификатор покупки) – конверсии привязываются к визиту с онлайн-покупкой.

Использовать решили ClientID или UserID как самый распространенный способ.

Шаг 2: Получение и сохранение идентификаторов (сроки варьируются)

Реализовали получение ClientID или UserID. Это отдельная тема, требующая настройки на сайте и в CRM-системе. Необходимо обеспечить сохранение идентификаторов для последующей идентификации офлайн-конверсий.

Здесь время реализации зависит от знаний разработчика. Может занимать долгое время, если специалист не знаком с темой.

Шаг 3: Создание цели в Яндекс.Метрике (1 минута)

Создали цель типа «Javascript-событие» в Яндекс.Метрике. Придумали уникальный идентификатор цели (например, GOAL1), который будем использовать далее. Для цели можно указать ценность.

Шаг 4: Автоматическое формирование CSV-файла (от <1 минуты)

Вместо ручного создания 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())

Шаг 5: Автоматическая загрузка через API (программный интерфейс приложения) (1-2 минуты + обработка)

На этом этапе настроили автоматическую отправку данных через API Яндекс.Метрики. Процесс:

  1. получили OAuth-токен для работы с API Яндекс.Метрики;
  2. написали скрипт отправки 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}")

Какие бизнес-эффекты дает автоматизация учета офлайн-конверсий через API Яндекс.Метрики

Полностью автоматизированный процесс учета офлайн-конверсий обеспечивает точную атрибуцию и позволяет оптимизировать рекламные кампании на основе полных данных:

1. Оперативная оптимизация рекламы: Данные об офлайн-конверсиях доступны гораздо быстрее, что позволяет:

  1. быстро отключать неэффективные рекламные кампании;
  2. увеличивать бюджеты на рабочие каналы;
  3. тестировать гипотезы с быстрой обратной связью.

2. Точная атрибуция: автоматическая система устраняет человеческие ошибки, что приводит к:

  1. более точному расчету ROI по каждому каналу;
  2. корректному распределению бюджета между онлайн и офлайн активностями;
  3. возможности использовать данные для автоматических ставок в Яндекс.Директ.

3. Масштабирование: система легко адаптируется под рост бизнеса:

  1. обрабатывает 100 и 10 000 конверсий с одинаковой скоростью;
  2. легко добавляются новые типы конверсий;
  3. возможность интеграции с дополнительными CRM.

Автоматизация офлайн-конверсий – это не роскошь, а необходимость для любого бизнеса с офлайн-продажами. Ручная обработка данных не масштабируется и приводит к ошибкам.

Можно начать с автоматизации самого важного типа конверсий (например, звонков), отладить процесс, а затем постепенно добавить другие типы. Это минимизирует риски и позволит быстрее получить первые результаты.