Офлайн-конверсия Яндекс.Метрики. Теряются выполнения целей в Метрике

Илья Нагичев | 14.11.2018

Яндекс выделяет следующие сферы применения офлайн-конверсий:

  • Посещения и покупки в офлайн-точках — связывает действия пользователя в онлайн и офлайн. Например, может определить, что пользователь после просмотра интернет-магазина пришел в магазин лично и совершил покупку.
  • Невозможность обработки факта оплаты на стороннем сайте
  • Процесс обработки заявки

Как раз процесс обработки такой заявки рассмотрим на примере достижения пользователем цели.

При вызове метода reachGoal происходит отправка данных о достижении цели пользователем на сервера Яндекса. И тут есть много факторов, из-за которых цель может не зафиксироваться.

Выгрузка офлайн-конверсии работает по другому принципу.

При посещении пользователем страницы ему присваивается идентификатор, и его данные о поведении попадают на сервера Яндекса. Когда пользователь выполняет нашу цель, происходит запись в локальный файл на нашем сервере, с идентификатором пользователя, временем и идентификатором цели.

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

Теперь подробнее, как это делается.

Для начала нужно получить OAuth-токен, если его еще нет. Странно, но в API Метрики нет ни слова о том, что нужен токен.

  1. Создаем приложение https://oauth.yandex.ru/client/new Задаем ему права AppMetrica и Яндекс.Метрика
  2. После регистрации получаем ID и пароль приложения. Нам нужен ID
  3. Переходим по адресу https://oauth.yandex.ru/authorize?response_type=token&client_id=IDприложения
  4. Яндекс.OAuth перенаправит вас на страницу с токеном, добавив данные токена после символа #: https://oauth.yandex.ru/verification_code# access_token=<новый OAuth-токен> & expires_in=<время жизни токена в секундах>
  5. Значение токена записываем в переменную или константу. Я создал константу AUTH_TOKEN

Когда токен получен, можно делать выгрузку данных. Но сначала нужно сформировать файл с данными.

Формирование файла с данными

Пример структуры файла:

Content-Type: multipart/form-data; boundary=------------------------7zDUQOAIAE9hEWoV
Context-Length: 253

--------------------------7zDUQOAIAE9hEWoV
Content-Disposition: form-data; name="file"; filename="data.csv"
Content-Type: text/csv

ClientId,Target,DateTime,Price,Currency
133591247640966458,GOAL1,1481718166,123.45,RUB
133591247640966458,GOAL2,1481718142,678.90,RUB
133591247640966458,GOAL3,1481718066,123.45,RUB
579124169844706072,GOAL3,1481718116,678.90,RUB
148059425477661429,GOAL2,1481718126,123.45,RUB
148059425477661429,GOAL3,1481714026,678.90,RUB
--------------------------7zDUQOAIAE9hEWoV--

Рассмотрим структуру подробнее.

Context-Length — количество символов контента, который начинается после этой строчки «ClientId,Target,DateTime,Price,Currency»;

boundary — идентификатор границ контента (как понимаю, можно использовать любой набор символов);

ClientId — Идентификатор клиента Яндекс.Метрики. Содержится в куках браузера.

Я получал ClientID следующей строкой:

$user_id    = $_COOKIE['_ym_uid'];

Target — Идентификатор цели;

DateTime — Время в формате timestamp

Price,Currency — необязательные параметры, задаются, если у цели есть стоимость (если задавать, то в виджете Метрики можно будет смотреть доход).

Отправка запроса

Сформированные данные передаются запросом по следующему адресу

POST https://api-metrika.yandex.ru/management/v1/counter/{counterId}/offline_conversions/upload?client_id_type=CLIENT_ID

Такой запрос указан на странице API метрики, но если к нему не добавить в конце полученный нами токен, то запрос будет возвращать ошибку.

По этому в итоге получается следующий запрос:

POST https://api-metrika.yandex.ru/management/v1/counter/{counterId}/offline_conversions/upload?client_id_type=CLIENT_ID&oauth_token={access_token}

После успешной выгрузки должен получится такой ответ:

{"uploading":{"id":00000000,"source_quantity":1,"line_quantity":1,"client_id_type":"CLIENT_ID","status":"UPLOADED"}}

В ответе мы получаем идентификатор выгрузки на сервер, количество строк данных, и статус UPLOADED.

Дальше — самое интересное. Ждешь. Ждешь и надеешься, что данные успешно будут обработаны на сервере. Ждешь сутки, понимаешь, что данные вроде бы уже должны были появиться, но их нет в Метрике. А почему данные не выгрузились — неизвестно.

Так вот, есть такой лайфхак. Можно посмотреть все выгрузки по счетчику и узнать статус выгрузки.

Для этого надо перейти по следующему адресу:

https://api-metrika.yandex.ru/management/v1/counter/{ID счетчика}/offline_conversions/uploadings?oauth_token={Наш токен}

Там можно посмотреть все сделанные выгрузки. У запроса есть 3 статуса:

UPLOADED — ждет обработки

PROCESSED — успешно обработан

LINKAGE_FAILURE — ошибка связи пользователя с идентификатором в запросе. У меня как раз была эта ошибка. Долго не мог понять, из-за чего она появляется, оказалось, в настройках счетчика стоял фильтр «Не учитывать мои визиты», поэтому мои действия не связывались с данными в Метрике.

Также Яндекс рекомендует увеличить период учета конверсий.

Опция “Включить увеличенный период учета конверсий” расширяет интервал, в течение которого данные о визите в Метрике могут быть изменены, в том числе дополнены информацией об офлайн-конверсии или о звонке.

Включение опции увеличивает период учета с 16 часов до 21 дня.

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