← Back to Academia

10.16 - GTM - dataLayer

dataLayer - единый интерфейс между сайтом и GTM. Всё, что не в dataLayer - не существует для аналитики.

#intermediate #technical #block-10


Навигация

10.15 - GTM - архитектура и принципы | → 10.17 - GTM - встроенные переменные


Что такое dataLayer

dataLayer - это JavaScript-массив, который служит транспортным слоем между вашим сайтом (или приложением) и Google Tag Manager. Разработчики пушат в него данные, GTM их читает и использует для триггеров и переменных.

// dataLayer создаётся ДО загрузки GTM-контейнера window.dataLayer = window.dataLayer || [];

Почему не DOM scraping

ПодходНадёжностьСкоростьМасштабируемость
dataLayer push✅ Высокая - данные структурированы✅ Мгновенно✅ Любые данные
DOM scraping (CSS selectors)❌ Ломается при редизайне❌ Зависит от рендера❌ Только видимое
Auto-Event Variables⚠️ Средняя - зависит от HTML⚠️ Event-driven⚠️ Ограничено кликами/формами

Правило: Если данные доступны на бэкенде или в state приложения - всегда используйте dataLayer. DOM scraping - крайний случай, когда у вас нет доступа к коду.

Подробнее: 10.21 - GTM - DOM Scraping vs dataLayer

Источник: Google - Data Layer Developer Guide


Синтаксис

Базовый push

// Простое событие dataLayer.push({ 'event': 'button_click', 'button_id': 'cta-hero', 'button_text': 'Оформить заявку' });

Push с e-commerce данными

// Просмотр товара (GA4 Enhanced Ecommerce) dataLayer.push({ 'event': 'view_item', 'ecommerce': { 'currency': 'KZT', 'value': 45990, 'items': [{ 'item_id': 'SKU-001', 'item_name': 'Смартфон Samsung Galaxy A54', 'item_category': 'Электроника', 'item_category2': 'Смартфоны', 'item_brand': 'Samsung', 'price': 45990, 'quantity': 1 }] } });

Важно: ecommerce clear

Перед каждым e-commerce push нужно очищать предыдущие данные:

// ✅ Правильно - clear перед push dataLayer.push({ ecommerce: null }); // Clear dataLayer.push({ 'event': 'add_to_cart', 'ecommerce': { 'currency': 'KZT', 'value': 45990, 'items': [{ /* ... */ }] } }); // ❌ Неправильно - без clear // Данные предыдущего события могут смешаться с новыми dataLayer.push({ 'event': 'add_to_cart', 'ecommerce': { /* ... */ } });

Почему: dataLayer делает shallow merge объектов. Если предыдущий push содержал ecommerce.items с 5 товарами, а новый - с 1, без clear вы получите мусор.

Источник: Google - GA4 Ecommerce Developer Guide


Как GTM читает dataLayer

Data Layer Variable (v2)

В GTM создаётся переменная типа Data Layer Variable:

НастройкаЗначениеПояснение
Variable Nameecommerce.items.0.item_nameDot-notation путь к значению
Data Layer VersionVersion 2Всегда Version 2
Default Value(not set)Если значение отсутствует

Dot-notation - доступ к вложенным объектам

// Push dataLayer.push({ 'user': { 'id': '12345', 'segment': 'high_value', 'traits': { 'city': 'Almaty' } } }); // В GTM Data Layer Variable: // 'user.id' → '12345' // 'user.segment' → 'high_value' // 'user.traits.city' → 'Almaty'

Custom Event Trigger

Триггер срабатывает, когда в dataLayer появляется push с определённым event:

Trigger Type: Custom Event Event Name: add_to_cart

Этот триггер сработает при:

dataLayer.push({ 'event': 'add_to_cart', ... });

Паттерны для разных вертикалей

Финтех (BCC, Halyk, Solva)

// Начало заявки на кредит dataLayer.push({ 'event': 'loan_application_start', 'loan_type': 'consumer', // consumer, mortgage, auto 'loan_amount': 500000, // KZT 'loan_term_months': 12, 'application_source': 'product_page', 'user_segment': 'existing_client' // new, existing_client }); // Одобрение заявки dataLayer.push({ 'event': 'loan_approved', 'loan_type': 'consumer', 'loan_amount': 500000, 'approval_time_seconds': 45, 'credit_score_range': '600-700' // не передаём точный score! }); // ⚠️ Никогда не пушим PII в dataLayer без хеширования: // ❌ 'email': 'user@email.com' // ❌ 'phone': '+77001234567' // ❌ 'iin': '123456789012' // ✅ 'user_id': 'hashed_id_abc123'

E-commerce (Kaspi Shop, Arbuz.kz)

// Полный purchase event dataLayer.push({ ecommerce: null }); dataLayer.push({ 'event': 'purchase', 'ecommerce': { 'transaction_id': 'ORD-2024-00567', 'value': 125780, 'tax': 15093.60, // 12% НДС 'shipping': 1500, 'currency': 'KZT', 'coupon': 'WINTER20', 'items': [ { 'item_id': 'SKU-001', 'item_name': 'Куртка зимняя Columbia', 'affiliation': 'Магазин Центральный', 'coupon': 'WINTER20', 'discount': 8000, 'item_brand': 'Columbia', 'item_category': 'Одежда', 'item_category2': 'Верхняя одежда', 'item_category3': 'Куртки', 'item_variant': 'Чёрная, XL', 'price': 54990, 'quantity': 1 }, { 'item_id': 'SKU-042', 'item_name': 'Термобельё Craft Active', 'item_brand': 'Craft', 'item_category': 'Одежда', 'item_category2': 'Термобельё', 'price': 35395, 'quantity': 2 } ] } });

Mobile App Web-View (гибридные приложения)

// Для web-view внутри мобильного приложения // Часто нужно передать контекст из native layer dataLayer.push({ 'event': 'webview_loaded', 'app_version': '3.4.2', 'platform': 'ios', 'user_id': 'native_user_abc123', 'session_id': 'native_session_xyz', 'is_webview': true });

Debugging dataLayer

1. Console

// В DevTools Console: console.table(dataLayer); // Или отфильтрованный: dataLayer.filter(e => e.event === 'purchase');

2. GTM Preview Mode

GTM Preview Mode показывает:

  • Все dataLayer pushes в хронологическом порядке
  • Состояние Data Layer Variables в момент каждого события
  • Какие триггеры сработали и не сработали

3. Расширения

  • dataLayer Inspector+ (Chrome) - лучший инструмент, показывает real-time pushes
  • Omnibug - универсальный дебаггер для всех тегов
  • GA Debugger - специфично для GA4

Источник: Analytics Mania - How to Debug dataLayer


Частые ошибки

1. Push до создания массива

// ❌ GTM ещё не загружен, dataLayer не существует dataLayer.push({ 'event': 'page_loaded' }); // ✅ Всегда инициализируйте window.dataLayer = window.dataLayer || []; dataLayer.push({ 'event': 'page_loaded' });

2. Overwrite вместо push

// ❌ Перезаписывает весь массив dataLayer = [{ 'event': 'purchase' }]; // ✅ Добавляет в существующий dataLayer.push({ 'event': 'purchase' });

3. Типы данных

// ❌ value как строка - GA4 не посчитает сумму dataLayer.push({ 'event': 'purchase', 'ecommerce': { 'value': '45990' } }); // ✅ value как число dataLayer.push({ 'event': 'purchase', 'ecommerce': { 'value': 45990 } });

4. Timing на SPA (React, Vue, Next.js)

На SPA-сайтах dataLayer.push с событием page_view нужно вызывать при каждом route change, а не только при первой загрузке:

// React Router v6 пример import { useEffect } from 'react'; import { useLocation } from 'react-router-dom'; function Analytics() { const location = useLocation(); useEffect(() => { window.dataLayer = window.dataLayer || []; window.dataLayer.push({ 'event': 'page_view', 'page_path': location.pathname, 'page_title': document.title }); }, [location]); return null; }

В GTM для SPA используйте триггер History Change (см. 10.19 - GTM - триггеры глубоко) или Custom Event page_view.


Архитектура: кто что пушит

Frontend

Backend

SSR: начальное состояние

pageview, user data

clicks, forms, scrolls

view_item, add_to_cart, purchase

virtual pageviews

Сервер

dataLayer Array

Page Load

User Actions

E-commerce Events

SPA Router

Google Tag Manager

GA4 Tag

Meta Pixel Tag

Google Ads Tag

Custom Tags

Ответственность

Источник данныхКто реализуетПример
Page-level данные (URL, title)GTM Built-in VariablesАвтоматически
User identity (user_id, segment)Backend → dataLayer на SSR<script>dataLayer.push({user_id: '...'})</script>
E-commerce (items, prices)Frontend → dataLayerНа событиях: view, add, purchase
Form submissionsFrontend → dataLayerНа submit, после валидации
Custom interactionsFrontend → dataLayerScroll depth, video play, tab switch

Дополнительные материалы


🔧 Практика

Задание 1: dataLayer для интернет-магазина

Напишите полный набор dataLayer.push() для e-commerce:

  1. page_view (с user data, если авторизован)
  2. view_item_list (категория товаров)
  3. view_item (карточка товара)
  4. add_to_cart
  5. begin_checkout
  6. purchase

Для каждого: полный код с всеми рекомендованными параметрами GA4.

Задание 2: Debug

  1. Откройте любой e-commerce сайт (arbuz.kz, kaspi.kz, wildberries.kz)
  2. В Console: console.table(dataLayer)
  3. Совершите 5 действий (просмотр, добавление в корзину, поиск)
  4. Задокументируйте: какие события пушатся, какие параметры, что отсутствует?

Задание 3: SPA dataLayer

Реализуйте dataLayer.push для SPA на React/Vue:

  • Virtual pageview при route change
  • User properties при авторизации
  • Custom event при scroll > 50%

Связанные заметки