Ok Яндекс! А где наши «Reach Goals»?

История про Yandex.Metrika ReachGoal, девушку Лиду и про то, что не бывает неразрешимых проблем



Мир неидеален, мир world wide web неидеален еще больше. Иногда, на это можно закрыть глаза. Но только не тогда, когда красивая девушка по имени Лида из «отдела маркетинга» стоит перед тобой, смотрит тебе в глаза и задает вопрос: «Почему-то у нас в Я.Метрике данные, которые я вижу воронке заказа, отличаются от тех, которые я вижу в нашей учетной системе. И у нас заказов больше».

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

Особо не надеясь на какой-либо интересный эффект и поэтому не мудря лукаво, был быстро дописан сервис, регистрирующий события возникающие на фронтенде в браузерах посетителей нашего сайта.

Прежде всего, нас интересовали события, которые могли возникнуть при выполнении кода Я.Метрики, а именно yaCounterXXXXXX.reachGoal().

Итак, ставим везде где нужно перехват исключения и отправляем эти события на сервер:

 try {
    yaCounterXXXXXX.reachGoal("EVENT_XXX");
 } catch(e) {
    $.get("/front/service/event", {event: "YM-warning", goal: " EVENT_XXX ", message: e.message});
 }

Проходит время, мы вспоминаем, что удочку то мы закинули, а вот улов не проверили.
Идем смотреть логи, и к своему удивлению видим там приблизительно следующее:

[2018-04-17 09:04:51.431]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36]
 [2018-04-17 09:09:18.082]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:21.369]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:24.990]  [BASKET_LOAD] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:09:27.001]  [] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
[2018-04-17 09:12:44.778]  [ORDER_CREATED] [yaCounterXXXXXX is not defined] [Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:59.0) Gecko/20100101 Firefox/59.0]
... и так далее

Быстрый подсчет показал, что порядка 3..4..5% событий в корзине проходят мимо Я.Метрики. Лида была права. А раз девушка права, надо что-то делать. Хотя когда девушка неправа, то делать все равно что-то надо.

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

Техсаппорт Яндекса ответил письмом содержащим ссылку на документацию по установке счетчика метрики, за что им, конечно же, отдельное, горячее спасибо!

Не буду описывать все гипотезы, которые мы перепробовали. В сухом остатке получается, что на момент загрузки страницы, код счетчика Яндекс.Метрики не загружен в браузер клиента и не инициализирован там. Может быть это блокировщик рекламы и/или трекеров отслеживания, может быть какие-то сетевые проблемы между клиентом и сервером Яндекса (это маловероятно).

Пришлось взять Лиду за руки, заглянуть в ее бездонные глаза и скрепя сердце сказать суровую правду: «Лида, придется смириться с тем, что у некоторых посетителей нашего сайта, события «оформления/отказа от оформления заказа» в Я.Метрику попадать не будут. Но мы обязательно, что-нибудь придумаем.»

Прошло лето, уж осень подходила к концу, как на пороге кабинета опять возникла Лида. По ее глазам полным слез, стало понятно, что те несчастные проценты, проходящие мимо, мешают ей показать начальству красивые отчеты и тем самым получить годовой бонус, который она уже включила в свой бюджет поездки в Таиланд на новогодние праздники.

Сердце дрогнуло. Был собран весь коллектив группы фронтенда, и ему в жесткой форме было приказано «копать отсюда и до обеда!» была поставлена задача любыми путями решить сию проблему! А не то!!! А не то Лида не сможет поехать в Таиланд…

«Фронтенду» не хотелось копать долго и практически сразу было предложено быстрое решение:


// Делаем локальную копию скрипта яндекс.метрики и загружаем ее тем, 
// кому не повезло загрузить ее с сервера Яндекса
// Локальная копия периодически синхронизируется 

     var n = document.getElementsByTagName("script")[0],
         s = document.createElement("script");
     s.src = "/js/yaScriptLocal.js";
     n.parentNode.insertBefore(s, n);

Результат этого решения можно увидеть на графике, это анализ того самого лога событий

Как видно, количество ошибок упало практически до 0

Если вы на своем сайте еще не проверяете успешность загрузки скриптов Яндекс.Метрики, проверьте обязательно. Вас тоже могут ждать интересные открытия.

Disclaimer: У меня есть понимание, что приведенное выше решение далеко не оптимальное. Был бы рад выслушать мысли и мнения по этому поводу.
AdBlock has stolen the banner, but banners are not teeth — they will be back

More
Ads

Comments 12

    +1
    Как на счёт пользователей из Украины, где Яндекс заблокирован? Как решать эту проблему? Они тоже могут составлять какой-то процент аудитории.
      0
      Думаю, что никак. Если заблокированы сервера, то ведь не только сам скрипт не загружается, но и события (например, сотни событий перемещений мышки по экрану) не доходят до этих серверов.
        0
        Как вариант можно сделать у себя на бэке обработчик который будет пересылать события на Яндекс (если он позволяет так делать). Тут же проблема скорее не в сборе данных(нагрузка на свои сервера и т.д.), а в удобстве работы с собранными данными.
          0
          Думаю, что Яндекс «забанит» такой счетчик очень быстро. Скорей всего, он это воспримет как имитацию действий пользователей с целью улучшить позицию в поисковой выдаче.
        0
        для Украины у счетчика метрики есть специальная настройка
        +1
        У Вас упал процент ошибок «не загружен счетчик».
        Есть подозрение что даже с загруженным локально счетчиком не получится отправить данные в метрику (например, злой adblock+++ блокирует ip-адрес). Было бы интересно проверить.
          0
          Так как речь шла уже буквально о долях процента и далеко не каждый день (у нас наплыв посетителей имеет ярко выраженный сезонный характер), то пока так глубоко копать не стали.
          Количество зарегистрированных событий возникающих в «корзине» выросло практически на те же проценты. Но соглашусь, здравое зерно в Вашей идее есть, так как добиться точного соответствия все равно не удалось. Попробовать надо.
          0
          Может, просто на момент вызова .reachGoal счетчик еще не успел подгрузиться, из за медленного интернета, например.
            0
            Может просто человек взял и заблочил метрику? Вот я блочу например. Из статьи понял, что нужно ещё блочить сервера, куда отправляются данные.
            +1
            У вас используется новый или старый код счетчика? (новый появился в декабре)

            В новом используется функция ym, которая, как я понимаю, складывает события в список, пока счетчик не загружен. Тогда, если вызывать цели через ym(XXXXXX, 'reachGoal', ...), то должно всегда срабатывать.
              0
              Какая сейчас стоит версия, я не знаю. Летом стояла самая актуальная. Надо проверить. Спасибо за информацию!
              0
              Искал почему нет данных для 4-5% по reachGoal, нашел эту статью, дополняю наблюдениями:
              В моем случае метрика им загружается, но для 5% не передаются данные по reachGoal (хотя для удобства аналитики данные должны быть для 100% посетителей каталога)…
              Почти все «скрытые от reachGoal» сидят через Mobile Safari и MSIE (время просмотра, глубина и другие метрики не отличаются от других посетителей).

              Only users with full accounts can post comments. Log in, please.