Установка целей - сразу для Метрики и Analytics универсальный и простой скрипт целей для Яндекс Метрика и Google Analytics

Установка целей - сразу для Метрики и Analytics
  • 27.10.2024 01:39:47
  • 06.12.2016
  • 12575
  • 4
  • 0
  • Константин Винниченко
Я в своих и клиентских проектах на продающих страницах часто использую 2 цели для Директ и AdWords:
  • SEND – любая отправка данных через форму, конверсионная цель.
  • TIME – человек активно провел 40 секунд на сайте, цель для ретаргетинга и измерения качества трафика.
Для этого разработал простой скрипт, который облегчает установку и теперь делюсь с посетителями моего блога. Данный скрипт будет еще дорабатываться и все изменения будут доступны в этой же статье. Так же жду ваших комментариев для улучшения данного скрипта.

Добавляем цели

Цель SEND вешается каждые 5 секунд на формы заявок в которых присутствует тег FORM, такая частота необходима для таких случаев, когда форма генерируется автоматически. Например: всплывающие окна обратных звонков или онлайн-чат. Но не будет работать, если на форме отправки данных отсутствует тег FORM или/и данные формы отправляются методом JavaSctript.
Цель TIME срабатывает после 40 секунд (это значение можно поменять) активного посещения, то есть счетчик начнет срабатывать после того, как человек выполнил клик или прокрутку на сайте и отключается, если человек ушел со страницы и продолжает отчет, когда, не закрывая вкладу вернулся к вам и продолжает изучать вашу страницу. Можно сказать, эта цель имитирует «отказ», если она не была достигнута.

Установка скрипта на цели TIME и SEND

Итого, установка скрипта, добавляет следующие цели события в Яндекс.Метрике:
SENDall – составная цель в Яндекс.Метрике в виде воронки в один шаг, объединяет все конверсионные формы в цель SEND + внешние цели от сервисов сбора контактных данных, таких как: онлайн-чат, заказ звонка, ловец лидов. В итоге фиксируется как 1 конверсия со всех событий.
SEND – срабатывает, когда клиент отправляет контактную информацию, обычно через встроенные формы на сайте. Может срабатывать на посещение целевых страниц означающих заявку, перехватывает конверсионные цели с внешних сервисов
GOOD – цель отражает полезное действие на сайте, любое срабатывание из целей FORM, SEND, CLICK_TEL, CLICK_EMAIL, CLICK_MES, CLICK_MAP, CONTACT, PAY, COPY_EMAIL, COPY_TEL.
TIME – срабатывает после 40 секунд (опционально) активного просмотра текущей страницы, где учитывая активность браузера, прокрутка страницы, выделение, клики
FORM – человек начал заполнять конверсионную форму перед достижением цели SEND
SPAM – цель срабатывает, когда SEND был оставлен быстрее TIME, не срабатывает для конверсионных страниц
NOSPAM – цель срабатывает, когда SEND был оставлен после цели TIME, не срабатывает для конверсионных страниц
ERROR – цель срабатывает при посещении битой страницы 404 Not Found / Ресурс не найден
CLICK_TEL – клик по ссылке с номером телефона
CLICK_EMAIL – клик по ссылке с email адресом
CLICK_MES – клик по мессенджерам
CLICK_SOC – клик по социальным ссылкам
CLICK_MAP – клик с переходом на карту
CLICK_FILE – клик на скачивание файла по прямой ссылке
CLICK_PRINT – клик по кнопке на печать
HOVER_MES – наведение курсора по мессенджерам
HOVER_TEL – наведение курсора по номеру телефона
HOVER_EMAIL – наведение курсора на емейл
HOVER_FORM – наведение курсора на форму заявки
COPY – копирование любого текста на сайте
COPY_TEL – при копировании попал номер телефона
COPY_EMAIL – при копировании попал емейл адрес

Воронка SCROLL в виде следующих шагов:
SCROLL25 – прокрутка от 25% страницы сайта
SCROLL50 – прокрутка от 50% страницы сайта
SCROLL75 – прокрутка от 75% страницы сайта
SCROLL100 – прокрутка 100% страницы сайта

Воронка PAGE в виде следующих шагов:
PAGE2 – просмотр 2 страниц
PAGE3 – просмотр 3 страниц
PAGE4 – просмотр 4 страниц
PAGE5 – просмотр 5 страниц
PAGE6 – просмотр 6 страниц

Воронка SEC в виде следующих шагов:
SEC5 – просмотр сайта 5 секунд
SEC15 – просмотр сайта 15 секунд
SEC30 – просмотр сайта 30 секунд
SEC60 – просмотр сайта 60 секунд
SEC120 – просмотр сайта 120 секунд

Количество дней с последнего визита, не подходит для использования в воронке!
Начинает работать с даты установки скрипта, а не счетчика.
DAY_0 – прошло 30 минут и менее 24 часов
DAY_1 – прошел 1 день и менее 2 дней
DAY_2-3 – прошло 2 дня и менее 3 дней
DAY_4-7 – прошло 3 дня и менее 7 дней
DAY_8-15 – прошло 7 дней и менее 15 дней
DAY_16-31 – прошло 15 дней и менее 31 день
DAY_32-63 – прошло 31 день и менее 63 дней
DAY_64-127 – прошло 63 дня и менее 127 дней
DAY_128-255 – прошло 128 дней и менее 255 дня

Итого 45 целей, которые подходят для любого сайта.

Дополнительные цели, актуальны для интернет-магазинов:
SEARCH – цель срабатывает при поиске по сайту
CONTACT – посещение страницы «Контакты»
CART – посещение страницы «Корзина»
PAY – человек возможно оплатил, вернулся на сайт после платежной системы

Следующие цели требуют ручной настройки под каждый проект
ORDER – посещение страницы «Оформление заказа»
CART_ADD – добавление товара в корзину
LOGIN – человек авторизовался
REG – человек прошел регистрацию

Воронка продаж для интернет-магазинов, по шагам, где нулевой шаг это визит сайта:
1. Добавил в корзину (например CART_ADD )
2. Просмотр корзины (например CART )
3. Оформление заказа (например ORDER )
4. Спасибо за заказ (например SEND )

Цели достижение которых нужно настроить при интеграции с CRM системой
CRM_ADD – заявка добавлена в CRM
CRM_WORK – принято в работу (иногда может передавать стоимость сделки)
CRM_OK – оплаченные (передача стоимости сделки)
CRM_CANCEL – хорошие заявки, но закрылись без оплаты
CRM_SPAM – плохое обращение, не по теме или спам

Рекомендудемые названия для целей:
CALC - взаимодействие с формой калькуляции или онлайн расчета
CHAT - посетитель отправил сообщение в чат
CLICK_CHAT - посетитель открыл или кликнул по чату
CLICK_POPUP - посетитель открыл форму заявки
CLICK_BTN - посетитель нажал на кнопку
HOVER_BTN - посетитель навел на кнопку

Цели автоматически работающие в TurboS

При наличии ВидеоВиджета:
WIDGET_VIDEO_SHOW – загрузился видеовиджет
WIDGET_VIDEO_OPEN – открыли видеовиджет
WIDGET_VIDEO_CLICK – нажали на целевую кнопку видеовиджета
WIDGET_VIDEO_CLOSE – закрыли видеовиджет нажав на крестик

При наличии ЛайкВиджета:
WIDGET_LIKE_SHOW – показался лайквиджет
WIDGET_LIKE_CLOSE – сразу закрыли лайквиджет
WIDGET_LIKE_YES – ответили ДА на лайквиджет
WIDGET_LIKE_NO – ответили НЕТ на лайквиджет

При наличии Квиза:
QUIZ_VIEW – навел курсор на квиз
QUIZ_OPEN – открыли квиз, если был спрятан в кнопку
QUIZ_STEP1 – ответ на 1 вопрос квиза, так и другие вопросы
QUIZ_FORM – увидел форму заявки или навел курсор
QUIZ_SEND – отправили заявку с квиза

Быстрый импорт целей в Google Аналитика 3

Для целей в Fаcebооk дублем срабатывают стандартные события:
CART_ADD=AddToCart
REG=CompleteRegistration
CLICK_TEL=Contact
CLICK_EMAIL=Contact
CLICK_MES=Contact
CLICK_MAP=FindLocation
CONTACT=FindLocation
FORM=InitiateCheckout
SEND=Lead
SEARCH=Search

Добавляем скрипт

Устанавливаем код перед закрывающем тегом </BODY> после установки счетчиков или без счетчиков в GTM с созданием внутри скрипта:
 
<!-- Универсально от SeoUp.su цели TIME и SEND -->
<script type="text/javascript">
var ts = new Object();
ts.ymNumber = "";
ts.gaNumber = "";
ts.fbNumber = "";
ts.ymCreate = true;
ts.gaCreate = false;
ts.fbCreate = false;
ts.bLoadjQuery = false;
ts.bAddTagForm = false;
ts.fForm = "FORM";
ts.bFormSEND = true;
ts.fRequired = "INPUT.tel,INPUT#tel,INPUT.phone,INPUT#phone,INPUT[name='tel'],INPUT[name='phone'],INPUT[type='tel']";
ts.bRequired = true;
ts.fBut = "";
ts.bMask = false;
ts.fMask = ts.fRequired;
ts.sMask = "+9(999)999-99-99";
ts.bDebugEnable = true;
ts.bDebugDisplay = false;
ts.bDebugAlert = false;
ts.secMax = 40;
ts.priceTIME = 0;
ts.priceSEND = 0;
ts.mGOOD = 'FORM,SEND,CLICK_TEL,CLICK_EMAIL,CLICK_MES,CLICK_MAP,CONTACT,PAY';
ts.mParam = 'yclid,gclid,utm_source,utm_medium,utm_campaign,utm_content,utm_term,_openstat,from,ref';
ts.mCoal = {
    "form": [{
        valueForm: "FORM[action*='login'],FORM#login,FORM.login,FORM.login-form,FORM#loginform,FORM.loginform,FORM.auth,FORM.auth-form,FORM#avtorization-form,FORM.avtorization-form,FORM[name='form_auth'],FORM#auth-page-form",
        valueInput: "INPUT[type='password']",
        valueRequired: true,
        valueBut: "",
        goal: "LOGIN",
        sum: 0
    },
    {
        valueForm: "FORM[action*='register'],FORM[action*='create-account'],FORM#register,FORM.register,FORM.register-form,FORM.reg,FORM.reg-form,FORM#registraion-page-form,FORM#registraion-page-form",
        valueInput: "INPUT[type='password']",
        valueRequired: true,
        valueBut: "",
        goal: "REG",
        sum: 0
    }
    ],
    "click": [{
        value: ".b24-widget-button-social-item,[href*='yelp.com'],[href*='vk.me'],[href*='vk.com'],[href*='vkontakte.ru'],[href*='instagram.com'],[href*='ok.ru'],[href*='facebook.com'],[href*='twitter.com'],[href*='youtube.com'],[href*='rutube.ru'],[href*='telegram.org'],[href*='odnoklassniki.ru'],[href*='plus.google.com'],[href*='my.mail.ru'],[href*='linkedin.com'],[href*='zen.yandex.ru'],[href*='tiktok.com']",
        goal: "CLICK_SOC",
        sum: 0
    },
    {
        value: "[href^='tg:'],[href^='whatsapp:'],[href^='skype:'],[href*='skype.com'],[href^='viber:'],[href*='whatsapp.com'],[href*='wa.me'],[href*='t.me'],[href*='telegram.me'],[href*='teleg.one'],[href*='tele.click'],[href*='wa.link'],[href*='wa.clck.bar']",
        goal: "CLICK_MES",
        sum: 0
    },
    {
        value: "[href*='yandex.ru/maps/'],[href*='google.ru/maps/'],[href*='google.com/maps/'],[href*='2gis.ru'],[href*='maps.app.goo.gl']",
        goal: "CLICK_MAP",
        sum: 0
    },
    {
        value: "[href$='.3gp'],[href$='.7z'],[href$='.aac'],[href$='.apk'],[href$='.avi'],[href$='.csv'],[href$='.db'],[href$='.djvu'],[href$='.dmg'],[href$='.doc'],[href$='.docx'],[href$='.exe'],[href$='.flac'],[href$='.flv'],[href$='.gz'],[href$='.iso'],[href$='.key'],[href$='.midi'],[href$='.mka'],[href$='.mkv'],[href$='.mov'],[href$='.mp3'],[href$='.mp4'],[href$='.mpd'],[href$='.mpeg'],[href$='.mpg'],[href$='.msi'],[href$='.odt'],[href$='.ogg'],[href$='.pdf'],[href$='.pkg'],[href$='.pps'],[href$='.ppt'],[href$='.pptm'],[href$='.pptx'],[href$='.rar'],[href$='.rtf'],[href$='.sql'],[href$='.tar'],[href$='.torrent'],[href$='.txt'],[href$='.vcf'],[href$='.wav'],[href$='.wma'],[href$='.wmf'],[href$='.wmv'],[href$='.xls'],[href$='.xlsm'],[href$='.xlsx'],[href$='.zip']",
        goal: "CLICK_FILE",
        sum: 0
    },
    {
        value: "[href^='tel:']",
        goal: "CLICK_TEL",
        sum: 0
    },
    {
        value: "[href^='mailto:']",
        goal: "CLICK_EMAIL",
        sum: 0
    },
    {
        value: "[href*='window.print']",
        goal: "CLICK_PRINT",
        sum: 0
    }
    ],
    "url": [{
        value: /(\?|&)(q|s|search|query|text)=/i,
        goal: "SEARCH",
        sum: 0
    },
    {
        value: /(contact|kontakt|контакт)/i,
        goal: "CONTACT",
        sum: 0
    },
    {
        value: /(cart|basket|order)/i,
        goal: "CART",
        sum: 0
    },
    {
        value: /(\/order\/make\/|\/checkout\/|\/order\/)/i,
        goal: "ORDER",
        sum: 0
    },
    {
        value: /(order_?id=\d+|ORDER_ID=\d+)/i,
        goal: "PAY",
        sum: 0
    },
    {
        value: /(thank|order_?id=\d+|tilda\/form\d+\/submitted|checkout\/success|ORDER_ID=\d+)/i,
        goal: "SEND",
        sum: ts.priceSEND
    },
    ],
    "ajax": [{
        valueUrl: /(index\.php\?route=checkout\/cart\/add|\/ajax\/actualBasket\.php\?iblockID=)/,
        valueData: null,
        DataResponse: null,
        goal: "CART_ADD",
        sum: 0
    },
    {
        valueUrl: /(cart|basket)/,
        valueData: /action=add/,
        DataResponse: null,
        goal: "CART_ADD",
        sum: 0
    },
    {
        valueUrl: /(loadPaymentForm)/,
        valueData: null,
        DataResponse: null,
        goal: "PAY",
        sum: 0
    }
    ],
    "hover": [{
        value: "[href^='tg:'],[href^='whatsapp:'],[href^='skype:'],[href*='skype.com'],[href^='viber:'],[href*='whatsapp.com'],[href*='wa.me'],[href*='t.me'],[href*='telegram.me'],[href*='teleg.one'],[href*='tele.click'],[href*='wa.link'],[href*='wa.clck.bar']",
        goal: "HOVER_MES",
        sum: 0
    },
    {
        value: "[href^='tel:']",
        goal: "HOVER_TEL",
        sum: 0
    },
    {
        value: "[href^='mailto:']",
        goal: "HOVER_EMAIL",
        sum: 0
    },
    {
        value: ts.fForm,
        goal: "HOVER_FORM",
        sum: 0
    },
    ],
    "copy": [{
        value: /[ ()\d\-]{7,18}/,
        goal: "COPY_TEL",
        sum: 0
    },
    {
        value: /[^@\s]+@[^@\s]+\.[^@\s]+/,
        goal: "COPY_EMAIL",
        sum: 0
    }
    ],
    "ref": [{
        value: /(allpay\.to|qiwi\.com|paypal\.com|advcash\.com|interkassa\.com|payanyway\.ru|payeer\.com|paykeeper\.ru|perfectmoney\.is|platron\.ru|robokassa\.com|securepayments\.sberbank\.ru|unitpay\.ru|yoomoney\.ru|webmoney\.ru|walletone\.com|tinkoff\.ru)/i,
        goal: "PAY",
        sum: 0
    },],
    "time": [{
        value: 5,
        goal: "SEC5",
        sum: 0
    },
    {
        value: 15,
        goal: "SEC15",
        sum: 0
    },
    {
        value: 30,
        goal: "SEC30",
        sum: 0
    },
    {
        value: 60,
        goal: "SEC60",
        sum: 0
    },
    {
        value: 120,
        goal: "SEC120",
        sum: 0
    }
    ],
    "redirect_ym": [{
        value: "UNIQUE_LEAD,Jivo_Offline_message_sent,Jivo_In-chat_email_form_submitted,Jivo_User_gave_contacts_during_chat,Jivo_Callback_requested,RedHelper.Message_sent,RedConnect.callOrdered,CHAT_OFFLINE_MESSAGE,CHAT_VISITOR_INTRODUCED,Chatra_Pre-chat_form_submitted,LEADBACK_CALL,LEADBACK_CHAT_LEAD,LEADBACK_CHAT_OFFLINE_LEAD,MeTalk_Offline_message_sent,MeTalk_Form_submited,MeTalk_User_gave_contacts_before_chat,MeTalk_User_gave_contacts_during_chat,Callbackhunter_CALL,Callbackhunter_CALL_MOBILE,marquiz-finish,mch_callback_created,mch_leadgen_created,mch_chat_propose,widget_callback_created,widget_leadgen_created",
        goal: "SEND",
        sum: ts.priceSEND
    },],
};
var cVersion = "2024-10-26";
var sNoClass = "fsend";
var bfindForm = true;
var arrGOOD = ts.mGOOD.split(',');
var arrParam = ts.mParam.split(',');
var bGOAL = {
    "FORM": false,
    "GOOD": false,
    "COPY": false,
    "SCROLL25": false,
    "SCROLL50": false,
    "SCROLL75": false,
    "SCROLL100": false,
    "HOVER_MES": false,
    "HOVER_TEL": false,
    "HOVER_EMAIL": false,
    "HOVER_FORM": false
};
var secCur = 0;
var secLP = 0;
var lenDL = 0;
if ((ts.ymCreate) && (ts.ymNumber != "")) {
    (function (m, e, t, r, i, k, a) {
        m[i] = m[i] || function () {
            (m[i].a = m[i].a || []).push(arguments)
        };
        m[i].l = 1 * new Date();
        k = e.createElement(t), a = e.getElementsByTagName(t)[0], k.defer = 1, k.src = r, a.parentNode.insertBefore(k, a)
    })
        (window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");
    ym(ts.ymNumber, "init", {
        clickmap: true,
        trackLinks: true,
        accurateTrackBounce: true,
        webvisor: true,
        trackHash: true,
        ecommerce: "dataLayer"
    });
}
if ((ts.gaCreate) && (ts.gaNumber != "")) {
    var scGA1 = document.createElement("script");
    scGA1.setAttribute("type", "text/javascript");
    scGA1.setAttribute("src", "https://www.googletagmanager.com/gtag/js?id=" + ts.gaNumber);
    scGA1.setAttribute("defer", "");
    document.head.appendChild(scGA1);
    var scGA2 = document.createElement("script");
    scGA2.setAttribute("type", "text/javascript");
    scGA2.setAttribute("defer", "");
    scGA2.innerHTML = "window.dataLayer = window.dataLayer || [];function gtag(){dataLayer.push(arguments);}gtag('js', new Date());gtag('config', '" + ts.gaNumber + "');";
    document.head.appendChild(scGA2);
}
if ((ts.fbCreate) && (ts.fbNumber != "")) {
    ! function (f, b, e, v, n, t, s) {
        if (f.fbq) return;
        n = f.fbq = function () {
            n.callMethod ? n.callMethod.apply(n, arguments) : n.queue.push(arguments)
        };
        if (!f._fbq) f._fbq = n;
        n.push = n;
        n.loaded = !0;
        n.version = '2.0';
        n.queue = [];
        t = b.createElement(e);
        t.async = !0;
        t.src = v;
        s = b.getElementsByTagName(e)[0];
        s.parentNode.insertBefore(t, s)
    }(window, document, 'script', 'https://connect.facebook.net/en_US/fbevents.js');
    fbq('init', ts.fbNumber);
    fbq('track', 'PageView');
}
/* code.google.com/archive/p/jscookie/ */
window.cookie = {
    set: function (key, value, expires, path, domain, secure) {
        var sCookie = key + '=' + escape(value) + '; ';
        if (expires !== undefined) {
            var date = new Date();
            date.setTime(date.getTime() + (expires * 93600000));
            sCookie += 'expires=' + date.toGMTString() + '; ';
        }
        sCookie += (path === undefined) ? 'path=/;' : 'path=' + path + '; ';
        sCookie += (domain === undefined) ? '' : 'domain=' + domain + '; ';
        sCookie += (secure === true) ? 'secure; ' : '';
        document.cookie = sCookie;
    },
    get: function (sKey) {
        var sValue = '';
        var sKeyEq = sKey + '=';
        var aCookies = document.cookie.split(';');
        for (var iCounter = 0, iCookieLength = aCookies.length; iCounter < iCookieLength; iCounter++) {
            while (aCookies[iCounter].charAt(0) === ' ') {
                aCookies[iCounter] = aCookies[iCounter].substring(1);
            }
            if (aCookies[iCounter].indexOf(sKeyEq) === 0) {
                sValue = aCookies[iCounter].substring(sKeyEq.length);
            }
        }
        return unescape(sValue);
    },
    remove: function (key) {
        cookie.set(key, '', -1);
    },
    clear: function () {
        var aCookies = document.cookie.split(';');
        for (var iCounter = 0, iCookieLength = aCookies.length; iCounter < iCookieLength; iCounter++) {
            while (aCookies[iCounter].charAt(0) === ' ') {
                aCookies[iCounter] = aCookies[iCounter].substring(1);
            }
            var iIndex = aCookies[iCounter].indexOf('=', 1);
            if (iIndex > 0) {
                cookie.set(aCookies[iCounter].substring(0, iIndex), '', -1);
            }
        }
    },
    isEnabled: function () {
        cookie.set('test_cookie', 'test');
        var val = (cookie.get('test_cookie') === 'test') ? true : false;
        cookie.remove('test_cookie');
        return val;
    }
};

function consoleAlert(text, aler) {
    if (ts.bDebugDisplay) {
        console.log("SEOUP_GOAL: " + text);
        if ((aler) && (bDebugAlert)) {
            alert(text);
        }
    }
    return true;
}

function loadjQuery() {
    var scJQ = document.createElement("script");
    scJQ.setAttribute("src", "https://cdn.jsdelivr.net/npm/jquery@3.7.1/dist/jquery.min.js");
    scJQ.setAttribute("type", "text/javascript");
    scJQ.setAttribute("defer", "");
    document.head.appendChild(scJQ);
}

function deferjQuery(sec) {
    if (window.jQuery) {
        consoleAlert('Loaded jQuery after a wait', false);
    } else if (sec > 0) {
        setTimeout(function () {
            deferjQuery(sec - 1)
        }, 500);
    } else {
        consoleAlert('ERROR! No jQuery. You need to put ts.bLoadjQuery = true', false);
        loadjQuery();
    }
}

if (!window.jQuery) {
    if (ts.bLoadjQuery) {
        consoleAlert("External jQuery loading is forced without waiting, according to the setting", false);
        loadjQuery();
    } else {
        document.addEventListener('DOMContentLoaded', function () {
            if (!window.jQuery) {
                deferjQuery(5);
            } else {
                consoleAlert('Loaded jQuery after DOMContentLoaded', false);
            }
        });
    }
}

function getParameterByName(name) {
    var name = name.replace(/[\[]/, "\\[").replace(/[\]]/, "\\]");
    var regex = new RegExp("[\\?&]" + name + "=([^&#]*)");
    var results = regex.exec(location.search);
    return results === null ? "" : decodeURIComponent(results[1].replace(/\+/g, " "));
}

function inRange(x, min, max) {
    return ((x - min) * (x - max) <= 0);
}

function setCookieUtm() {
    loc = {};
    for (index = 0; index < arrParam.length; index++) {
        loc[arrParam[index]] = getParameterByName(arrParam[index]);
    }
    cook = {};
    for (index = 0; index < arrParam.length; index++) {
        cook[arrParam[index]] = cookie.get(arrParam[index]);
    }
    sumLoc = '';
    for (index = 0; index < arrParam.length; index++) {
        sumLoc = sumLoc + loc[arrParam[index]];
    }
    if (loc != cook && sumLoc != '') {
        for (index = 0; index < arrParam.length; index++) {
            cookie.set(arrParam[index], loc[arrParam[index]], 730);
        }
    }
    if (ts.ymNumber != "") {
        yaClientID = getYclid();
        var yaClientIDcok = cookie.get("y_clid");
        if (yaClientIDcok != yaClientID) {
            cookie.set("y_clid", yaClientID, 730);
        }
    }
    if (ts.gaNumber != "") {
        gaClientID = getGclid();
        var gaClientIDcok = cookie.get("g_clid");
        if (gaClientIDcok != gaClientID) {
            cookie.set("g_clid", gaClientID, 730);
        }
    }
    lastVisit = cookie.get("SU_lastVisit");
    if (lastVisit == '') {
        cookie.set("SU_lastVisit", Math.floor(Date.now() / 1000), 730);
    } else {
        currentVisit = Math.floor(Date.now() / 1000);
        cookie.set("SU_lastVisit", currentVisit, 730);
        onetime = Math.floor((currentVisit - lastVisit) / 60);
        if (inRange(onetime, 1, 1440)) {
            eventGoal("DAY_0", 0);
        } else if (inRange(onetime, 1440, 1440 * 2)) {
            eventGoal("DAY_1", 0);
        } else if (inRange(onetime, 1440 * 2, 1440 * 3)) {
            eventGoal("DAY_2-3", 0);
        } else if (inRange(onetime, 1440 * 3, 1440 * 7)) {
            eventGoal("DAY_4-7", 0);
        } else if (inRange(onetime, 1440 * 7, 1440 * 15)) {
            eventGoal("DAY_8-15", 0);
        } else if (inRange(onetime, 1440 * 15, 1440 * 31)) {
            eventGoal("DAY_16-31", 0);
        } else if (inRange(onetime, 1440 * 31, 1440 * 63)) {
            eventGoal("DAY_32-63", 0);
        } else if (inRange(onetime, 1440 * 63, 1440 * 127)) {
            eventGoal("DAY_64-127", 0);
        } else if (inRange(onetime, 1440 * 127, 1440 * 255)) {
            eventGoal("DAY_128-255", 0);
        }
    }
}

function setFormUtm() {
    var forms = jQuery(ts.fForm);
    for (i = 0; i < forms.length; i++) {
        for (j = 0; j < arrParam.length; j++) {
            if (cookie.get(arrParam[j]) != '') {
                var input = document.createElement("INPUT");
                input.type = "hidden";
                input.name = arrParam[j];
                input.value = cookie.get(arrParam[j]);
                forms[i].appendChild(input);
            }
        }
        if (ts.ymNumber != "") {
            var input = document.createElement("INPUT");
            input.type = "hidden";
            input.name = "y_clid";
            input.value = cookie.get("y_clid");
            forms[i].appendChild(input);
        }
        if (ts.gaNumber != "") {
            var input = document.createElement("INPUT");
            input.type = "hidden";
            input.name = "g_clid";
            input.value = cookie.get("g_clid");
            forms[i].appendChild(input);
        }
    }
}

function getYclid() {
    if (typeof window['yaCounter' + ts.ymNumber] !== "undefined" && typeof window['yaCounter' + ts.ymNumber].getClientID !== "undefined") {
        var yaClientID = window['yaCounter' + ts.ymNumber].getClientID();
        return yaClientID;
    } else {
        return cookie.get("_ym_uid");
    }
    return;
}

function getGclid() {
    var match = document.cookie.match('(?:^|;)\\s*_ga=([^;]*)');
    var raw = (match) ? decodeURIComponent(match[1]) : null;
    if (raw) {
        match = raw.match(/(\d+\.\d+)$/);
    }
    var gacid = (match) ? match[1] : null;
    return gacid;
}

function eventGoal(eg, ec) {
    for (key in bGOAL) {
        if (key === eg) {
            if (!bGOAL[eg]) {
                bGOAL[eg] = true;
                break;
            } else {
                return true;
            }
        }
    }
    if (eg == 'SEND') {
        if (secCur < ts.secMax) {
            consoleAlert("SEND reached in " + secCur + " sec.", false);
            eventGoal('SPAM', 0);
        }
    }
    var ale = false;
    if (ts.ymNumber != "") {
        try {
            ym(ts.ymNumber, 'reachGoal', eg);
            consoleAlert(eg + " event for YM", ale);
        } catch (e) {
            consoleAlert("ERROR! Sending " + eg + " for YM via ym() " + e, ale);
        }
    }
    if (ts.gaNumber != "") {
        try {
            if (ts.gaNumber.indexOf('UA-') !== -1) {
                gtag('event', 'event_name', {
                    'event_category': 'SEOUP',
                    'event_action': eg
                });
            } else {
                gtag('event', eg);
            }
            consoleAlert(eg + " event for GA", ale);
        } catch (e) {
            consoleAlert("ERROR! Sending " + eg + " for GA via gtag() " + e, ale);
            try {
                ga("send", "event", "SEOUP", eg);
                consoleAlert(eg + " event for GA", ale);
            } catch (e) {
                consoleAlert("ERROR! Sending " + eg + " for GA via ga() " + e, ale);
            }
        }
    }
    if (ts.fbNumber != "") {
        try {
            fbq('trackCustom', eg);
            consoleAlert(eg + " event for FB", ale);
            if (eg == 'CART_ADD') fbq('track', 'AddToCart');
            if (eg == 'REG') fbq('track', 'CompleteRegistration');
            if (eg == 'CLICK_TEL') fbq('track', 'Contact');
            if (eg == 'CLICK_EMAIL') fbq('track', 'Contact');
            if (eg == 'CLICK_MES') fbq('track', 'Contact');
            if (eg == 'CLICK_MAP') fbq('track', 'FindLocation');
            if (eg == 'CONTACT') fbq('track', 'FindLocation');
            if (eg == 'FORM') fbq('track', 'InitiateCheckout');
            if (eg == 'SEND') fbq('track', 'Lead');
            if (eg == 'SEARCH') fbq('track', 'Search');
        } catch (e) {
            consoleAlert("ERROR! Sending " + eg + " for FB via fbq() " + e, ale);
        }
    }
    if (ec > 0) {
        window.dataLayer.push({
            "ecommerce": {
                "currencyCode": "RUB",
                "purchase": {
                    "actionField": {
                        "id": "auto"
                    },
                    "products": [{
                        "id": 1,
                        "name": eg,
                        "price": ec,
                        "category": "SEOUP/" + eg
                    }]
                }
            }
        });
        consoleAlert("COST event " + eg + "=" + ec, false);
    }
    if (!bGOAL["GOOD"]) {
        if (jQuery.inArray(eg, arrGOOD) > -1) {
            eventGoal('GOOD', 0);
        }
    }
    return true;
}

function parseURLget(g) {
    var regexp = new RegExp(g + '=([^&]+)', 'i');
    var GetValue = '';
    if (!!regexp.exec(document.location.search))
        GetValue = regexp.exec(document.location.search)[1];
    return GetValue;
}

function formCheck(form, input, eg, ec) {
    var bOk = true;
    var i = 0;
    if (input != "") {
        fInput = jQuery(input, form);
        consoleAlert("Found " + fInput.length + " input elements", false);
        var vErr = false;
        for (i = 0; i < fInput.length; i++)
            if (fInput[i].value == "") {
                vErr = true;
                break;
            }
        if (vErr) bOk = false;
    }
    if (bOk) {
        eventGoal(eg, ec);
    } else consoleAlert("SEND failed, there are empty INPUT elements", true);
    return true;
}

function formEventClear() {
    if (bGOAL["FORM"] == false) {
        jQuery(ts.fForm).off('change.seoup');
        jQuery(ts.fForm).on('change.seoup', function () {
            eventGoal('FORM', 0);
            jQuery(ts.fForm).off('change.seoup');
            return true;
        });
    }
    if (ts.bFormSEND) {
        if (ts.fBut != "") {
            jQuery(ts.fBut, ts.fForm).off('click.seoup');
            jQuery(ts.fBut, ts.fForm).on('click.seoup', function () {
                formCheck(this.closest(ts.fForm), ts.fRequired, 'SEND', ts.priceSEND);
                return true;
            });
        }
        jQuery(ts.fForm).off('submit.seoup');
        jQuery(ts.fForm).on('submit.seoup', function () {
            formCheck(this, ts.fRequired, 'SEND', ts.priceSEND);
            return true;
        });
    }
    if (typeof ts.mCoal.form !== "undefined")
        ts.mCoal.form.forEach(function (item, i) {
            if (item.valueBut != "") {
                jQuery(item.valueBut, item.valueForm).off('click.seoupA');
                jQuery(item.valueBut, item.valueForm).on('click.seoupA', function () {
                    formCheck(this.closest(item.valueForm), item.valueInput, item.goal, item.sum);
                    return true;
                });
            }
            jQuery(item.valueForm).off('submit.seoupA');
            jQuery(item.valueForm).on('submit.seoupA', function () {
                formCheck(this, item.valueInput, item.goal, item.sum);
                return true;
            });
        });
    return true;
}

function formEvent(fe) {
    if (ts.fForm) {
        var bClear = false;
        if (fe) {
            jQuery(ts.fForm).removeClass(sNoClass);
            bClear = true;
        }
        if (!jQuery(ts.fForm).hasClass(sNoClass)) {
            jQuery(ts.fForm).addClass(sNoClass);
            if (ts.bMask) {
                if (jQuery.fn.mask) {
                    jQuery(ts.fMask, ts.fForm).mask(ts.sMask);
                } else {
                    consoleAlert("ERROR! Mask library not loaded", false);
                }
            }
            if (ts.bAddTagForm) {
                setCookieUtm();
                setFormUtm();
            }
            jQuery(ts.fRequired, ts.fForm).addClass("ym-record-keys");
            if ((ts.bDebugDisplay) && (ts.bDebugEnable)) {
                jQuery(ts.fForm).attr("style", "border: 2px dashed #f00; margin: -2px;");
                jQuery(ts.fForm).attr("goal", "SEND");
                jQuery(ts.fRequired, ts.fForm).attr("style", "border: 2px dashed #9f0; margin: -2px;");
                jQuery(ts.fBut, ts.fForm).attr("style", "border: 2px dashed #03f; margin: -2px;");
                consoleAlert("Found new 
for SEND", false); } bClear = true; } } if (typeof ts.mCoal.form !== "undefined") ts.mCoal.form.forEach(function (item, i) { if (!jQuery(item.valueForm).hasClass(sNoClass + "2")) { jQuery(item.valueForm).addClass(sNoClass + "2"); if ((ts.bDebugDisplay) && (ts.bDebugEnable)) { jQuery(item.valueForm).attr("style", "border: 2px dashed #0ff; margin: -2px;"); jQuery(item.valueForm).attr("goal_" + i, item.goal); jQuery(item.valueInput, item.valueForm).attr("style", "border: 2px dashed #9f0; margin: -2px;"); jQuery(item.valueBut, item.valueForm).attr("style", "border: 2px dashed #03f; margin: -2px;"); } if (item.valueRequired) { jQuery(item.valueInput, item.valueForm).attr("required", true); } bClear = true; } }); if (bClear) { formEventClear(); } bfindForm = false; return true; } function funcYM() { var yCounter = 0; function ySearch(goal, sum) { if (window.ym) { window.zm = window.ym; mainTagFunction(); if (ts.ymNumber != "") { var par = '{"params":{"datatime":"' + Math.floor(Date.now() / 1000) + '"}}'; ym(ts.ymNumber, 'params', JSON.parse(par)); par = getYclid(); if (par != "") { par = '{"y_clid":"' + par; if (ts.gaNumber != "" && cookie.get("g_clid") != "null") { par += '","g_clid":"' + cookie.get("g_clid"); } par += '"}'; ym(ts.ymNumber, 'userParams', JSON.parse(par)); } } } else if (yCounter < 100) { setTimeout(ySearch, 100); yCounter++; } else consoleAlert("ERROR! Yandex.Metrics counter not found to capture targets", false); } function mainTagFunction() { var arrGoal = []; ts.mCoal.redirect_ym.forEach(function (item, i) { arrGoal[i] = {}; arrGoal[i].goal = item.goal; arrGoal[i].sum = item.sum; arrGoal[i].value = item.value.split(','); }); window.su = {}; window.su.arrGoal = arrGoal; window.ym = function () { window.zm.a.push(arguments); if (arguments[1] == 'reachGoal') { window.su.arrGoal.forEach(function (item, i) { if (jQuery.inArray(arguments[2], item.value) > -1) { eventGoal(item.goal, item.sum); } }); } else if (arguments[1] == 'hit') { var page = arguments[2].toString(); ts.mCoal.url.forEach(function (item, i) { if (page.search(item.value) + 1) { eventGoal(item.goal, item.sum); } }); } }; } ySearch(); } function goalLayer() { if (typeof (ts.mCoal.layer) !== 'undefined') { var newLenDL = window.dataLayer.length; if (newLenDL > lenDL) { var jn = ''; for (i = lenDL; i < newLenDL; i++) { for (j = 0; j < ts.mCoal.layer.length; j++) { if (typeof (window.dataLayer[i].event) !== 'undefined') { if (window.dataLayer[i].event == ts.mCoal.layer[j].event) { jn = JSON.stringify(window.dataLayer[i]); consoleAlert('dataLayer[' + i + '].event , object = ' + jn, false); if (jn.search(ts.mCoal.layer[j]['value']) + 1) { eventGoal(ts.mCoal.layer[j]['goal'], ts.mCoal.layer[j]['sum']); } } } else { if (Object.keys(window.dataLayer[1])[0] == ts.mCoal.layer[j].event) { jn = JSON.stringify(window.dataLayer[i]); consoleAlert('dataLayer[' + i + '][0]  argument = ' + jn, false); if (jn.search(ts.mCoal.layer[j]['value']) + 1) { eventGoal(ts.mCoal.layer[j]['goal'], ts.mCoal.layer[j]['sum']); } } } } } lenDL = newLenDL; } } return true; } function makeHandler(item) { var handler = function () { eventGoal(item.goal, item.sum); return true; }; return handler; } function goalFun() { var nPage = 0; var bMen = false; var bFocus = false; var sBuf = ''; sBuf = cookie.get('SU_secCur'); if (sBuf != '') { secCur = Number(sBuf); } if (ts.bDebugDisplay) { sBuf = 'The default option ts.bDebugDisplay is enabled. Turn it off!'; consoleAlert(sBuf, false); } if (ts.bDebugEnable) { sBuf = parseURLget('slog'); if (sBuf == '0') { ts.bDebugDisplay = false; cookie.remove('_ym_debug'); cookie.set('SU_ts.bDebugDisplay', ts.bDebugDisplay, 1); consoleAlert("Goals debugging for this browser is disabled", false); } else { if (sBuf == '1') { ts.bDebugDisplay = true; cookie.set('_ym_debug', '1'); cookie.set('SU_ts.bDebugDisplay', ts.bDebugDisplay, 1); consoleAlert("Visual debugging of goals is enabled", false); } else if (sBuf == '2') { ts.bDebugDisplay = true; cookie.set('_ym_debug', '1'); cookie.set('SU_ts.bDebugDisplay', ts.bDebugDisplay, 1); consoleAlert("Visual debugging of goals is enabled + launched all goals", false); for (key in ts.mCoal) { secCur = ts.secMax - 2; for (index = 0; index < ts.mCoal[key].length; index++) { eventGoal(ts.mCoal[key][index].goal, ts.mCoal[key][index].sum); } } } else { sBuf = cookie.get('SU_ts.bDebugDisplay'); if (sBuf != '') { ts.bDebugDisplay = sBuf; } } } } sBuf = ''; if (ts.ymNumber != "") { sBuf = " YM=" + ts.ymNumber; if (ts.ymCreate) sBuf = sBuf + " (create)"; else sBuf = sBuf + " (skip)"; } if (ts.gaNumber != "") { sBuf = sBuf + " GA=" + ts.gaNumber; if (ts.gaCreate) sBuf = sBuf + " (create)"; else sBuf = sBuf + " (skip)"; } if (ts.fbNumber != "") { sBuf = sBuf + " FB=" + ts.fbNumber; if (ts.fbNumber) sBuf = sBuf + " (create)"; else sBuf = sBuf + " (skip)"; } sBuf = "jQuery library " + jQuery.fn.jquery + " - Goals from " + cVersion + " work for" + sBuf + " where TIME=" + ts.secMax; if (ts.bFormSEND) { if (ts.fRequired == "") sBuf = sBuf + " and SEND is triggered when " + ts.fForm; else sBuf = sBuf + " and SEND is triggered when \"" + ts.fForm + "\" provided \"" + ts.fRequired + "\""; if (ts.fRequired) { if (ts.bRequired) { jQuery(ts.fRequired, ts.fForm).attr("required", true); sBuf = sBuf + " required"; if (ts.fBut != "") { sBuf = sBuf + " button \"" + ts.fBut + "\""; } } if (ts.bMask) { sBuf = sBuf + " and mask " + ts.sMask; } } } if (ts.bDebugEnable) { sBuf = sBuf + ". Debug ?slog=1"; if (ts.bDebugAlert) { sBuf = sBuf + " and Alert is enabled (not recommended to use \"Preserve log\" in console)."; if (ts.bDebugDisplay) { sBuf = sBuf + "\n\nDebug mode with alert() - later set ts.bDebugAlert=false;"; } } } else { sBuf = sBuf + ". Debug is not available"; } consoleAlert(sBuf, false); sBuf = cookie.get('SU_page'); if (sBuf != '') { nPage = Number(sBuf) + 1; switch (nPage) { case 2: eventGoal('PAGE2', 0); break; case 3: eventGoal('PAGE3', 0); break; case 4: eventGoal('PAGE4', 0); break; case 5: eventGoal('PAGE5', 0); break; case 6: eventGoal('PAGE6', 0); break; } } else { nPage = 1; } cookie.set('SU_page', nPage, 1); var xmlhttp = new XMLHttpRequest(); xmlhttp.open("HEAD", document.location, true); xmlhttp.onreadystatechange = function () { if (xmlhttp.readyState == 4) { if (xmlhttp.status == 404) eventGoal('ERROR', 0); } }; xmlhttp.send(null); jQuery.ajaxSetup({ global: true }); jQuery(document).ready(function () { window.dataLayer = window.dataLayer || {}; jQuery(document).bind("DOMSubtreeModified", function () { bfindForm = true; }) if (ts.bMask) { var scMI = document.createElement("script"); scMI.setAttribute("src", "https://cdn.jsdelivr.net/npm/jquery.maskedinput/src/jquery.maskedinput.min.js"); scMI.setAttribute("type", "text/javascript"); scMI.setAttribute("defer", ""); document.head.appendChild(scMI); } jQuery(document).ajaxSuccess(function (event, request, settings) { var u = settings.url; var d = settings.data; var r = request.responseText; if ((ts.bDebugDisplay) && (ts.bDebugEnable)) { consoleAlert('ajaxSuccess url: ' + u + ' ; data: ' + d + ' ; responseText: ' + r, false); } for (index = 0; index < ts.mCoal.ajax.length; ++index) { var bOkUrl = false; var bOkData = false; var bOkRes = false; if (ts.mCoal.ajax[index]['valueUrl'] != null) { if (!!d) { if (u.search(ts.mCoal.ajax[index]['valueUrl']) + 1) { bOkUrl = true; } } } else bOkUrl = true; if (ts.mCoal.ajax[index]['valueData'] != null) { if (!!d) { if (d.search(ts.mCoal.ajax[index]['valueData']) + 1) { bOkData = true; } } } else bOkData = true; if (ts.mCoal.ajax[index]['DataResponse'] != null) { if (!!r) { if (r.search(ts.mCoal.ajax[index]['DataResponse']) + 1) { bOkRes = true; } } } else bOkRes = true; if (bOkUrl && bOkData && bOkRes) { var temp_goal = ts.mCoal.ajax[index].goal; var temp_sum = ts.mCoal.ajax[index].sum; eventGoal(temp_goal, temp_sum); } } if (/form/i.test(request.responseText)) { formEvent(true); } }); jQuery(window).on("beforeunload", function () { goalLayer(); }); if ((ts.bDebugDisplay) && (ts.bDebugEnable)) { for (index = 0; index < ts.mCoal.click.length; ++index) { jQuery(ts.mCoal.click[index]['value']).attr("style", "border: 2px dashed #f0d; margin: -2px;").attr("goal", ts.mCoal.click[index]['goal']); } } ts.mCoal.click.forEach(function (item, i) { jQuery(item.value).on('click', makeHandler(item)); }); ts.mCoal.hover.forEach(function (item, i) { jQuery(item.value).hover(makeHandler(item), function () { }); }); ts.mCoal.url.forEach(function (item, i) { if (window.location.href.search(item.value) + 1) { eventGoal(item.goal, item.sum); } }); ts.mCoal.ref.forEach(function (item, i) { if (document.referrer.search(item.value) + 1) { eventGoal(item.goal, item.sum); } }); jQuery("body").click(function () { bMen = true; bFocus = true; }); jQuery(window).focus(); jQuery(window).scroll(function () { bMen = true; bFocus = true; var sscroll = jQuery(window).scrollTop(); var sheight = jQuery(document).height() - jQuery(window).height(); var dch = sscroll / sheight * 100; var pscroll = Math.round(dch); if ((pscroll >= 25) && (!bGOAL["SCROLL25"])) { eventGoal('SCROLL25', 0); } if ((pscroll >= 50) && (!bGOAL["SCROLL50"])) { eventGoal('SCROLL50', 0); } if ((pscroll >= 75) && (!bGOAL["SCROLL75"])) { eventGoal('SCROLL75', 0); } if ((pscroll == 100) && (!bGOAL["SCROLL100"])) { eventGoal('SCROLL100', 0); } }); jQuery(window).bind("focus", function () { bFocus = true; }); jQuery(window).bind("blur", function () { bFocus = false; }); document.addEventListener('copy', function () { var text = window.getSelection().toString().trim(); if (text != '') { eventGoal('COPY', 0); for (index = 0; index < ts.mCoal.copy.length; ++index) { if (ts.mCoal.copy[index]['value'] != null) { if (text.search(ts.mCoal.copy[index]['value']) + 1) { eventGoal(ts.mCoal.copy[index]['goal'], ts.mCoal.copy[index]['sum']); } } } } return true; }) setInterval(function () { if (bfindForm) { formEvent(false) } if ((bMen == true) && (bFocus == true)) { secLP = secLP + 1; if (!jQuery.isEmptyObject(ts.mCoal.time)) { for (index = 0; index < ts.mCoal.time.length; ++index) { if (ts.mCoal.time[index]['value'] == secLP) { eventGoal(ts.mCoal.time[index]['goal'], ts.mCoal.time[index]['sum']); } } } if (secCur == ts.secMax) { secCur = secCur + 1; cookie.set('SU_secCur', secCur, 1); eventGoal('TIME', ts.priceTIME); } else { secCur = secCur + 1; cookie.set('SU_secCur', secCur, 1); if ((ts.bDebugDisplay) && (ts.bDebugEnable) && (secCur <= ts.secMax)) { consoleAlert('TIME = ' + secCur + ' out of ' + ts.secMax, false); } } } goalLayer(); }, 1000); setTimeout(funcYM, 1000); }); } setTimeout(goalFun, 1000); </script>

Дополнительные возможности

Для перехвата данных из dataLayer добавьте еще ветку в массив целей

"layer": [{
            event: "ecommerce",
            value: /"add":/,
            goal: "CART_ADD",
            sum: 0
        }],

Корректная настройка скрипта

Сайт Tilda

ПРОБЛЕМА: без указания Яндекс.Метрики платформа Тильда не будет передавать события по визиту виртуальной страницы, отсюда не будет перехват событий по форме и передача в цель SEND, поэтому даже если настройка исключительно Google Аналитики, цели срабатывать без Метрики не будут..

  1. Обязательно укажите GTM и номера всех счетчиков в настройках сайта Tilda, без указания счетчиков не будут вызываться события по конверсиям для данных счетчиков
  2. Чтобы работала Google Аналитика 4 ещё надо в Tilda, дополнительно в настройках счетчика в Tilda указать "Включить gtag.js" иначе всегда будет ошибка при передаче событий
  3. Надо выключить опцию задержки загрузки счетчиков на 2 секунды, иначе всегда вызов всех целей будет падать с ошибкой.
  4. Опубликуйте все страницы в Tilda
  5. Для работы скрипта, укажите опции:
    var ymNumber = "012345"; //Всё равно указываем номер метрики
    var gaNumber = "G-0123";; //Всё равно указываем номер аналитики
    var ymCreate = false; //Не создаем метрику, иногда включают чтобы альтернативно убрать ошибку визита страницы Спасибо
    var gaCreate = false; //Не создаем аналитику
    ts.fbCreate = false;
    ts.bLoadjQuery = false; //Тильда уже использует эту библиотеку
    var bAddTagForm = false; //Нам не надо хранить и передавать метки в формы
    
  6. Страница "Спасибо" может не срабатывать цел или часто выходить с ошибкой, так как наш скрипт может запуститься раньше счетчиков, чтобы это не произошло надо увеличить задержку вызова нашего срипта

CRM-формы Битрикс24

  1. В CRM для iFrame-форм не ставим скрипт, а указываем только номер Метрики. ПРОБЛЕМА: формы простые, там не нужна такая нагрузка, плюс без Метрики события не вызываются, а с нашим скриптом, который обычно создает Метрику, будет двойная метрика, Вебвизор перестанет работать на CRM-форме.
  2. В Метрике вручную прописываем события, в первую очередь добавляем цели вида B24_FORM_1_END в SENDall
Каждая форма имеет свой номер, для примера показываю форму с номером 1.
B24_FORM_1_VIEW - Просмотр формы #1
B24_FORM_1_START - Начато заполнение формы #1
B24_FORM_1_LEAD_NAME - Заполнено поле "Имя", #1
B24_FORM_1_LEAD_LAST_NAME - Заполнено поле "Фамилия", #1
B24_FORM_1_LEAD_PHONE - Заполнено поле "Телефон", #1
B24_FORM_1_LEAD_EMAIL - Заполнено поле "E-mail", #1
B24_FORM_1_END - Успешно заполнена форма #1
Настройте регулярное выражение на все формы, если они конверсионные для "Успешно заполнена форма" следующей строчкой
/B24_FORM_\d+_END/i

Свои команды для передачи целей

Если нужно добавить еще несколько целей по клику, то рекомендуется использовать следующий шаблон внутри функции jQuery(document).ready
jQuery('СЕЛЕКТОР1').click(function (e) {
eventGoal('ИМЯ_ЦЕЛИ1', 0);
});
Если требуется внешний вызов, например на кнопке добавить в корзину, то пропишите так
<INPUT onclick="eventGoal('ИМЯ_ЦЕЛИ1', 0); return true;" ...
или
<FORM onsubmit="eventGoal('ИМЯ_ЦЕЛИ1', 0); return true;" ...

Описание переменных и настройка

  1. ymNumber (""|"9876543210") - номер Яндекс.Метрики для передачи конверсий
  2. gaNumber (""|"UA-9876543210") - номер Google Аналитики для передачи конверсий
  3. ymCreate (true|false) - создать счетчик Yandex Metrika скриптом
  4. gaCreate (true|false) – создать счетчик Google Analytics скриптом
  5. bDebug(true|false) - разрешить режим отладки в консоли при посещении c параметром ?slog=1 во время настройки стоит использовать true и когда за закончена отладка выключать в целях безопасности
  6. bDebugAlert(true|false) - разрешить срабатывать alert() при срабатывании редко уловимых целей в режиме отладки
  7. fForm (jQuery селекторы) - выделение контейнера в качестве конверсионной формы для срабатывания FORM при изменении
  8. bFormSEND (true|false) - включить передачу цели SEND при отправки с конверсионных форм fForm
  9. fRequired (jQuery селекторы) - если bRecSEND работает и есть выборка fForm идет проверка значений полей INPUT, которые должны быть обязательно заполнены перед отправкой для срабатывания цели SEND
  10. bRequired(true|false) - если fRequired и bRequired true, тогда на уровне браузера данные INPUT обязательны к заполнению, что позволяет избежать часть ошибок перед отправкой формы
  11. fBut (""|jQuery селекторы) - если значение не пустое, тогда идет срабатывание SEND просто по клику на кнопку внутри fForm, применять метод в последнюю очередь когда другие методы перехвата не работают
  12. fClickORDER (""|jQuery селекторы) - если значение не пустое, тогда идет срабатывание SEND просто по клику на выделенный элемент.
  13. fClickSOC(""|jQuery селекторы) - селекторы определяющие цель CLICK_SOC клик по социальным ссылкам.
  14. fClickMES(""|jQuery селекторы) - селекторы определяющие цель CLICK_MES клик по мессенджерам.
  15. Массив mCoal содержит правила для расширения стандартных видов целей
    1. type: - принимает значение 
      • "element" - клик по элементу, где value: поиск по селектору jQuery
      • "url" - просмотр страницы, где value: регулярное выражение
      • "ajax" - отправка AJAX данных, где значения с логикой "И", учитываются все не null (пустые) значения
        1. valueUrl: - на какой URL отправляются данные, регулярное выражение
        2. valueData: - какие отправляются данные, регулярное выражение
        3. DataResponse: - какой получаем ответ, регулярное выражение
    2. goal: - название цели
    3. sum: - цена данной цели для электронной коммерции
  16. sAutoGoalSEND - перечисление через запятую, какие цели перехватываем с новой Яндекс.Метрики и дублируем конверсию в SEND
  17. fMask (""|jQuery селекторы) - если значение не пустое, то применяется маска к заполнению INPUT, обычно используется для номера телефона
  18. fMask("+9999-999-9999") - шаблон маски к заполнению INPUT при непустом fMask
  19. secMax (40) - число секунд до срабатывания цели TIME, обнуляется с каждым новым посещением
  20. sNoClass("fsend") - имя класса, которое будет добавляться к fForm чтобы исключить уже известные формы и поймать новые динамические формы через каждые 2 секунды
  21. priceTIME(0) - указываем больше 0 если точно знаем ценность данной цели и хотим видеть данные в отчетах по электронной коммерции, лучше не использовать совместно с priceSEND
  22. priceSEND(0) - указываем больше 0 если точно знаем ценность данной цели и хотим видеть данные в отчетах по электронной коммерции, лучше не использовать совместно с priceTIME
  23. bDebugStatus(false) - указываем true для принудительного включения режима отладки, в случаях когда slog=1 не срабатывает, по завершению обязательно возращаем значение false

Примеры jQuery селекторов

Популярные примеры jQuery селекторов и регулярных выражений JavaScript для цели SEND
  • "form,#form,.form" – выбрать все теги FORM, все теги с ID #form, все теги с классом .form
  • "FORM:not(#uptocall-form, #uptocall-form-email, #search, .search, #subscribe, .subscribe, #smartfilter, .smartfilter, #login, .login)" – выбрать все теги FORM исключить, кроме #uptocall-form, #uptocall-form-email и т.д.
  • "FORM:has(.seoup, .feedback)" – выбрать только теги FORM с классом .seoup, .feedback. Аналог "FORM.seoup, FORM.feedback"
  • "#myinput\\[3\\]" – выбрать элемент у которого ID с квадратными скобками "myinput[3]"
  • "FORM[action=\\/\\#wpcf7-f4349]" - выбрать FORM у которой атрибут action="/#wpcf7-f4349"

Примеры регулярных выражений JS:

  •  /12a45/ - строка содержит «12a45» в любом месте
  • /^12a45/ - строка начинается с «12a45»
  • /12a45$/ - строка заканчивается на «12a45»
  • /^12a45$/ - строка строго «12a45»
  • /^\[null,{"ok":1}]$/ - строка строго «[null,{"ok":1}]»
  • /^45678$|^12a45$/ - перечисление вариантов поиска символом «|»
  • /input_phone=.{5,}&input_email/ - строка имеет «input_phone=» и «input_email» между которыми 5 и более символов, это по логике означает заполненное поле input_phone
  • /order((?!edit).)*\/$/ - для страницы «site.ru/order/» работает, а для «site.ru/order/edit/» не работает
  • /order.*thank/ - для страницы «site.ru/order/» не работает, а для «site.ru/order/thank» работает
  • /\d{3}-\d{3,5}-\D{4}/ - выбирает числа разбитые через дифис сначала 3 числа, потом дефис, потом 3-5 чисел, потом дефис, 4 символа все кроме цифр
Проверяйте работоспособность регулярных выражений - https://regex101.com

Тестируем цели и исправляем ошибки

1. После установки открываем сайт и смотрим лог консоли, если надпись "Установлены цели TIME и SEND" появилась, то скорее всего цели работают.
2. В Яндекс.Метрика есть специальный тег, с которым открываешь страницу и смотришь логи отчета и Метрика отобразит свои действия по конверсиям
site.ru?_ym_debug=1
Подсказка: кстати так можно определить достигаемые цели от сервисов обратного звонка и онлайн-консультантов. Выполняете заявку, пишите сообщение и смотрите какая цель отобразилась, данное имя можете добавить в счетчик и буде собирать по данной цели конверсии и статистику.
3. Если не получается выделить нужный тег, попробуйте в консоли найти нужную комбинацию в селекторах
jQuery("*[data-type='phone'] input").attr("style", "border: 2px dashed #ff0; margin: -2px;");
4. Если скрипт установили, а счетчики не поставили, цели работать не будут.
5. Желательно скрипт ставить после вызова счетчиков, если цель универсального скрипта сработает раньше, чем загрузиться счётчик то будет ошибка.
6. Если JavaScript отключен в браузере, скрипт работать не будет. Крайне редкий случай.
7. Если счетчики слежения блокируют антивирусы, то скрипт так же работать не будет.
8. Проверяйте корректность срабатывания, когда срабатывает лишний раз, есть вероятность в поле INPUT может быть уже заполнено VALUE

Все корректно, а целей в отчете нет?

В Яндекс.Метрика обычно требуется 15-40 минут, чтобы она отобразила достижение цели в своих отчетах
В Яндекс.Директ обычно требуется 1-2 дня, чтобы из отчета «Все цели» появились уже имена конкретных целей SEND и TIME. Яндекс.Директ предварительно надо связать с Яндекс.Метрика.
В Google Analytics в режиме реального времени может отобразить цель, задержка 3-15 секунд
В Google AdWords обычно требуется 2-3 для показа целей. Google AdWords предварительно надо связать с Google Analytics

Дублирование целей в SEND

Главной задачей правильной настройки скрипта является перехват и дублирование всех ключевых событий/целей в котором передаются контактные данные в основую цель SEND для возможности легкой обучении рекламных стратегий по конкретной цели и построения отчетов.

Перехват целей от Envybox

Скрипт пытается перехватить события с Метрики, но для Envybox метрика создается внутри его iFrame и скрипт не способен его перехватить, там он не работает. Поэтому воспользуемся решением вызова функций. В GTM уже скорее всего есть контейнер от Envybox прямо в нем можно добавить следующий текст
<script type="text/javascript">
/* https://envybox.io/help/knowledge-base/jsapi-vidzhetov-opisanie-metodov/ */
$(function () {

    window.ws_OnGeneratorSendLead = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnQuizSendLead = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnVideoWidgetSendLead = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnChatOfflineMessage = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnChatVisitorIntroduced = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnCallbackOnlineCall = function (data) {
        eventGoal('SEND', 0);
    };

    window.ws_OnCallbackDeferredCall = function (data) {
        eventGoal('SEND', 0);
    };
    
});
</script>

Оптимизация по целям

Рекомендуемый приоритет целей по оптимизации рекламных кампаний будет следующим:
  1. SENDall – раз эта цель отражает совокупность всех целей, что обеспечивает контакт с потенциальным клиентом, она рассматривается в первую очередь для оптимизации рекламы
  2. SEND – если брать отдельную цель заявка с сайта, то достижение этой цели приоритетно для оптимизации
  3. CLICK_TEL – клик по номеру телефона часто исключает достижение цели SEND, так как связываются уже по телефону не оставляя заявку на сайте. Вероятность звонка составляет 14-86%
  4. CLICK_MES – клик по мессенджерам, часто приводит к диалогу, но качество обращение ниже, чем звонок, так же исключает часто клик по телефону и заявку на сайте. Вероятность сообщения составляет 26-78%
  5. GOOD – совокупность всех полезных действий на сайте, что может привести в дальнейшем к заявке. Крайне интересная цель, чтобы накопить больше конверсий в заявку, она в среднем срабатывает в 2 раза чаще чем SEND, следовательно данную цель можно использовать в стратегии «Максимум конверсий». Является первым предикатором для цели SENDall.
  6. CLICK_EMAIL – клик по емейл обычно собирает мало конверсий, однако это все же потенциальный контакт
  7. CART – посещение корзины, часто является обязательным действием перед покупкой в интернет-магазинах
  8. CONTACT – посещение страницы Контакты, может служить заинтересованности в кампании, а также получением информации для связи, увы конверсия в реальную заявку крайне низкая
  9. CLICK_SOC – переход в социальную сеть не является сильным коммерческим фактором, однако для некоторых позволяет собрать базу лояльной аудитории и подогреть в будущем на конверсию
  10. PAGE – просмотр 3 и более страниц сайта, может отражать вовлеченность аудитории данным сайтом, в целом это хороший визит, но не говорит что будет заявка, зато сообщает о качественном трафике
  11. SCROLL75 – если говорить о предсказании, что потом может произойти SEND, то данная цель хорошо с ней коррелирует. Является вторым предикатором для цели SENDall.
  12. SCROLL50 – немного уступает в частоте предсказания будущей заявки, по сравнению SCROLL75 примерно на 20% и все же, её тоже можно использовать для оптимизации, когда 75% сколла страницы достигается редко.
  13. SCROLL25 – сильно уступает в частоте предсказания будущей заявки, по сравнению SCROLL75 примерно на 50%. Не особо рекомендуется проводить к оптимизации, только в тяжелых случаях.
  14. TIME – цель долгий визит страницы, обычно срабатывает в 20-60% случаев и больше всего коррелирует с кликами, чем с реальной заявкой SEND. Однако эта цель является первой для начала оптимизации рекламных кампаний и последней для оптимизации под конверсию. Всё же данная цель лучше отражает качество общего трафика, вовлеченность в контенте и обычно пользователи достигают цель TIME в 90% случаев прежде чем достигнуть SEND.
Другие цели, интересны для анализа:
  1. FORM – человек редактировал конверсионную форму, но если еще указать что не достиг цели SEND, можно узнать какой % конверсий был потерян из-за капчи или неудобной формы заявки. Исправив форму заявки, можно увеличить количество конверсий.
  2. ERROR – человек попавший на страницу ошибки 404, может уйти с этой страницы. Так же данная цель полезна, когда много объявлений с разными ссылками, возможно эти ссылки уже не существуют на сайте и данная цель достигается. Исправив объявления с битой ссылкой, можно потенциально увеличить количество конверсий. Нормой считается до 3% достижение данной конверсии в интернет-магазинах.
  3. SPAM – если клиент жалуется на большое количество некачественных обращений, обратите внимание не получается ли так, что люди заходят на сайт и сразу оставляют заявку ещё до достижения TIME срабатывает SEND, а значит скорее всего данный визит не ознакомился с содержимым сайта и оставляет заявку. Возможно, это СПАМ рассылка, или люди думают, что оставляют заявку по другой услуге и такое тоже было.
  4. SEARCH – срабатывание цели поиска по сайту, может подсказать что ищут по факту люди. Например, на сайте человек ищет зимние куртки, а раздела куток по сезонам нет, следовательно создание данного раздела, позволит людям меньше пользоваться поиском по сайту и быстрее находить нужный товар.


Получить помощь по настройке Метрики и Аналитики за 2000 руб


Полезно прочесть


Оценить статью

Рейтинг:
(3.96 из 5 - 8 голосов)