Налаштування Google Tag Manager на 1С-Бітрікс
Уявіть: маркетолог просить додати піксель VK, через тиждень — Яндекс.Метрику, потім — ланцюжок подій для GA4. Щоразу доводиться лізти в код, правити шаблони, викочувати оновлення. Наш досвід показує: правильне встановлення Google Tag Manager на 1С-Бітрікс вирішує цю проблему раз і назавжди. Ми налаштовуємо GTM так, щоб маркетолог сам керував тегами через інтерфейс, а dataLayer автоматично передавав усі дані про покупки, кошики та перегляди.
Чому dataLayer обов'язковий для інтернет-магазину?
Без dataLayer GTM — просто порожня оболонка. Ви можете опублікувати тег GA4, але не отримаєте даних про ціну товару, категорію, ID транзакції. Для інтернет-магазину на 1С-Бітрікс dataLayer — це міст між подіями на сайті та системами аналітики. Він передає структуровані дані: item_id, item_name, price, currency, quantity. GA4, Яндекс.Метрика та інші сервіси очікують саме такий формат. Якщо dataLayer налаштовано неправильно, ви втрачаєте до 30% даних про конверсії — перевірено на десятках проєктів.
Типові помилки при інтеграції GTM в 1С-Бітрікс
Жорстке кодування ID контейнера
Часто розробники вписують GTM-XXXXXXX прямо в шаблон. При зміні контейнера (наприклад, для тестування або переходу на інший акаунт) доводиться знову редагувати файли. Ми зберігаємо ID в налаштуваннях модуля через \Bitrix\Main\Config\Option::set — це дозволяє змінювати ID через адмінку без деплою.
Відсутність тегованого кешування
1С-Бітрікс агресивно кешує сторінки. Якщо dataLayer генерується динамічно (наприклад, ціна залежить від знижки користувача), кеш може показати застарілі дані. Ми використовуємо тегований кеш і скидаємо його при зміні ціни або залишку. Без цього події view_item можуть містити невірну вартість — розбіжності з реальними замовленнями сягають до 15%.
Подія purchase тільки на сторінці замовлення
Багато хто обмежується відправкою purchase в момент оформлення. Але потрібно також передавати add_to_cart, remove_from_cart, begin_checkout. Без цих подій ви не зможете побудувати повну воронку в GA4. Ми додаємо всі ключові події, використовуючи штатні механізми Бітрікс: OnBasketChange, OnOrderSave, OnSalePayOrder.
Як ми налаштовуємо GTM: покроковий процес
- Аналіз поточного сайту: перевіряємо версію Бітрікс, кешування, встановлені модулі, тип торгового каталогу.
- Проектування dataLayer: складаємо карту подій (перегляд товару, додавання до кошика, оформлення, покупка) та погоджуємо з маркетологом.
- Розробка та інтеграція: додаємо код встановлення GTM в шаблон, пишемо result_modifier для компонентів каталогу та кошика, реалізуємо серверну генерацію dataLayer для подій після оплати.
- Тестування: перевіряємо кожну подію через Tag Assistant та консоль браузера, звіряємо дані з реальними замовленнями з 1С.
- Деплой та документація: заливаємо на бойовий сервер, віддаємо клієнту інструкцію по роботі з GTM.
Приклад реалізації: встановлення GTM та dataLayer
Встановлення GTM в шаблон Бітрікс
GTM вимагає два фрагменти коду: один у <head>, другий одразу після <body>. У шаблоні Бітрікс (/bitrix/templates/[name]/header.php):
<?php
// ID контейнера GTM з акаунту Google Tag Manager
$gtmId = \Bitrix\Main\Config\Option::get('custom', 'gtm_container_id', 'GTM-XXXXXXX');
?>
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<!-- GTM в head (якомога раніше) -->
<?php if ($gtmId): ?>
<script>(function(w,d,s,l,i){w[l]=w[l]||[];w[l].push({'gtm.start':
new Date().getTime(),event:'gtm.js'});var f=d.getElementsByTagName(s)[0],
j=d.createElement(s),dl=l!='dataLayer'?'&l='+l:'';j.async=true;j.src=
'https://www.googletagmanager.com/gtm.js?id='+i+dl;f.parentNode.insertBefore(j,f);
})(window,document,'script','dataLayer','<?= htmlspecialchars($gtmId) ?>');</script>
<?php endif; ?>
</head>
<body>
<!-- GTM noscript одразу після <body> -->
<?php if ($gtmId): ?>
<noscript><iframe src="https://www.googletagmanager.com/ns.html?id=<?= htmlspecialchars($gtmId) ?>"
height="0" width="0" style="display:none;visibility:hidden"></iframe></noscript>
<?php endif; ?>
ID контейнера зберігати в b_option (таблиця налаштувань) через адміністративний інтерфейс — не в коді, щоб маркетолог міг змінювати без деплою.
dataLayer для сторінок товару
Для роботи розширеної електронної торгівлі (GA4 Ecommerce) потрібен dataLayer з даними товару. У шаблоні компонента bitrix:catalog.element або в result_modifier.php:
// bitrix/templates/.default/components/bitrix/catalog.element/.default/result_modifier.php
if (!empty($arResult['CATALOG_PRICE']['BASE']['PRICE'])) {
$product = [
'item_id' => $arResult['ID'],
'item_name' => $arResult['NAME'],
'price' => (float)$arResult['CATALOG_PRICE']['BASE']['PRICE'],
'currency' => $arResult['CATALOG_PRICE']['BASE']['CURRENCY'],
'item_category' => $arResult['SECTION']['NAME'] ?? '',
'item_brand' => $arResult['PROPERTIES']['BRAND']['VALUE'] ?? ''
];
$this->arResult['GTM_PRODUCT'] = $product;
}
У шаблоні компонента вивести dataLayer перед закриваючим </body>:
<?php if (!empty($arResult['GTM_PRODUCT'])): ?>
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'view_item',
ecommerce: {
currency: '<?= htmlspecialchars($arResult['GTM_PRODUCT']['currency']) ?>',
value: <?= (float)$arResult['GTM_PRODUCT']['price'] ?>,
items: [<?= json_encode($arResult['GTM_PRODUCT'], JSON_UNESCAPED_UNICODE) ?>]
}
});
</script>
<?php endif; ?>
Подія purchase після оплати
Найважливіша подія — факт покупки. У компоненті bitrix:sale.order.ajax або на сторінці «Дякуємо за замовлення»:
<?php
// Отримати останнє замовлення поточного користувача
$orderId = (int)($_SESSION['SALE_ORDER_ID_REDIRECTED'] ?? 0);
if ($orderId > 0) {
$order = \Bitrix\Sale\Order::load($orderId);
if ($order) {
$items = [];
foreach ($order->getBasket() as $basketItem) {
$items[] = [
'item_id' => $basketItem->getProductId(),
'item_name' => $basketItem->getField('NAME'),
'price' => (float)$basketItem->getPrice(),
'quantity' => (int)$basketItem->getQuantity()
];
}
?>
<script>
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: '<?= $order->getId() ?>',
value: <?= (float)$order->getPrice() ?>,
currency: '<?= $order->getCurrency() ?>',
items: <?= json_encode($items, JSON_UNESCAPED_UNICODE) ?>
}
});
</script>
<?php
}
}
?>
Додавання до кошика через JS
Подія add_to_cart генерується в JavaScript при кліку на кнопку «Додати до кошика». Перехопити стандартну подію Бітрікс:
// У шаблоні або в /local/templates/.default/js/analytics.js
BX.addCustomEvent('OnBasketChange', function(event) {
if (event.action === 'ADD') {
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({
event: 'add_to_cart',
ecommerce: {
currency: event.currency || 'UAH',
value: event.price * event.quantity,
items: [{
item_id: String(event.productId),
item_name: event.productName || '',
price: event.price,
quantity: event.quantity
}]
}
});
}
});
Подія OnBasketChange генерується модулем sale через BX.Event при AJAX-додаванні до кошика.
Як перевірити працездатність dataLayer?
У браузері встановити розширення «Tag Assistant» від Google. Воно покаже які теги GTM спрацювали, з якими даними та чи були помилки в dataLayer. Або через консоль браузера виконайте console.table(window.dataLayer) для перегляду всіх подій.
Зберігання ID контейнера
Не жорстко кодувати GTM ID у шаблоні — використовувати b_option:
// Запис через API
\Bitrix\Main\Config\Option::set('custom', 'gtm_container_id', 'GTM-XXXXXXX');
// Читання
$gtmId = \Bitrix\Main\Config\Option::get('custom', 'gtm_container_id');
Це дозволяє змінювати ID без правки коду через адміністративний інтерфейс або через налаштування кастомного модуля.
Порівняння підходів: жорстке кодування проти налаштування через dataLayer
| Критерій | Жорстке кодування скриптів | GTM + dataLayer |
|---|---|---|
| Час внесення змін | 1-2 години (правка коду, деплой) | 5 хвилин (через інтерфейс GTM) |
| Залежність від розробника | Кожного разу | Тільки при старті |
| Помилки в даних | Часто (плутають валюту, ID) | Рідко (dataLayer формується Бітріксом) |
| Підтримка GA4 Ecommerce | Вимагає окремої реалізації | Вбудована через dataLayer |
Налаштування GTM через dataLayer у 3 рази скорочує час на додавання нових тегів і виключає помилки, пов'язані з ручним копіюванням коду.
Події dataLayer та їх тригери
| Подія | Тригер | Дані |
|---|---|---|
view_item |
Перегляд сторінки товару | item_id, name, price, category |
add_to_cart |
AJAX-додавання до кошика | item_id, name, price, quantity |
remove_from_cart |
AJAX-видалення з кошика | item_id, name, price, quantity |
begin_checkout |
Перехід до оформлення | items, value |
purchase |
Успішна оплата | transaction_id, value, items |
Що входить в результат
- Встановлення GTM в шаблон зі зберіганням ID в налаштуваннях.
- Інтеграція dataLayer для подій:
view_item,add_to_cart,remove_from_cart,begin_checkout,purchase. - Налаштування тегованого кешування для динамічних даних.
- Перевірка через Tag Assistant та консоль.
- Документація по додаванню нових тегів в GTM.
- Гарантія коректної передачі даних протягом 30 днів.
Чому варто довірити налаштування професіоналам?
Ми спеціалізуємося на 1С-Бітрікс та GTM понад 5 років, реалізували інтеграцію для 50+ інтернет-магазинів. Наші інженери сертифіковані по Бітрікс та Google Analytics. Ми враховуємо особливості кешування, торгових пропозицій, знижок та обміну з 1С через CommerceML. Отримайте консультацію по вашому проєкту — оцінимо обсяг робіт та терміни. Зв'яжіться з нами, щоб обговорити деталі.







