Офлайн-конверсия Яндекс.Метрики. Теряются выполнения целей в Метрике
Яндекс выделяет следующие сферы применения офлайн-конверсий:
- Посещения и покупки в офлайн-точках — связывает действия пользователя в онлайн и офлайн. Например, может определить, что пользователь после просмотра интернет-магазина пришел в магазин лично и совершил покупку.
- Невозможность обработки факта оплаты на стороннем сайте
- Процесс обработки заявки
Как раз процесс обработки такой заявки рассмотрим на примере достижения пользователем цели.
При вызове метода reachGoal происходит отправка данных о достижении цели пользователем на сервера Яндекса. И тут есть много факторов, из-за которых цель может не зафиксироваться.
Выгрузка офлайн-конверсии работает по другому принципу.
При посещении пользователем страницы ему присваивается идентификатор, и его данные о поведении попадают на сервера Яндекса. Когда пользователь выполняет нашу цель, происходит запись в локальный файл на нашем сервере, с идентификатором пользователя, временем и идентификатором цели.
В определенные моменты (например, раз в день) этот файл выгружается на сервера Яндекса, где он обрабатывается, происходит связь действий в офлайн (нашего файла) и действий онлайн (поведение пользователя, полученного скриптом Метрики), и данные попадают в сводку Яндекс.Метрики.
Теперь подробнее, как это делается.
Для начала нужно получить OAuth-токен, если его еще нет. Странно, но в API Метрики нет ни слова о том, что нужен токен.
- Создаем приложение https://oauth.yandex.ru/client/new Задаем ему права AppMetrica и Яндекс.Метрика
- После регистрации получаем ID и пароль приложения. Нам нужен ID
- Переходим по адресу https://oauth.yandex.ru/authorize?response_type=token&client_id=IDприложения
- Яндекс.OAuth перенаправит вас на страницу с токеном, добавив данные токена после символа #: https://oauth.yandex.ru/verification_code# access_token=<новый OAuth-токен> & expires_in=<время жизни токена в секундах>
- Значение токена записываем в переменную или константу. Я создал константу 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 дня.
Использование этой технологии позволяет сократить количество потерянных выполнений цели, а также добавляет отображение дополнительных полей информации. Это такие поля как время, проведенное на сайте пользователями, выполнившими цель, и сумма дохода (если указывалась цена выполнения цели).