DataLayer — повний гайд для маркетологів
TL;DR: DataLayer — це JavaScript масив (window.dataLayer), який передає структуровані дані з вашого сайту до Google Tag Manager. Ви пушите події та пари ключ-значення через dataLayer.push(), потім читаєте їх у GTM через Data Layer Variables. Він забезпечує ecommerce трекінг, user properties та будь-які кастомні дані для тегів. Завжди використовуйте .push() — ніколи не присвоюйте напряму. Дебажте через GTM Preview mode, консоль браузера або розширення dataLayer Inspector.
Якщо Google Tag Manager — це мозок, то dataLayer — нервова система. Він передає інформацію з вашого сайту до GTM, щоб теги могли спрацьовувати з правильними даними в правильний час. Розуміння dataLayer — найважливіший навик для роботи з GTM, що виходить за межі базового трекінгу кліків.
Цей гайд пояснює dataLayer з основ — що це, як працює, як пушити дані, як читати їх у GTM та як дебажити проблеми. Попередні знання JavaScript не потрібні.
Що таке dataLayer у Google Tag Manager?
DataLayer — це JavaScript масив, який існує на кожній сторінці, де встановлено GTM. У консолі браузера він виглядає так:
window.dataLayer = [
{ "gtm.start": 1711929600000, "event": "gtm.js" },
{ "event": "gtm.dom" },
{ "event": "gtm.load" }
];
Кожен елемент масиву — це JavaScript об'єкт з парами ключ-значення. GTM постійно стежить за цим масивом. Коли пушиться новий об'єкт, GTM обробляє його миттєво — перевіряє тригери, оновлює змінні та запускає теги.
Думайте про dataLayer як про односторонню шину повідомлень:
- Ваш сайт пушить повідомлення — "користувач залогінився", "товар додано в кошик", "форма відправлена"
- GTM читає ці повідомлення — оцінює тригери, витягує значення та запускає відповідні теги
- Теги відправляють дані на платформи — GA4, Google Ads, Meta Pixel, TikTok тощо
DataLayer існує тільки в браузері (клієнтська сторона). Він не відправляється на жоден сервер сам по собі. GTM читає його локально і потім відправляє дані на аналітичні платформи через теги, які ви налаштували.
Як dataLayer працює технічно?
GTM підтримує внутрішню модель даних — об'єднаний стан усіх pushes у dataLayer. Коли ви пушите новий об'єкт, GTM не просто додає його в масив. Він мерджить новий об'єкт у свій внутрішній стан:
// Push 1
dataLayer.push({ user_type: 'free', page_category: 'pricing' });
// Push 2
dataLayer.push({ user_type: 'pro' });
// Внутрішній стан GTM після обох pushes:
// { user_type: 'pro', page_category: 'pricing' }
Ключові поведінки:
- Пізніші pushes перезаписують попередні значення для того ж ключа. У прикладі вище
user_typeзмінився зfreeнаpro. - Ключі, не включені в push, залишаються незмінними.
page_categoryзберігається, хоча Push 2 його не включав. - Ключ
eventє спеціальним. Коли push включає ключevent, GTM оцінює всі тригери, шукаючи збіг. Без ключаeventдані зберігаються, але жоден тригер не спрацьовує.
Ця поведінка мерджу — причина, чому ви можете пушити дані користувача при завантаженні сторінки і посилатися на них пізніше, коли спрацює подія кліку — значення залишаються в стані GTM до перезапису.
Як пушити дані в dataLayer?
Синтаксис завжди однаковий:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'form_submit',
form_id: 'contact-form',
form_name: 'Contact Us',
page_section: 'footer'
});
Розбираємо по частинах:
window.dataLayer = window.dataLayer || [];— перевірка безпеки. Якщо dataLayer ще не існує (push виконується до завантаження GTM), цей рядок створює його. Якщо вже існує — нічого не робить.window.dataLayer.push({...})— додає новий об'єкт в масив. GTM обробляє його миттєво.event: 'form_submit'— назва події. Тригери GTM порівнюються з цим значенням. Використовуйтеsnake_case.- Інші ключі — кастомні дані, які ви читаєте в GTM через Data Layer Variables.
Типові сценарії для dataLayer pushes:
| Сценарій | Де пушити | Приклад назви події |
|---|---|---|
| Дані сторінки (категорія, автор) | До GTM-сніпета в <head> | Подія не потрібна (push тільки з даними) |
| Статус логіну | Після перевірки автентифікації | user_data_ready |
| Відправка форми | У callback успішної відправки | form_submit |
| Додавання в кошик | Після додавання товару в стан кошика | add_to_cart |
| Завершення покупки | На сторінці підтвердження замовлення | purchase |
| Віртуальний перегляд (SPA) | Після зміни маршруту | virtual_page_view |
Як читати значення dataLayer у GTM через змінні?
Push даних — це одна сторона. Друга — читання їх у GTM. Для цього використовуються Data Layer Variables.
- У GTM перейдіть до Variables → User-Defined Variables → New
- Оберіть тип змінної: Data Layer Variable
- Введіть Data Layer Variable Name — має точно відповідати ключу з вашого push (наприклад,
form_id) - Назвіть змінну (наприклад,
DLV - form_id) та збережіть
Тепер ви можете використовувати {{DLV - form_id}} будь-де в GTM — у параметрах тегів, умовах тригерів або інших змінних.
Вкладені значення: Якщо ваш dataLayer push має вкладені об'єкти, використовуйте точкову нотацію в назві змінної:
// Push
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'T-12345',
value: 99.99,
currency: 'USD'
}
});
// Назва GTM змінної для transaction ID:
// ecommerce.transaction_id
Значення масивів: Для елементів масиву використовуйте дужки: ecommerce.items.0.item_name читає назву першого товару. Однак для ecommerce трекінгу зазвичай передають весь масив items до GA4, а не окремі елементи.
Яка різниця між dataLayer.push і прямим присвоєнням?
Це найчастіша помилка з dataLayer. Є два способи додати дані, але тільки один правильний:
// ПРАВИЛЬНО — GTM обробляє це миттєво
window.dataLayer.push({ event: 'signup', method: 'google' });
// НЕПРАВИЛЬНО — GTM цього ніколи не побачить
window.dataLayer = [{ event: 'signup', method: 'google' }];
Пряме присвоєння (dataLayer = [...]) замінює весь масив, знищуючи всі попередні дані та ламаючи внутрішній listener GTM. GTM прикріплює event listener до методу .push() масиву під час ініціалізації. Коли ви перезаписуєте масив, цей listener зникає.
Єдине валідне місце для прямого присвоєння — до GTM-сніпета, для попереднього заповнення даних при завантаженні сторінки:
<!-- Це ОК — виконується ДО ініціалізації GTM -->
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
page_category: 'blog',
page_author: 'John Smith',
user_type: 'subscriber'
});
</script>
<!-- GTM-сніпет далі -->
<script>(function(w,d,s,l,i){...})(...);</script>
Після завантаження GTM завжди використовуйте .push(). Без винятків.
Як використовувати dataLayer для ecommerce трекінгу?
GA4 ecommerce трекінг повністю залежить від dataLayer. Кожна ecommerce-подія вимагає специфічну структуру даних з масивом items:
window.dataLayer.push({ ecommerce: null }); // Очистити попередні ecommerce-дані
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: 'USD',
value: 29.99,
items: [{
item_id: 'SKU-001',
item_name: 'GTM Pro License',
item_category: 'Software',
price: 29.99,
quantity: 1
}]
}
});
Ключові правила ecommerce:
- Завжди очищуйте ecommerce-дані спочатку.
dataLayer.push({ ecommerce: null })перед кожним ecommerce-push запобігає потраплянню застарілих даних з попередньої події в поточну. Це офіційна рекомендація GA4. - Використовуйте рекомендовані назви подій. GA4 розпізнає
view_item,view_item_list,add_to_cart,remove_from_cart,begin_checkout,add_payment_info,add_shipping_infoтаpurchase. Використання цих назв автоматично заповнює вбудовані звіти монетизації GA4. - Масив
itemsобов'язковий. Кожна ecommerce-подія повинна містити хоча б один товар зitem_idабоitem_name. valueтаcurrencyобов'язкові для подій доходу. Без обох GA4 не може обчислити метрики доходу.currencyмає бути валідним ISO 4217 кодом (USD, EUR, UAH).
У GTM ваш GA4 Event тег для ecommerce повинен мати увімкнений чекбокс "Send Ecommerce data" у More Settings. Це вказує тегу автоматично читати об'єкт ecommerce з dataLayer — без ручного маппінгу параметрів.
Як використовувати dataLayer для user properties та статусу логіну?
Дані рівня користувача — статус логіну, тип підписки, user ID — потрібно пушити в dataLayer якомога раніше, ідеально до завантаження GTM:
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
user_id: 'U-98765',
user_type: 'pro',
user_plan: 'annual',
logged_in: true
});
</script>
Потім у GTM:
- Створіть Data Layer Variables для кожного ключа (
user_id,user_type,user_plan,logged_in) - У вашому GA4 Configuration тезі (або в кожному GA4 Event тезі) додайте User Properties:
- Property Name:
user_type→ Value:{{DLV - user_type}} - Property Name:
user_plan→ Value:{{DLV - user_plan}}
- Property Name:
- Встановіть поле
user_idу GA4 тезі на{{DLV - user_id}}для крос-девайс трекінгу
Примітка щодо приватності: Ніколи не пушіть PII (email, телефон, повне ім'я) в dataLayer без юридичних підстав та необхідності для конкретного тега (наприклад, Enhanced Conversions). DataLayer видимий у консолі браузера будь-кому, хто відкриє DevTools.
Як дебажити dataLayer?
Три інструменти, в порядку корисності:
1. Консоль браузера
Найпростіший підхід. Відкрийте DevTools (F12), перейдіть у Console та введіть dataLayer. Ви побачите сирий масив з кожним push від завантаження сторінки. Розгорніть кожен об'єкт для інспекції ключів та значень.
Для стеження за pushes в реальному часі вставте це перед виконанням дії:
(function() {
var originalPush = dataLayer.push;
dataLayer.push = function() {
console.log('dataLayer.push:', arguments[0]);
return originalPush.apply(this, arguments);
};
})();
2. GTM Preview Mode (Tag Assistant)
Натисніть Preview у GTM для запуску Tag Assistant. Кожен dataLayer push з'являється як подія в лівій бічній панелі timeline. Натисніть на будь-яку подію, щоб побачити:
- Tags Fired — які теги спрацювали
- Variables — які значення GTM прочитав з dataLayer в цей момент
- Data Layer таб — сирий push-об'єкт та об'єднана модель стану
Таб Data Layer — найпотужніший інструмент дебагу. Він показує точно те, що GTM бачить у кожній точці timeline.
3. Розширення DataLayer Inspector
Браузерні розширення як DataLayer Checker або Dataslayer показують dataLayer pushes як постійний оверлей — консоль не потрібна. Зручно для швидких перевірок без відкриття DevTools.
Які найчастіші помилки з dataLayer?
- Перезапис замість push. Використання
dataLayer = [{...}]після завантаження GTM ламає listener. Завжди використовуйте.push(). - Помилки в назвах ключів.
transaction_idу вашому push, алеtransactionIdу Data Layer Variable GTM. Ключі чутливі до регістру та повинні точно збігатися. - Push після спрацювання тега. Якщо ваш dataLayer push виконується після того, як тригер вже оцінено, тег спрацьовує з undefined значеннями. Переконайтесь, що pushes відбуваються до або разом з подією тригера.
- Не очищені ecommerce-дані. Без скидання
dataLayer.push({ ecommerce: null })подіяpurchaseможе нести застаріліitemsз попередньогоview_itempush. - Відсутній ключ
event. Push без ключаeventзберігає дані, але не запускає жоден тригер. Якщо вам потрібна реакція тригера — включіть назву події. - Неконсистентні типи даних. Push
value: "29.99"(рядок) замістьvalue: 29.99(число). GA4 очікує числові значення для доходу. Рядки спричиняють тиху втрату даних у звітах монетизації. - Push PII. Email-адреси, номери телефонів та повні імена, видимі в консолі. Пушіть PII тільки коли це потрібно для конкретного тегу (Enhanced Conversions) з належною згодою.
Як переконати розробників впровадити dataLayer pushes?
Причина №1, чому впровадження dataLayer затримується — погана комунікація між маркетинговою та технічною командами. Розробникам потрібна конкретика, а не розмиті запити. Ось що працює:
1. Напишіть tracking-специфікацію. Проста таблиця, що відповідає на всі питання розробника:
| Назва події | Тригер | Ключі | Тип даних | Приклад |
|---|---|---|---|---|
form_submit | При успішній відправці форми | form_id | string | "contact-form" |
form_name | string | "Contact Us" | ||
purchase | Завантаження сторінки підтвердження | ecommerce.transaction_id | string | "T-12345" |
ecommerce.value | number | 99.99 | ||
ecommerce.currency | string | "USD" |
2. Надайте готовий код для копіювання. Розробники не повинні вгадувати синтаксис. Дайте їм точний push-код:
// Коли форма контактів успішно відправлена:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'form_submit',
form_id: 'contact-form',
form_name: 'Contact Us'
});
3. Поясніть "навіщо", а не тільки "що". "Нам потрібен transaction_id, бо Google Ads Enhanced Conversions вимагає його для дедуплікації" — переконливіше, ніж "будь ласка, додайте transaction_id". Розробники пріоритизують роботу з чітким бізнес-впливом.
4. Використовуйте спільний tracking plan. Google Sheet або Notion-документ, який редагують обидві команди. Маркетинг додає нові вимоги трекінгу. Розробка відмічає статус (planned, in progress, deployed, verified). Це усуває email-ланцюжки та Slack-треди, де вимоги губляться.
5. Валідуйте разом. Після впровадження перегляньте вивід dataLayer у GTM Preview mode разом з розробником. Виправляйте проблеми одразу, поки контекст свіжий.
Чи є швидший спосіб працювати з dataLayer?
Написання tracking-специфікацій, кодування dataLayer pushes, створення Data Layer Variables та налаштування тригерів і тегів — це багатокроковий процес, який торкається і розробки, і конфігурації GTM.
GTM Event Helper автоматизує GTM-сторону цього workflow:
- Клікніть на елемент на вашій сторінці для генерації стабільного CSS-селектора
- AI Agent аналізує контекст сторінки та пропонує відповідну структуру події — включаючи dataLayer push-код, який потрібен вашим розробникам
- Теги, тригери та змінні створюються в GTM через API одним кліком
- Для ecommerce розширення генерує extraction-скрипти, які динамічно читають дані продуктів зі сторінки та пушать їх у dataLayer в очікуваному GA4-форматі
Замість написання специфікацій з нуля ви отримуєте працюючу імплементацію, яка сама є специфікацією — розробники бачать точно, які дані очікуються та де.
GTM Event Helper генерує dataLayer-код автоматично — без розробника.
Встановити GTM Event HelperЗовнішні ресурси
- Google: Використання dataLayer
- GA4: Гайд з впровадження ecommerce
- GTM: Data Layer Variables
- GA4: Довідник рекомендованих подій
Пов'язані статті
- Налаштування відстеження подій GA4 у GTM без коду
- GA4 Ecommerce трекінг з GTM
- Як відстежувати відео-залученість у GTM
- Як відстежувати AJAX-форми у GTM
- GTM — гайд для початківців
← Усі статті · Головна · Політика конфіденційності · Контакти