17
0
0
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
Назад

Большое руководство по разметке электронной торговли для разработчиков. Часть 4

Время чтения 42 минуты
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники
17
0
0
Нет времени читать?
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники

Когда фронтенд-разметка для Standard e-commerce уже отстроена — add_to_cart, begin_checkout, purchase и прочая классика жанра (как в предыдущей статье), бизнес понимает, что хочет больше. Не просто знать, что «кто-то нажал кнопку», а понимать, почему человек вообще дошел до товара, какие предложения видел, какие баннеры проигнорировал, где потерялся и на каком шаге выдохся.

На сцену выходит Enhanced e-commerce — продвинутая модель, которая позволяет анализировать весь пользовательский путь, начиная с момента, когда человек просто смотрит на сетку товаров, и заканчивая тонкими деталями вроде кликов по промоакциям и применения купонов.

Большое руководство по разметке электронной торговли для разработчиков. Часть 4

Если стандартные события дают ответ: «Добавил в корзину? Купил?», то Enhanced уже рассказывает: «Из какого списка пришел? Какие товары видел? На какой баннер кликнул? Когда бросил оформление? Какой купон спас конверсию?»

Эта последняя часть цикла, и она, как и предыдущая статья, полностью практическая. Она показывает frontend-разработчикам, как без участия сервера разметить ключевые события Enhanced e-commerce так, чтобы они:

  • надежно работали,
  • попадали в GTM,
  • корректно отправлялись в GA4,
  • и были полезными для аналитиков.

Буду писать примеры так, чтобы было понятно и фронту, и аналитикам, когда это попадет в DebugView.

Просмотры списков товаров (view_item_list)

Пользователь открывает страницу категории, каталога, подборки или лендинга с товарами. Бэкенд ничего не передает в dataLayer, а аналитике всё равно нужно знать:

  • какие товары были показаны;
  • в каком списке (категории, подборке, кампании);
  • и с какими параметрами.

Enhanced e-commerce использует два ключевых события:

  • view_item_list — просмотр списка товаров.
  • select_item — клик по карточке из списка.

Оба события полностью могут быть размечены на фронте без участия сервера.

Фронтенд-пример разметки (DOM)

На каждой карточке товара добавляем data-* атрибуты. Это стандартная, безопасная и GTM-дружелюбная практика:


<div class="product-card"
     data-id="4581"
     data-name="Кофемашина Philips 5400"
     data-category="home-appliances"
     data-price="699.00"
     data-list="category_page">
  ...
</div>

 

Если карточки выводятся динамически (через JS), важно, чтобы атрибуты были доступны к моменту PageView, либо нужно использовать триггер DOM Ready.

GTM: настройка переменных и триггеров

Переменные (Variables)

Создаем переменные типа DOM Element → Element Attribute:

Триггеры

  • view_item_list → триггер Page View – DOM Ready, условие: страница содержит .product-card.
  • select_item → триггер Click – All Elements, условие: клик по .product-card.

Отправка в dataLayer (пример Custom HTML тега)


<script>
(function() {
  const cards = document.querySelectorAll('.product-card');
  if (!cards.length) return;

  const items = [];

  cards.forEach(card => {
    items.push({
      item_id: card.dataset.id,
      item_name: card.dataset.name,
      item_category: card.dataset.category,
      price: Number(card.dataset.price),
      item_list_name: card.dataset.list
    });
  });

  window.dataLayer.push({
    event: 'view_item_list',
    ecommerce: {
      item_list_name: cards[0].dataset.list,
      items: items
    }
  });
})();
</script>

 


<script>

//select_item -- клик по карточке
document.addEventListener('click', function(e) {
  const card = e.target.closest('.product-card');
  if (!card) return;

  dataLayer.push({
    event: 'select_item',
    ecommerce: {
      items: [{
        item_id: card.dataset.id,
        item_name: card.dataset.name,
        item_category: card.dataset.category,
        price: Number(card.dataset.price),
        item_list_name: card.dataset.list
      }]
    }
  });
});
</script>

 

В GTM это можно разместить как Custom HTML тег либо как встроенный listener.

Аналитики смогут видеть:

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

Клики по баннерам и промоакциям (promotion_view, promotion_click)

На странице есть баннеры, промоблоки, спецпредложения или внутренние рекламные модули. Сервер не передает события в dataLayer, но необходимо фиксировать:

  • какие баннеры видит пользователь (promotion_view);
  • по каким баннерам он кликает (promotion_click).

Эти события относятся к Enhanced e-commerce и могут быть полностью размечены на фронте через DOM и GTM.

Фронтенд-пример разметки (DOM)

Каждому баннеру добавляются data-атрибуты с параметрами акции:


<div class="promo-banner"
     data-promo-id="spring_sale"
     data-promo-name="Весенняя распродажа"
     data-position="homepage_top">
  <a href="/catalog/sale">...</a>
</div>

 

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

GTM: настройка переменных и триггера

Переменные

Создаются DOM-переменные для получения атрибутов:

Триггеры

  • Для просмотра баннера (promotion_view): Page View – DOM Ready с условием: наличие .promo-banner на странице.
  • Для клика (promotion_click): Click – All Elements с условием: клик по .promo-banner или внутренним элементам (.promo-banner *).

Отправка события в dataLayer (пример кода)

promotion_view — фиксируем факт показа баннера:


<script>
(function() {
  const banners = document.querySelectorAll('.promo-banner');
  if (!banners.length) return;

  const items = [];

  banners.forEach(banner => {
    items.push({
      promotion_id: banner.dataset.promoId,
      promotion_name: banner.dataset.promoName,
      creative_slot: banner.dataset.position
    });
  });

  dataLayer.push({
    event: 'promotion_view',
    ecommerce: {
      promoView: {
        promotions: items
      }
    }
  });
})();
</script>

 

promotion_click — фиксируем клики по баннеру:


<script>
document.addEventListener('click', function(e) {
  const banner = e.target.closest('.promo-banner');
  if (!banner) return;

  dataLayer.push({
    event: 'promotion_click',
    ecommerce: {
      promoClick: {
        promotions: [{
          promotion_id: banner.dataset.promoId,
          promotion_name: banner.dataset.promoName,
          creative_slot: banner.dataset.position
        }]
      }
    }
  });
});
</script>

 

Этот код можно разместить как Custom HTML тег в GTM.

Что это даст аналитикам:

  • Возможность измерять эффективность каждого баннера: показы и клики.
  • Расчет CTR баннеров на разных позициях страницы.
  • Понимание, какие промоакции реально приводят к взаимодействию.
  • Возможность связывать баннеры с последующими конверсионными событиями: select_item → add_to_cart → purchase.
  • Оптимизацию размещения баннеров на основе данных, а не на интуиции.

Добавление в избранное (add_to_wishlist)

На сайте есть кнопка-«сердечко» или «Добавить в избранное», но сервер не отправляет событие в dataLayer. Необходимо фиксировать, какие товары пользователи добавляют в wishlist, чтобы анализировать популярность товаров и сравнивать ее с реальными покупками.

Фронтенд-пример разметки (DOM)

Каждая кнопка добавления в избранное должна содержать информацию о товаре через data-* атрибуты:


<button class="wishlist-btn"
        data-id="12345"
        data-name="Спортивные кроссовки"
        data-price="4990"
        data-category="shoes">
  ♥
</button>

 

Если кнопка лежит внутри карточки товара, допускается считывание атрибутов у родителя:


<div class="product-card"
     data-id="12345"
     data-name="Спортивные кроссовки"
     data-price="4990"
     data-category="shoes">
  <button class="wishlist-btn"></button>
</div>

 

GTM: настройка переменных и триггера

Переменные

Если нужные атрибуты находятся у родительского элемента, можно использовать: Auto-Event Variable → Element → “Closest Selector” → .product-card.

Триггер

Тип: Click – All Elements.

Условие: Click Element matches CSS selector .wishlist-btn

Отправка события в dataLayer (Custom HTML тег)


<script>
dataLayer.push({
  event: 'add_to_wishlist',
  ecommerce: {
    items: [{
      item_id: '{{varProductId}}',
      item_name: '{{varProductName}}',
      price: Number('{{varProductPrice}}'),
      item_category: '{{varProductCategory}}'
    }]
  }
});
</script>

 

Вставляется в Custom HTML тег, который срабатывает при клике по .wishlist-btn.

Что это даст аналитикам:

  • Понимание, какие товары чаще попадают в wishlist, но не покупаются.
  • Возможность выявить товары с высоким интересом, но низкой конверсией.
  • Сегментацию событий: пользователи, активно добавляющие избранное, часто являются «теплой» аудиторией.
  • Возможность построить воронку «Просмотр → Избранное → Корзина → Покупка».
  • Основу для персонализированных рекомендаций и ремаркетинга, ориентированного на желания пользователя.

Шаги оформления заказа (checkout_step_1, checkout_step_2, checkout_step_3)

Пользователь проходит оформление заказа: вводит контактные данные, выбирает способ доставки, затем — способ оплаты. Сервер не передает информацию о шагах checkout, но необходимо зафиксировать каждое действие, чтобы понимать, где отваливаются пользователи.

Шаги могут выглядеть так:

  1. Step 1 — ввод контактных данных.
  2. Step 2 — выбор способа доставки.
  3. Step 3 — выбор метода оплаты.

Фронтенд-пример разметки

Разработчик помечает шаги через data-атрибуты:


<div class="checkout-step" data-step="1">
  <input type="text" name="email" placeholder="Email">
  <button class="checkout-next-btn" data-step="1">Далее</button>
</div>

<div class="checkout-step" data-step="2">
  <label>
    <input type="radio" name="delivery" value="courier"> Курьер
  </label>
  <button class="checkout-next-btn" data-step="2">Далее</button>
</div>

<div class="checkout-step" data-step="3">
  <label>
    <input type="radio" name="payment" value="card"> Онлайн-оплата картой
  </label>
  <button class="checkout-next-btn" data-step="3">Подтвердить заказ</button>
</div>

 

Важно: на кнопке или блоке есть data-step, которое GTM может считать.

GTM: настройка переменных и триггера

Переменные

Дополнительно можно сделать переменные для email/телефона, но не отправлять персональные данные в GA4, ограничимся шагами и выбором.

Триггер

Тип: Click – All Elements
Условие: Click Element matches CSS selector .checkout-next-btn

Отправка события checkout_step в dataLayer

Пример Custom HTML тега:


<script>
dataLayer.push({
  event: 'checkout_step',
  ecommerce: {
    checkout_step: Number('{{varCheckoutStep}}'),
    checkout_options: {
      delivery_method: '{{varDeliveryMethod}}',
      payment_method: '{{varPaymentMethod}}'
    }
  }
});
</script>

 

Тег срабатывает при клике на .checkout-next-btn.

Что это даст аналитикам:

  • Точную воронку прохождения checkout по шагам.
  • Понимание, на каком этапе пользователи чаще всего уходят.
  • Анализ конверсии каждого шага: контакты → доставка → оплата → покупка.
  • Возможность сравнить эффективность вариантов доставки и оплаты.
  • Основу для A/B-тестов оформления заказа.
  • Возможность корректировать UX checkout, если один шаг заметно «ломает» воронку.

Отмена заказа и возврат (refund)

Пользователь переходит в личный кабинет и нажимает кнопку «Отменить заказ» или отправляет заявку на возврат. Бэкенд может не отправлять событие о возврате в dataLayer, поэтому фиксацию отмены заказа приходится делать на фронте.

Обычно в интерфейсе есть кнопка:

  • «Отменить заказ».
  • «Оформить возврат».

Главное, чтобы на элементе были указаны данные заказа через атрибуты.

Фронтенд-пример разметки


<div class="order-item" 
     data-order-id="ORD-98431" 
     data-order-products='[{"id":"101","name":"Кроссовки","price":4990,"quantity":1}]'>
  
  <button class="order-cancel-btn"
          data-order-id="ORD-98431">
      Отменить заказ
  </button>
</div>

 

Комментарии:

  • data-order-id — уникальный ID заказа.
  • data-order-products — JSON со списком товаров, который можно считать через GTM.
  • Кнопка .order-cancel-btn инициирует refund.

GTM: настройка переменных и триггера

Переменные

Пример Custom JS Variable:


function() {
  try {
    var raw = {{varRefundProducts}};
    return JSON.parse(raw);
  } catch(e) {
    return [];
  }
}

 

Триггер

Тип: Click – All Elements
Условие: Click Element matches CSS selector .order-cancel-btn

Отправка события refund через Custom HTML тег


<script>
dataLayer.push({
  event: 'refund',
  ecommerce: {
    transaction_id: '{{varOrderId}}',
    items: {{varRefundProductsParsed}}
  }
});
</script>

 

Комментарии:

  • transaction_id — обязательное поле для GA4.
  • items — список товаров, участвующих в возврате или отмененном заказе.
  • Если товаров несколько — передаем полный массив объектов.

Что это даст аналитикам:

  • Отслеживание отмен заказов без участия бэкенда.
  • Понимание, какие товары чаще возвращают или отменяют.
  • Возможность построить метрику Refund Rate по товарам, категориям, брендам.
  • Выявление проблемных SKU: высокая доля возвратов может говорить о браке, неверных размерах или плохих фото.
  • Корректировку расчетов прибыли: возвраты и отмены можно вычитать из итоговых продаж.
  • Возможность анализировать влияние шагов checkout на вероятность возврата.

Комбинации и лайфхаки

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

«Интерес → Намерение → Покупка»

(Просмотр товара → Добавление в список → Покупка)

События view_item, add_to_wishlist, add_to_cart, purchase формируют линейный путь пользователя от интереса до оплаты. Enhanced e-commerce сохраняет идентификаторы товара, благодаря чему можно связать все шаги в одну цепочку.

Что это дает аналитикам и маркетологам:

  • Определение доли пользователей, которые переходят от интереса к намерению (wishlist).
  • Фокусировку на товарах, у которых много просмотров, но мало добавлений, — явные кандидаты для доработки карточки товара.
  • Оценку силы wishlist как инструмента доведения до покупки.
  • Возможность строить персонализированные сценарии: «в избранном лежит, но человек не возвращается».
  • Более точные сегменты для ретаргетинга.
  • Управление ассортиментом: понимание, какие товары популярны, но не продаются.

«Воронка оформления → Промокоды → Конверсия»

(Шаги checkout + Использование купона + Покупка)

События begin_checkout, checkout_progress, add_coupon, а также передача купона в purchase дают возможность связать:

  • где пользователь находится в процессе оформления;
  • когда он вводит купон;
  • влияет ли скидка на завершение покупки.

Что это дает аналитикам и маркетологам:

  • Определение провальных шагов в чекауте.
  • Выявление сценариев поведения: «люди ищут купон перед оплатой».
  • Анализ влияния купонов на общее завершение чекаута.
  • Оценку эффективности акций.
  • Понимание, стоит ли продвигать купоны или они только удлиняют покупку.
  • Возможность выбирать оптимальный размер скидки.

«Показы → Вовлечение → Покупка»

(Impressions → Promotion Click → Purchase)

События view_promotion и select_promotion, связанные с purchase, позволяют понять, какие баннеры или промоблоки реально продают, а какие просто занимают место.

Что это дает аналитикам и маркетологам:

  • Полный путь влияния баннера на доход.
  • Атрибуцию продаж не только по внешним источникам, но и по внутренним промо.
  • Оптимизацию баннерной сетки: какие блоки стоит заменить, какие оставить.
  • Формирование гипотез по креативам и их тестирование.
  • Увеличение дохода без роста трафика — просто за счет замены неэффективных баннеров.

Проверка и отладка

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

  • GTM Preview Mode — позволяет видеть, какие теги срабатывают, какие переменные получают значения и какие события пушатся в dataLayer.
  • GA4 DebugView — показывает реальные события в потоке данных GA4, помогает сверять структуру e-commerce и значения параметров.
  • Расширения браузера: GA Debugger, DataLayer Inspector — дают быстрый доступ к dataLayer и помогают искать ошибки в JS-разметке.

Типичные ошибки

  • Пустые item_id или transaction_id, что ломает аналитику.
  • Забытый currency, из-за чего GA4 не распознает транзакцию.
  • Дублирование событий при нескольких триггерах.
  • Неправильное использование DOM-переменных или CSS-селекторов, из-за чего не фиксируются клики.

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

Выводы

Enhanced e-commerce через фронт дает почти полный контроль над аналитикой даже без бэка. Используя комбинацию событий, триггеров и DOM-переменных, frontend могут фиксировать весь путь пользователя: от просмотра списков и карточек товаров до использования купонов, баннеров и возвратов.

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

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

Следующий шаг в развитии аналитики — автоматизация пушей в dataLayer через утилитные скрипты, интеграция с BI-системами и построение отчетных панелей, которые позволят принимать управленческие решения на основе полной картины поведения пользователей и продаж. 

Я на этом заканчиваю цикл статей, теперь у вас есть полноценный «швейцарский нож» для каждой из возможных ситуаций в ваших проектах.

Комментарии0
Тоже интересно
Комментировать
Поделиться
Скопировать ссылку
Telegram
WhatsApp
Vkontakte
Одноклассники