dataLayer — JavaScript-масив на сторінці, який виступає буфером даних між сайтом і Google Tag Manager. Через нього розробники передають у GTM події та значення (вартість замовлення, ID користувача, товари в кошику) для подальшої відправки в GA4, Ads та інші системи.
dataLayer (рівень даних) — це глобальний JavaScript-масив на сторінці сайту, який відіграє роль буфера між кодом сайту та Google Tag Manager (GTM). Технічно це змінна window.dataLayer, в яку розробник у потрібні моменти додає об’єкти з даними через dataLayer.push({...}), а GTM читає ці об’єкти, перетворює їх на змінні та передає у теги (GA4, Google Ads, Meta Pixel тощо). Без dataLayer GTM міг би зчитувати лише те, що видно в DOM (текст, класи, атрибути). З dataLayer — ви маєте повний контроль над схемою даних і можете передавати те, що взагалі не рендериться на сторінці: user ID, вартість замовлення у валюті магазину, ступінь членства, внутрішню категорію товару.
dataLayer — фундамент будь-якої серйозної аналітичної архітектури у 2026. Без нього GA4, Meta Pixel, server-side трекінг працюють крихко: ламаються при будь-якому редизайні фронтенду. З правильно реалізованим dataLayer трекінг переживає роки змін UI без жодних правок у GTM.
Навіщо потрібен dataLayer
dataLayer вирішує три задачі:
- Відокремити логіку сайту від логіки аналітики. Розробники відповідають за
pushу dataLayer, маркетологи в GTM — за те, куди й як ці дані відправляти. Щоб додати нову систему аналітики, не треба змін у коді сайту. - Передавати дані, недоступні з DOM. Ціна з урахуванням знижки, ID користувача з бекенду, тип купленого товару, статус підписки — все це не видно на HTML-сторінці, але потрібне для аналізу.
- Забезпечити консистентність між системами. Один
pushу dataLayer може одночасно спрацювати на GA4, Meta Pixel, Google Ads Conversion — усі отримують однакові цифри.
Без рівня даних доводиться або хардкодити виклики gtag() та fbq() у коді сайту, або намагатися вичитати значення з DOM регулярками — обидва підходи неминуче ламаються при перепроєктуванні фронтенду.
Як dataLayer ініціалізується та працює
На старті GTM-контейнер створює (або використовує наявний) масив window.dataLayer:
<script>
window.dataLayer = window.dataLayer || [];
</script>
<!-- Google Tag Manager -->
<script>(function(w,d,s,l,i){w[l]=w[l]||[]; ...})(window,document,'script','dataLayer','GTM-XXXXXXX');</script>
Важливо: оголосити window.dataLayer = window.dataLayer || [] перед контейнером GTM, якщо ви хочете передати початкові змінні ще на етапі завантаження (наприклад, user ID, тип сторінки, категорію).
Після цього будь-який скрипт на сайті може додавати дані:
dataLayer.push({
event: 'form_submit',
form_name: 'newsletter',
form_location: 'footer',
user_status: 'guest'
});
GTM слухає ці виклики. Коли з’являється об’єкт із ключем event, GTM створює Data Layer Event — сигнал, на який можна повісити тригер Custom Event. Тригер вмикає тег (наприклад, GA4 Event Tag), який у свою чергу читає інші значення з dataLayer через Data Layer Variables.
Архітектура потоку даних
Сайт dataLayer GTM Trigger GTM Tag
[click] ─────push───→ {event:'add_to_cart', ─→ Custom Event ─→ GA4 Event Tag
value:1490, items:..} ─→ Trigger fires ─→ Reads DLV
─→ Sends to GA4
Структура push-повідомлення
Типовий push має одне обов’язкове поле event та будь-яку кількість додаткових:
dataLayer.push({
event: 'purchase',
transaction_id: 'T-12345',
value: 1999.00,
currency: 'UAH',
items: [
{ item_id: 'SKU-001', item_name: 'Курс GA4', price: 1999, quantity: 1 }
]
});
Google має стандартизовані схеми для популярних сценаріїв, які варто дотримуватись, щоб ваш dataLayer без змін працював із Enhanced E-commerce GA4:
| Схема | Для чого | Обов’язкові ключі |
|---|---|---|
view_item_list | Список товарів (категорія) | items[] |
view_item | Картка товару | items[], currency, value |
add_to_cart | Додавання в кошик | items[], currency, value |
begin_checkout | Початок оформлення | items[], currency, value |
add_payment_info | Введення оплати | items[], currency, value, payment_type |
purchase | Покупка | transaction_id, value, currency, items[] |
refund | Повернення | transaction_id, value, currency |
generate_lead | Форма заявки | value, currency |
Іменування ключів повинно відповідати специфікації GA4 — тоді GTM-тег GA4 Event може просто вибрати поле «Use Data Layer» замість ручного мапінгу кожного параметра.
Структура items[] для e-commerce
items: [{
item_id: 'SKU-12345', // обов'язково
item_name: 'Шкіряний рюкзак', // обов'язково
item_brand: 'BrandX',
item_category: 'Аксесуари',
item_category2: 'Сумки',
item_category3: 'Рюкзаки',
item_variant: 'Чорний / L',
price: 1490,
quantity: 1,
index: 0, // позиція в списку
discount: 100,
coupon: 'SUMMER10'
}]
dataLayer у Single Page Applications (SPA)
У React / Vue / Next.js важливо правильно обробляти зміну маршруту. Браузер не перезавантажує сторінку, тому page_view треба пушити вручну:
// React Router
import { useLocation } from 'react-router-dom';
const location = useLocation();
useEffect(() => {
dataLayer.push({
event: 'page_view',
page_path: location.pathname,
page_title: document.title
});
}, [location]);
// Vue Router
router.afterEach((to) => {
dataLayer.push({
event: 'page_view',
page_path: to.fullPath,
page_title: document.title
});
});
// Next.js
import { useRouter } from 'next/router';
useEffect(() => {
router.events.on('routeChangeComplete', (url) => {
dataLayer.push({event: 'page_view', page_path: url});
});
}, []);
Перед пушем нового page_view рекомендується очистити старі змінні через спеціальний пуш { ecommerce: null }, щоб попередні items[] не накопичувались і не потрапляли в наступні події. Цей патерн описаний у документації Google для Enhanced E-commerce.
Готові пакети: react-gtm-module для React, GTM4WP для WordPress, gtag-ssr для Next.js SSR.
dataLayer vs gtag.js: яку різницю знати
| Аспект | dataLayer + GTM | gtag.js |
|---|---|---|
| Що потрібно на сайті | Один контейнер GTM + push від розробника | Виклики gtag('event', ...) по коду |
| Хто керує тегами | Маркетолог у GTM | Розробник у коді |
| Підтримка багатьох систем | Один push → багато тегів | Окремий виклик для кожної системи |
| Версіонування | Вбудоване в GTM | Через git |
| Реліз змін | Публікація в GTM (хвилини) | Реліз коду (дні) |
| Server-side трекінг | Підтримка sGTM | Лише через велику переробку |
На невеликих сайтах з єдиною системою аналітики gtag.js достатньо. Як тільки з’являється друга система (Ads, Meta, LinkedIn, коллтрекінг) або потреба в server-side GTM — dataLayer стає необхідністю.
Data Layer Variable у GTM
Data Layer Variable (DLV) — тип користувацької змінної в GTM, що читає значення з window.dataLayer за вказаним шляхом.
Налаштування: New Variable → Data Layer Variable → Data Layer Variable Name (наприклад, ecommerce.value).
Підтримує вкладені шляхи через крапку:
ecommerce.value— повна сума замовлення.ecommerce.items.0.item_id— перший item у масиві.user.subscription.tier— глибоко вкладене значення.
Версія 2 (рекомендована) — для GA4-епохи з ієрархічною структурою. Версія 1 — застаріла, для старих UA-контейнерів.
Default Value — fallback, якщо ключ не знайдено (наприклад, (not set) для відсутніх категорій).
Інтеграція з коллтрекінгом та UTM-мітками
У типовому сценарії коллтрекінг пушить у dataLayer подію дзвінка з параметрами:
dataLayer.push({
event: 'phone_call',
call_duration: 184,
call_source: 'google / cpc',
utm_source: 'google',
utm_campaign: 'brand_search',
gclid: 'CjwKCAjw...'
});
GTM має тригер на event = phone_call, який запускає тег GA4 generate_lead і тег Google Ads Conversion. Значення utm_source та utm_campaign dataLayer отримав від самого коллтрекінгу, який раніше прив’язав номер до джерела. Завдяки цьому конверсія «дзвінок» атрибутується правильному каналу навіть через тижні після першого візиту, що важливо для коректного розрахунку CPA та ROAS.
Server-side dataLayer
З появою server-side GTM (sGTM) архітектура dataLayer розширюється:
Браузер → Client GTM → Sends to → Server GTM (sGTM endpoint)
↓
├─ Cleans PII
├─ Enriches from CRM (LTV, segment)
└─ Forwards to GA4 / Meta CAPI / TikTok
dataLayer на клієнті лишається той самий, але GTM-контейнер передає події не напряму у вендори, а на ваш sGTM endpoint у Cloud Run. Це дає:
- Обхід ad-blockers і Safari ITP.
- First-party cookies (28 днів замість 7).
- Очищення PII перед відправкою.
- Збагачення даних з CRM/бекенду.
Як перевірити, що dataLayer працює
5 інструментів:
- Console браузера — введіть
dataLayerі Enter, побачите масив усіх push’ів з моменту завантаження. Найшвидший дебаг. - GTM Preview Mode (Tag Assistant) — Tags fired/not fired для кожної події, значення DLV, повний state dataLayer.
- GA Debugger Chrome extension — додає
debug_mode=1до запитів GA4, події з’являються в DebugView. - GA4 DebugView — Admin → DebugView показує події з debug-сесій у real-time.
- BigQuery
events_intraday_*— для зрілих property з SQL-аналізом.
Чек-лист перед Publish:
- Подія має правильний
eventключ. - Усі обов’язкові параметри присутні і не порожні.
- Немає PII (email, phone, ID карти).
- Для e-commerce
items[]не завищений (попередні очищені через{ ecommerce: null }). - Значення відповідають GA4-стандарту (currency у ISO-форматі, value числовий).
Типові помилки при роботі з dataLayer
- Push перед ініціалізацією. Якщо оголосити
window.dataLayerпісля GTM-контейнера — ранні події втрачаються. - Немає ключа
event. Без нього тригер Custom Event не спрацьовує, хоча змінні доступні. - Невичищені попередні дані. У SPA
items[]з картки товару потрапляє у наступнийpurchase, ціни ростуть подвійно. - Асинхронний push у момент переходу. Якщо
dataLayer.pushвикликається одночасно з переходом на іншу сторінку, браузер може скасувати запит GA4 — потрібенtransport_type: 'beacon'або затримка. - PII у dataLayer. Email, телефон, номери карт у рівні даних — порушення політики Google і GDPR. Хешуйте або не передавайте взагалі.
- Хардкод значень.
value: 1999замістьvalue: window.cartTotal— при зміні кошика value не оновиться. - Нестандартні імена ключів.
user_idзамістьuser_pseudo_id,totalзамістьvalue— ламає автоматичну роботу Enhanced Ecommerce. - Один великий dataLayer на всю сесію. Замість push’ів на події — повертає старі значення з минулих кроків воронки.
Перевіряти dataLayer найзручніше через режим Preview у GTM (панель Tag Assistant), який показує стан dataLayer на кожному кроці та які тригери спрацювали.
Пов’язані матеріали
- Tag (тег) у GTM — інструкція що відправити.
- Trigger (тригер) у GTM — умови спрацьовування.
- Event (подія) в GA4 — базова одиниця аналітики.
- Conversion / Key Event — позначення важливих подій.
- GTM — повний посібник.
- GA4 — повний посібник.
- GA4 Event Builder — конструктор dataLayer push’ів.
Часті питання
Що таке dataLayer простими словами?
window.dataLayer на сторінці сайту, через який код сайту передає структуровані дані у Google Tag Manager (GTM). Технічно це звичайний масив, в який розробник у потрібні моменти додає об’єкти через dataLayer.push({...}). GTM ловить ці push’и через Custom Event Trigger і дістає параметри через Data Layer Variables — далі відправляє у GA4, Meta Pixel, Google Ads, TikTok тощо. Без dataLayer GTM міг би зчитувати лише те, що видно у DOM (текст кнопки, клас елемента) — крихке рішення, що ламається при будь-якому редизайні. З dataLayer ви маєте повний контроль над схемою даних і можете передавати те, що взагалі не рендериться: user ID з бекенду, ціна з урахуванням знижки, статус підписки, внутрішня категорія товару.Навіщо потрібен dataLayer і чому не використати gtag.js напряму?
push, маркетологи у GTM — за відправку даних. Додавання нової системи аналітики не вимагає змін у коді; (2) Передавати дані, недоступні з DOM — ціна з урахуванням знижки, user ID, тип куплаваого товару не видно на HTML-сторінці; (3) Консистентність між системами — один push спрацьовує на GA4, Meta Pixel, Google Ads одночасно, всі отримують однакові цифри. gtag.js напряму працює для невеликих сайтів з єдиною системою аналітики. Як тільки з’являється друга система (Ads, Meta, LinkedIn, коллтрекінг) або потреба в server-side GTM — dataLayer стає необхідністю. Інакше доводиться хардкодити окремий виклик для кожної системи у коді сайту і релізити кожну зміну.Як працює dataLayer з тригерами і змінними у GTM?
event: dataLayer.push({event: 'add_to_cart', value: 1490, items: [...]}); (2) GTM автоматично слухає всі push’и, при появі ключа event створює Data Layer Event — сигнал; (3) Custom Event Trigger з Event Name = add_to_cart спрацьовує; (4) Тригер активує GA4 Event Tag (або інший тег); (5) Тег читає інші значення з dataLayer через Data Layer Variables (DLV з шляхом value, items.0.item_id, currency); (6) Тег відправляє запит у GA4/Meta/Ads. Перевірка: Preview Mode → Tag Assistant показує всі push’и, активні тригери, значення змінних і яким тегам відправлено дані.Який стандартний формат push для e-commerce?
view_item (картка товару) — items[], currency, value; add_to_cart (додавання) — items[], currency, value; begin_checkout (старт оформлення) — items[], currency, value; add_payment_info — items[], currency, value, payment_type; purchase (фінальна) — transaction_id, value, currency, tax, shipping, items[]; refund — transaction_id, value, currency, items[] (опціональні). Структура items[]: item_id (SKU), item_name, item_brand, item_category (до item_category5 для глибокої ієрархії), item_variant (колір/розмір), price, quantity, index (позиція в списку). Іменування ключів має точно відповідати GA4 — тоді GA4 Event Tag вибирає ‘Use Data Layer’ без ручного мапінгу.Як працювати з dataLayer у SPA (React, Vue, Next.js)?
page_view треба пушити вручну на route change. React Router: підпишіться на useLocation() і пушайте при зміні pathname. Vue Router: router.afterEach((to) => dataLayer.push({event:'page_view', page_path: to.fullPath, page_title: document.title})). Next.js: використовуйте useRouter().events.on('routeChangeComplete', ...). Критичний нюанс для e-commerce: перед page_view нової сторінки очищуйте попередні items[] через dataLayer.push({ ecommerce: null }), інакше старі items потраплять у наступний purchase і ціни задвояться. Patterns по фреймворках: GTM4WP для WordPress, gtag-ssr для Next.js SSR, react-gtm-module для React. Без правильного очищення SPA-сайти регулярно показують у GA4 завищені value на 200-300%.Чим відрізняється dataLayer + GTM від прямого gtag.js?
push від розробника; (2) Хто керує тегами — маркетолог у GTM-інтерфейсі; (3) Підтримка багатьох систем — один push → багато тегів; (4) Версіонування — вбудоване в GTM (rollback за один клік); (5) Реліз змін — публікація в GTM за хвилини. gtag.js напряму: (1) Що потрібно — виклики gtag('event', ...) по коду; (2) Хто керує — розробник у коді; (3) Підтримка систем — окремий виклик для кожної (gtag для Google, fbq для Meta, ttq для TikTok); (4) Версіонування — через git і релізи; (5) Реліз — дні. Коли gtag.js достатньо: невеликий лендинг тільки з GA4. Коли потрібен dataLayer: будь-який бізнес з 2+ системами трекінгу або потребою у server-side. Migration GTM → gtag робиться за день, у зворотний бік — від тижня до місяця.Як інтегрувати dataLayer з коллтрекінгом і UTM?
dataLayer.push({event:'phone_call', call_duration:184, call_source:'google/cpc', utm_source:'google', utm_medium:'cpc', utm_campaign:'brand_search', gclid:'CjwKCAjw...'}). GTM має Custom Event Trigger на event = phone_call, що запускає GA4 Event Tag з event_name=generate_lead і Google Ads Conversion Tag з gclid для офлайн-конверсій. Завдяки цьому: (1) Дзвінок атрибутується правильному каналу через UTM; (2) Smart Bidding оптимізується на конверсії-дзвінки через gclid; (3) CPA і ROAS розраховуються коректно. Без dataLayer-інтеграції дзвінки залишаються ‘сліпою зоною’ — Google Ads оптимізує на онлайн-конверсії, ігноруючи 50%+ воронки сервісного бізнесу.Що таке Data Layer Variable у GTM?
window.dataLayer за вказаним шляхом. Налаштування: New Variable → Data Layer Variable → Data Layer Variable Name (наприклад, ecommerce.value). При спрацюванні тригера GTM шукає у dataLayer значення за шляхом і підставляє його в тег. Підтримує вкладені шляхи через крапку: ecommerce.items.0.item_id — перший item у масиві, user.subscription.tier — глибоко вкладене значення. Версія 2 (рекомендована) працює як в GA4 з ієрархічною структурою. Версія 1 — застаріла, для старих UA-контейнерів. У сучасному GTM завжди обирайте Version 2. Default Value — fallback, якщо ключ не знайдено (наприклад, (not set) для відсутніх категорій). Перевірка: у Preview Mode → Variables tab бачите всі DLV і їх значення на момент події.Як перевірити, що dataLayer працює правильно?
dataLayer і Enter, побачите масив усіх push’ів з моменту завантаження сторінки. Найшвидший дебаг; (2) GTM Preview Mode (Tag Assistant) — Tags fired/not fired для кожної події, значення Data Layer Variables, повний state dataLayer на момент кожної події; (3) GA Debugger Chrome extension — додає debug_mode=1 до запитів GA4, події з’являються в DebugView; (4) GA4 DebugView — Admin → DebugView показує події з debug-сесій у real-time; (5) GTM Templates Console output — для розробки кастомних шаблонів. Чек-лист: подія має правильний event ключ; усі обов’язкові параметри присутні; значення не порожні; немає PII; для e-commerce items[] не завищений (попередні очищені). Без перевірки в Preview перед Publish — гарантовано зламана аналітика.Які типові помилки при роботі з dataLayer?
window.dataLayer після GTM-контейнера, ранні події втрачаються. Завжди ставте window.dataLayer = window.dataLayer || [] перед скриптом GTM; (2) Немає ключа event — без нього Custom Event Trigger не спрацьовує, хоча змінні доступні; (3) Невичищені попередні дані у SPA — items[] з картки товару потрапляє в наступний purchase, ціни ростуть подвійно. Завжди dataLayer.push({ecommerce: null}) перед новою подією; (4) Асинхронний push у момент переходу — браузер скасовує запит GA4. Потрібен transport_type: 'beacon' або затримка 100мс; (5) PII у dataLayer — email, телефон, номери карт = порушення Google policy і GDPR, бан property; (6) Хардкод значень замість читання з бекенду — value: 1999 замість value: window.cartTotal; (7) Нестандартні імена ключів замість GA4-стандарту — порушує автоматичну роботу Enhanced Ecommerce звітів; (8) Один великий dataLayer на всю сесію замість push’ів на події — повертає старі значення.Пов'язані терміни
Пов'язаний контент
Дивіться також
Розділ: GTMНатрапив на ще один незнайомий термін? У глосарії — пояснення з формулами, прикладами і бенчмарками з реальної практики.
Усі терміни глосарія