Ecommerce своими руками без программиста: пошаговая инструкция

Настройка электронной торговли (ecommerce) практически всегда требует персонального подхода к сайту, а также разработчика, который всё настроит. Как сделать все самому, без помощи программиста, используя лишь Google Tag Manager и несколько готовых скриптов?

Привет, я Александр Зарайский — спикер курса «Весь контекст за 4 месяца». На курсе мы много обсуждаем как контекст вообще, так и аналитику в частности. Сегодня я хотел бы по шагам показать, как настроить отправку данных ecommerce с сайта интернет-магазина, не имея глубоких познаний разработчика.

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

Руководство ориентировано на пользователей, которые уже работали с GTM и понимают, что такое события в Google Analytics и как настроить их отправку в GTM. Если вы только начали изучать, то рекомендую сначала ознакомится с моими прошлыми статьями о GTM:

Что такое E-commerce и почему его настройка сложна

Если говорить просто, то e-commerce, это статистика с сайта - какой товар (название, цена, количество, артикул) был куплен, кем и когда. Есть детальная инструкция.

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

Звучит весьма перспективно, но сам по себе e-commerce сложен в настройке по двум основным причинам:

  • Требуется отправлять данные о купленных товарах из корзины.
    Но корзина динамична - у каждого пользователя свой набор товаров, которые он хочет купить. Потому здесь невозможно настроить стандартное событие на элемент сайта, как например на кнопку.
  • Дизайн интернет-магазинов и их разметка не редко отличается.
    Поэтому всегда требуется индивидуальный подход к настройке e-commerce для того или иного сайта, чтобы получить нужные данные. Конечно есть интернет-магазины сделанные в конструкторе сайтов типа tilda и схема корзины у них схожая. Но п.1 остается актуальным.

Поэтому обычно настройка e-commerce передается как задача разработчику, и реализуется через backend сайта.

Но e-commerce можно настроить и через GTM, причем на большую часть интернет-магазинов с корзинами и не имея профессиональных навыков разработчика. Как? Давайте разбирать.

План настройки E-commerce для интернет-магазина

Для работы потребуется внедренный на сайт контейнер GTM и Google Analytics с включенной электронной торговлей.

Пример будет построен на основе сайта https://sladradosti.com/, созданного в конструкторе tilda.

Сформулируем задачу. E-commerce подразумевает отправку данных с сайта о том, какие товары покупает пользователь, когда он заканчивает оформление заказа. Следовательно, требуется отправить данные о товарах в Google Analytics сразу после того, как пользователь заполняет форму заказа и нажимает кнопку.

Составляем пункты плана:

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

Главное отличие события отправки формы заказа от обычного события на какой-то элемент, это наличие условия, что обязательные поля формы должны быть заполнены. Так как если создать событие только на клик по кнопке отправки формы заказа, то событие будет выполняться даже если форма не отправилась из-за какого-то незаполненного поля (не ввел имя, забыл вписать телефон и т.п.).

В текущем примере, есть следующая форма заказа из корзины:

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

Для этой цели есть проверенный способ средствами GTM и небольшого программирования.

Для начала создадим Пользовательскую переменную - Собственный код JavaScript

Далее, введем следующий код JavaScript:

function() { var name; //объявление новой переменной var phone; if (name != "" && phone != "") { return true; } return false; }

О том, что такое функции, переменные и условия, я объяснял в статье “Контекстный кодинг”. Если желаете разобраться в деталях, то рекомендую ознакомится.

В этой функции, есть две переменных - (name) имя и (phone) телефон, в которых в будущем будут значения полей формы. И условие if, которое гласит: Если имя и почта не содержат пустоту, то говорим (true) правда. В другом случае код скажет - (false) ложь.

Это и есть заготовка условия проверки. Теперь осталось в переменные name и email записывать данные из формы.

Сделать это достаточно просто. Нужно для начала найти элемент поля ввода на сайте и скопировать его Selector (селектор).

Пример в браузере Google Chrome:

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

Далее, для теста найдем элемент в консоли браузера и попытаемся получить его value, предварительно заполнив поле ввода каким-то значением.

Для поиска элемента есть стандартная команда:

document.querySelector(‘[селектор]’);

Выглядит это так:

Как видно, мы можем получать данные элемента по запросу.

Вставим эти команды в код проверки формы:

function() { var name = document.querySelector('#form110583608 > div.t-form__inputsbox > div.t-input-group.t-input-group_nm > div.t-input-block > input').value; //селектор поля name var phone = document.querySelector('#form110583608 > div.t-form__inputsbox > div.t-input-group.t-input-group_ph > div.t-input-block > input').value; //селектор поля phone if (name != "" && phone != "") { return true; } return false; }

Важно: рекомендую копировать селекторы элементов формы в её исходном виде. То есть тогда, когда она еще не выдала ошибку при заполнении. Если говорить проще - перезагрузите страницу и только тогда копируйте селекторы.

Если вам тоже кажется, что эти селекторы смотрятся громоздко в коде, то в функционале GTM есть Пользовательская переменная - Элемент DOM, которая может получать данные элемента по селектору таким же образом, как и document.querySelector.

Заполняется она так:

Ecommerce своими руками без программиста: пошаговая инструкция

А добавить в код нужно будет следующим образом:

function() { //переменные в коде объявляются в двойных фигурных скобках var name = {{name - форма заказа}}; //переменная с селектором поля name var phone = {{phone - форма заказа}}; if (name != "" && phone != "") { return true; } return false; }

Суть будет та же, но выглядит красивее.

В результате должна получится переменная проверки формы:

Ecommerce своими руками без программиста: пошаговая инструкция

Я её назвал “Проверка на заполненность полей Оформить заказ” - чтобы точно было понятно что она делает.

Осталось сделать тег на отправку события и триггер на кнопку и после этого проверить работоспособность проверки.

Создаем стандартный тег на отправку события в Google Analytics:

Ecommerce своими руками без программиста: пошаговая инструкция

Уверен с этим проблем не будет.

Далее, триггер. Нужно сделать триггер на клик кнопки “оформить заказ” и при этом сделать проверку заполненности полей.

Кнопку найдем с помощью селектора и добавим условие, чтобы переменная “Проверка на заполненность полей Оформить заказ” вернула нам true.

Ecommerce своими руками без программиста: пошаговая инструкция

Условие: Click Element - соответствует селектору CSS позволяет сравнивать селектор элемента по которому был клик, с селектором условия. И при соответствии считает проверку успешной.

А вторым условием была подставлена переменная проверки, где ожидаемое значение: равно - true.

Конечный результат тега и триггера проверки отправки формы:

Важно: помните, что в теге Событие, поля Категория и Действия соответствуют Категории и Действию цели Google Analytics, которую вы создали.

Проверяем работу, не забыв обновить Диспетчер тегов и перезагрузив страницу сайта:

Без заполнения данных:

Условия не выполнены, событие не сработало и ничего не было отправлено.

При успешном заполнении:

После успешного оформления заказа сайт переадресует на страницу thanks, потому была показана статистика Google Analytics в реальном времени, где событие было отображено на временном графике.

Итак, отправка событий с формы работает успешно.

Шаблон проверки формы заказа гибок и его можно применять на разных таблицах с разными обязательными формами, просто меняя селекторы и изменяя количество переменных в условии. Например если бы там было еще обязательная переменная почта (email), то код бы выглядел так:

function() { //переменные в коде объявляются в двойных фигурных скобках var name = {{name - форма заказа}}; //переменная с селектором поля name var phone = {{phone - форма заказа}}; var email = {{email - форма заказа}}; if (name != "" && phone != "" && email != "") { return true; } return false; }

Событие отправки формы заказа по условию сделана, теперь перейдем непосредственно к настройке e-commerce.

Заполняем данные E-commerce в datalayer

Давайте разберемся для начала, какие данные нужны для e-commerce.

Для корректной работы e-commerce как минимум нужно:

transactionId - ID текущей транзакции (будет отображаться в отчетности Google Analytics)

transactionTotal - Сумма стоимости всех товаров

transactionProducts - Перечисление товаров

currency - Используемая валюта при покупке

Каждый товар в transactionProducts должен иметь следующие минимальные данные:

name - название товара

price - цена товара

quantity - количество единиц товара

sku - артикул товара

Здесь описаны дополнительные данные, которые можно собрать с помощью e-commerce

Отлично, теперь нам нужно определить, где взять в корзине сайта эти данные

Ecommerce своими руками без программиста: пошаговая инструкция

Исходя из скриншота видно, что у товаров есть name, quantity и price. Но у товаров нету sku - это не проблема, разберем в процессе.

В корзине также есть сумма товаров, которую можно считать transactionTotal. В качестве currency (валюты) можно просто вписать RUB - т.к. на сайте используются рубли. А transactionId будет случайным числом, которое надо будет сгенерировать.

Начнем составлять шаблон для заполнения. Для этого нам потребуется тег “Пользовательский HTML”.

Внесем туда для начала переменные:

<script> var currency; var trasactionId; var transactionTotal; var transactionProducts = [ ]; </script>

Выглядит для начала так:

Ecommerce своими руками без программиста: пошаговая инструкция

transactionProducts равняется скобкам, потому что это обозначает в JavaScript будущий список значений. А учитывая, что туда будут динамично вписываться товары из корзины, то нужно написать именно так.

А теперь давайте последовательно заполним данными каждую переменную от простого к сложному.

  • currency - тут всё просто. Пишем:
<script> var currency = 'RUB'; var trasactionId; var transactionTotal; var transactionProducts = [ ]; </script>

Кстати если потребуется иная валюта, то просто впишите её аббревиатуру. Например для евро - EUR, для долларов - USD и т.д. Только не забудьте внести в кавычки как в примере (одинарные или двойные).

  • transactionId - тут придется создать переменную, которая будет генерировать случайное число. В GTM такая есть:

Внедряем полученную переменную в код:

<script> var currency = 'RUB'; var trasactionId = {{Случайное число}}; var transactionTotal; var transactionProducts = [ ]; </script>
  • transactionTotal - получить сумму товаров тоже несложно.

Для этого нужно найти элемент на сайте, который выдает нужное значение:

Ecommerce своими руками без программиста: пошаговая инструкция

Но прежде, давайте проверим в консоли, что это то, что нам нужно:

Как видно на гифке, первый вызов был по селектору с добавлением innerText - это позволяет получить данные записанные в найденном элементе.

И в выводе получился текст: “1 251 р.” - что не подходит для записи в transactionTotal, т.к. нам нужно просто число.

Поэтому к следующему вызову был добавлен метод: .replace

Где в скобках первое значение в кавычках “что заменить”, а второе - “на что заменить”. В данном случае заменен: “ р.” (конец строки после числа) на пустое значение. И на третий раз метод повторили и был убран лишний пробел, в результате получив число.

Рекомендую запомнить метод replace - определенно пригодится при поиске нужного значения на иных сайтах.

Результирующую комбинацию записываем в переменную:

<script> var currency = 'RUB'; var trasactionId = {{Случайное число}}; var transactionTotal = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-bottom > div > span.t706__cartwin-prodamount').innerText.replace(' р.','').replace(' ',''); var transactionProducts = [ ]; </script>
  • transactionProducts - заполнение это переменной будет самой сложной и можно сказать главная часть этого руководства.

Для начала повторим, что нам нужно сделать и в чём проблема.

В эту переменную нужно записать товары, которые были добавлены в корзину. Изначально неизвестно, какие товары будут добавлены в корзину и сколько их будет. Следовательно, элемент “товар” в корзине мы не можем выбрать по селектору, т.к. он непостоянный и динамичный. И в этом вопросе нам поможет немного логики и щепотка программирования.

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

Смотрите пример ниже и разберем его далее:

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

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

Затем, с помощью квадратных скобок и введения номера, я мог выбирать любой дочерний элемент из списка. То есть сейчас имеется доступ ко всем товарам корзины и можно без проблем вписать данные каждого товара. Всё что требуется - создать последовательную запись каждого children таблицы.

Запишем следующее в код шаблона:

<script> var currency = 'RUB'; var trasactionId = {{Случайное число}}; var transactionTotal = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-bottom > div > span.t706__cartwin-prodamount').innerText.replace(' р.','').replace(' ',''); var transactionProducts = [ ]; var list = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-products').children for (var i = 0; i < list.length; i++) { transactionProducts.push({ name: list[i], price: list[i], quantity: list[i], sku: '' }) } </script>

Что нового добавилось:

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

В цикле for объявляется переменная i, которая принимает значение 0 и каждую итерацию цикла увеличивается на 1, до тех пор, пока длина списка товаров (list.length) больше переменной i. Например сейчас всего три товара в списке и list.length будет равно 3, значит цикл повторится 3 раза с увеличением переменной i на единицу каждый раз в конце прохода цикла.

Внутри цикла реализован следующий метод:

transactionProducts.push({ name: list[i], price: list[i], quantity: list[i], sku: '' })

Который обозначает, что каждый проход цикла, в объявлений список transactionProducts вносится (push) новый элемент, который содержит 4 переменных: name, price, quantity и sku. И пока что каждый элемент принимает значение переменной list[i]. А значит при каждом прохождении цикла будет вносится значение подобным образом: list[0], list[1], list[2] и так пока не законится цикл.

Помните, что в переменной list внесены товары? а значит вызов list[i] будет выглядеть так:

По факту будет запись каждого товара во все переменные. Это близко, но не совсем то, что нужно. Например, нужно найти название товара, а не весь товар. Значит list[i] в переменной name надо уточнить тем, что надо из рассматриваемого товара найти нужный элемент с названием:

Как видно, можно обратится к children текущего children и найти интересующий нас элемент. В данном случае это был 1 элемент, который содержал нужный текст.

Следовательно можно дополнить переменную name такой формулировкой:

list[i].children[1].innerText

И теперь в name будет записываться название каждого товара.

С ценой и количеством поступим также:

При поиске количества товара как видно пришлось обратиться к дочернему элементу дважды и был получен нужный результат.

При поиске цены товара был задействован метод replace, чтобы избавиться от лишних символов.

В результате скрипт получится таким:

<script> var currency = 'RUB'; var transactionId = {{Случайное число}}; var transactionTotal = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-bottom > div > span.t706__cartwin-prodamount').innerText.replace(' р.','').replace(' ',''); var transactionProducts = [ ]; var list = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-products').children for (var i = 0; i < list.length; i++) { transactionProducts.push({ name: list[i].children[1].innerText, price: list[i].children[3].innerText.replace(' р.',''), quantity: list[i].children[2].children[1].innerText, sku: '' }) } </script>

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

Ну и последнее - данные надо внести в datalayer.

Давайте ненадолго отвлечемся от текущей задачи и по простому разберем, что такое datalayer.

Это по факту список Google Tag Manager, в котором он записывает и хранит данные произошедших событий. Его можно вызвать в консоли браузера, чтобы посмотреть его записи:

Как видно, он хранит все события, которые были произведены GTM.

Кроме того, с помощью datalayer можно вызывать события и хранить данные:

datalayer может вызывать пользовательские события. Здесь например был вызван test_event.

И есть возможность сохранить переменные с помощью push, в данном случае - data_list.

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

Дополним наш скрипт на основе полученных знаний:

<script> var currency = 'RUB'; var transactionId = {{Случайное число}}; var transactionTotal = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-bottom > div > span.t706__cartwin-prodamount').innerText.replace(' р.','').replace(' ',''); var transactionProducts = [ ]; var list = document.querySelector('#rec110583608 > div > div.t706__cartwin.t706__cartwin_showed > div.t706__cartwin-content > div.t706__cartwin-products').children for (var i = 0; i < list.length; i++) { transactionProducts.push({ name: list[i].children[1].innerText, price: list[i].children[3].innerText.replace(' р.',''), quantity: list[i].children[2].children[1].innerText, sku: '' }) } dataLayer.push({ 'event': 'ecommerce', //пользовательская переменная 'transactionId': trasactionId, //идентификатор заказа 'transactionTotal': transactionTotal, //сумма заказа 'transactionProducts': transactionProducts, //товары 'currency': currency //валюта }); </script>

Был добавлен метод dataLayer.push в который внесено пользовательское событие (event) - ecommerce. Вызов пользовательского события пригодится нам в будущем.

И добавлены переменные, которые были ранее собраны.

В результате в datalayer будут нужные для e-commerce значения и будет произведен вызов пользовательского события. Давайте протестим работу, добавив к тегу событие на клик кнопки оформить заказ:

Как видно, всё работает. В datalayer есть актуальные данные товаров, даже при их изменении.

Остался последний шаг - отправить данные в Google Analytics.

Завершение цепи событий - отправка транзакции в Google Analytics

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

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

Был создан тег в виде стандартного шаблона Google Analytics, где типом отслеживания была указана “транзакция”, а в качестве триггера было создано пользовательское событие ecommerce - то которое вызывает datalayer. Следовательно отправка данных будет сразу после того, как в datalayer попадут данные e-commerce.

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

В теге отправки формы был настроен порядок активации тегов, где был указан тег для e-commerce. То есть тег e-commerce будет вызван сразу после отправки формы и не будет вызван, если произошла какая-то ошибка (неправильное заполнение например).

В результате выстраивается конечная цепочка тегов:

  • Тег отправки формы заказа
  • Тег заполнения данных для e-commerce
  • Тег отправки данных e-commerce в Google Analytics

Вот и всё! Результат можно проверить либо в отчетах Google Analytics по электронной торговле, либо с помощью расширения браузера - GA Debug:

Ecommerce своими руками без программиста: пошаговая инструкция

Если еще нет такого расширения - рекомендую поставить. Удобно для отслеживания отправки событий в Google Analytics.

Это конечно круто, но как это применить к моему сайту?

Весь перечисленный выше алгоритм и примененные шаблоны кода можно применить к большинству сайтов, где есть корзина в табличном виде (это почти все интернет-магазины). Однако алгоритм по минимуму, но придется подстраивать под ситуацию. Например естественно селекторы будут уникальны для разных сайтов, а набор children, чтобы найти name или price может быть другим.

Еще например встречались мне таблицы, где содержались не только товары, но и куски заголовков:

Тут сразу стало понятно, что в списке товаров самый первый элемент и последний были лишними, потому условие в цикле перечисления товаров был другим. Было исходно так:

for (var i = 0; i < list.length; i++)

На этой сайте сделано так:

for (var i = 1; i < list.length - 1; i++)

То есть цикл начинался не с первого элемента, а со следующего (i = 1, а не 0) и последний элемент не обрабатывался (list.length - 1, длина на 1 меньше).

На другом сайте товары были вообще через один:

Потому элементы нужно было брать с пропуском. И условие цикла было таким:

for (var i = 0; i < list.length; i =+ 2)

где каждый цикл, к i прибавлялось не 1, а 2 (i =+ 2)Следовательно и на вашем сайте возможно придется изменить шаблон в зависимости от условий.

Если ваш сайт сделан в конструкторе Tilda, то вот шаблон ecommerce:

<script> var transactionTotal = document.querySelector(‘Селектор элемента, где вписана сумма’).innerText; //не забудьте убрать лишнее с помощью replace var transactionId = {{Случайное число}} var currency = 'RUB' var transactionProducts = [] var list = document.querySelector(‘Селектор таблицы товаров’).children for (var i = 0; i < list.length; i++) { transactionProducts.push({ name: list[i].children[1].innerText, price: list[i].children[3].innerText.replace(' р.',''), quantity: list[i].children[2].children[1].innerText, sku: '' }) } dataLayer.push({ 'event': 'ecommerce', //пользовательская переменная 'transactionId': trasactionId, //идентификатор заказа 'transactionTotal': transactionTotal, //сумма заказа 'transactionProducts': transactionProducts, //товары 'currency': currency //валюта }); </script>

В заключение

Руководство вышло довольно длинным и спасибо тем смелым людям, которые осилили его до конца. Надеюсь, описанное поможет лучше понять работу функционала GTM и e-commerce в частности.

Я планировал продолжить цикл статей по GTM. Следующей темой возможно станет разбор расширенного e-commerce - как считаете, актуально? И если у вас есть тема для разбора по GTM, пишите в комментариях, буду рад.

Впрочем, иногда текстовый формат сложен - проще один раз увидеть (и сделать самому), чем 100 раз прочитать. Мастер классы по GTM и аналитике, которые я веду в рамках “Весь контекст за 4 месяца” занимают около 5-6 часов демонстрации экрана - в таком формате контент воспринимается существенно проще, даже если у вас совсем немного опыта.

P.S.

Если моя статья показалась вам не столь сложной, вы можете проверить свои знания о контекстной рекламе при помощи вот такого теста из 15 вопросов, в составлении которого я также принял участие.

2020
15 комментариев

Представляю лицо предпринимателя который перешел на статью по запросу "как запустить e-commerce без программиста" в надежде найти быстрое и простое решение, даже конструкторы/page builders в которых все собирается мышкой + проставляются метки

2

А потом читает пару абзацев и... Вот так и затягиваем в работу с GTM

Ну да, ну да, без программиста, ведь каждый знает как легко и просто написать скрипт на JavaScript для работы с DOM...

Да, все детали расписаны в статье и ничего дополнительно искать не нужно - что может быть проще? )

Спасибо за интересный мануал, на русском по GTM редко попадались.

Интересует вопрос, есть форма ajax с Google капчой. Для триггера "Отправка формы" указан тип события стандартный " Form Submission" без проверки. Все работает, но проблема, что даже, если клиент ввел неверно какуе-то инфо все равно это засчитвается как отправка формы.

Условие в js понятно как сделать, а можно ли доп. капчу прописать, что, если клиент не прошел проверку, то событие засчитывать не нужно.

Пытался сделать с Element Visibility (если показано уведомление, что сообщение отправлено срабатывало бы событие), но тогда вообще не работает.

Если не сложно, не могли бы помочь?

Я так понимаю речь идет о такой капче:
https://cloud.moab.pro/index.php/s/iEXfABTmsX3Sk3H
Если так, то тут всё довольно просто.
Нужно отслеживать атрибут элемента, в котором хранится статус капчи - пройдена она или нет:
не пройдена - https://cloud.moab.pro/index.php/s/xbHSq7bgtSwjSfA
пройдена - https://cloud.moab.pro/index.php/s/BzwBP2Xk4356MBK
Отслеживается с помощью переменной автоматического события. Выглядеть будет так:
https://cloud.moab.pro/index.php/s/CfWKQ5S5mCy3mtf
Соответственно в условие записывается, если переменная равна true, значит выполнить тег

Отличная статья, но у меня почему то не получается вызвать событие ecommerce. Подскажите какие распространенные ошибки могут быть в этом случае?