Създаване на персонализиран пиксел с Google Tag Manager
Можете да използвате Google Tag Manager (GTM) като персонализиран пиксел, за да управлявате своите пиксели от трети страни.
Когато сте готови да тествате своя персонализиран пиксел с GTM, използвайте Shopify Pixel Helper, за да се уверите, че всички събития, които искате да проследявате, се добавят в изолираната среда без грешки.
Можете също да използвате разширението за страници Google Tag Assistant, за да тествате кои тагове на Google се зареждат на страницата. Функцията Отстраняване на неизправности в тага на Google Tag Assistant обаче не е съвместима с персонализираните пиксели и не открива никакви тагове на Google в персонализиран пиксел или други пиксели, зареждани от GTM.
На тази страница
Подготовка за създаване на персонализиран пиксел
Преди да създадете персонализиран пиксел с помощта на Google Tag Manager, прегледайте следната информация, за да се уверите, че разбирате как да конфигурирате своя пиксел:
- Създайте или отворете акаунт в Google Tag Manager и вземете идентификатора на GTM контейнера.
- От съображения за сигурност мениджърите на тагове, заредени в нашата изолирана среда, имат същите ограничения като всички други пиксели. Научете повече за ограниченията на изолираната среда за пиксели.
Създаване на персонализиран пиксел с Google Tag Manager
Можете да създадете персонализиран пиксел с Google Tag Manager, за да управлявате своите пиксели от трети страни.
Стъпки:
- Отворете своя Google Tag Manager акаунт и изберете акаунта, с който искате да настроите персонализиран пиксел.
- Кликнете върху „Администратор“, а след това върху „Инсталиране на Google Tag Manager“, за да отворите инсталационния код.
- Копирайте кодовия блок, който се поставя в секция
headна страницата. - Премахнете HTML таговете от кодовия блок. Например
<script></script>. - Вмъкнете останалия код в нов Shopify Custom Pixel.
- Subscribe to customer events and push to GTM’s dataLayer.
- За да прегледате как трябва да се показва кодът, вижте example Google Tag Manager custom pixel.
- Configure Google Tag Manager to accept events from your Custom Pixel.
- По избор: Ако имате съществуващи извиквания на
dataLayer.push(event) във Вашия файлcheckout.liquid, тогава replace it with analytics.publish().
Абониране за клиентски събития и изпращане към data layer на GTM
Можете да се абонирате за клиентски събития, като използвате dataLayer на GTM във Вашия код за персонализиран пиксел.
По подразбиране има набор от standard events, за които можете да се абонирате. Въпреки това, ако искате да проследявате клиентски събития, които не са част от предлаганите стандартни събития, тогава можете да publish your own custom events from Liquid template files.
По-долу е даден пример за абониране за стандартното събитие „product_viewed“, което показва кога някой разглежда продукт. Когато събитието се задейства, то го изпраща към dataLayer.
analytics.subscribe("product_viewed", (event) => {
window.dataLayer.push({
event: "product_viewed",
product_title: event.data?.productVariant?.title,
});
});В този пример наименованието на продукта се предава в полезния товар на събитието. Можете да използвате Google Tag Manager variable, за да уловите наименованието на продукта от полезния товар на събитието в избран от Вас таг.
Примерен персонализиран пиксел за Google Tag Manager
Примерът по-долу е опростена версия на персонализиран пиксел за Google Tag Manager, която показва как да изпращате данни до Google Tag Manager. За да изпращате повече събития към Вашия dataLayer, можете да се абонирате за повече стандартни и персонализирани събития.
// Define dataLayer and the gtag function.
window.dataLayer = window.dataLayer || [];
function gtag(){dataLayer.push(arguments);}
//Initialize GTM tag
(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', 'GTM-XXXXXXX');
//Google Consent Mode v2
gtag('consent', 'update', {
'ad_storage': 'granted',
'analytics_storage': 'granted',
'ad_user_data': 'granted',
'ad_personalization': 'granted',
});
//subscribe to events
analytics.subscribe("checkout_completed", (event) => {
window.dataLayer.push({
event: "checkout_completed",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("payment_info_submitted", (event) => {
window.dataLayer.push({
event: "payment_info_submitted",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("checkout_shipping_info_submitted", (event) => {
window.dataLayer.push({
event: "checkout_shipping_info_submitted",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("checkout_address_info_submitted", (event) => {
window.dataLayer.push({
event: "checkout_address_info_submitted",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("checkout_contact_info_submitted", (event) => {
window.dataLayer.push({
event: "checkout_contact_info_submitted",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("checkout_started", (event) => {
window.dataLayer.push({
event: "checkout_started",
timestamp: event.timestamp,
id: event.id,
token: event.data?.checkout?.token,
url: event.context.document.location.href,
client_id: event.clientId,
email: event.data?.checkout?.email,
phone: event.data?.checkout?.phone,
first_name: event.data?.checkout?.shippingAddress?.firstName,
last_name: event.data?.checkout?.shippingAddress?.lastName,
address1: event.data?.checkout?.shippingAddress?.address1,
address2: event.data?.checkout?.shippingAddress?.address2,
city: event.data?.checkout?.shippingAddress?.city,
country: event.data?.checkout?.shippingAddress?.country,
countryCode: event.data?.checkout?.shippingAddress?.countryCode,
province: event.data?.checkout?.shippingAddress?.province,
provinceCode: event.data?.checkout?.shippingAddress?.provinceCode,
zip: event.data?.checkout?.shippingAddress?.zip,
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
subtotal: event.data?.checkout?.subtotalPrice?.amount,
shipping: event.data?.checkout?.shippingLine?.price?.amount,
value: event.data?.checkout?.totalPrice?.amount,
tax: event.data?.checkout?.totalTax?.amount,
});
});
analytics.subscribe("product_added_to_cart", (event) => {
window.dataLayer.push({
event: "product_added_to_cart",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
price: event.data?.cartLine?.merchandise?.price?.amount,
currency: event.data?.cartLine?.merchandise?.id,
product_title: event.data?.cartLine?.merchandise?.product?.title,
quantity: event.data?.cartLine?.quantity,
total_cost: event.data?.cartLine?.cost?.totalAmount?.amount,
});
});
analytics.subscribe("cart_viewed", (event) => {
window.dataLayer.push({
event: "cart_viewed",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
total_cost: event.data?.cart?.cost?.totalAmount?.amount,
quantity: event.data?.cart?.totalQuantity,
cart_id: event.data?.cart?.id,
});
});
analytics.subscribe("page_viewed", (event) => {
window.dataLayer.push({
event: "page_viewed",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
page_title: event.context.document.title,
});
});
analytics.subscribe("product_viewed", (event) => {
window.dataLayer.push({
event: "product_viewed",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
product_id: event.data?.productVariant?.product?.id,
product_title: event.data?.productVariant?.title,
product_sku: event.data?.productVariant?.sku,
});
});
analytics.subscribe("search_submitted", (event) => {
window.dataLayer.push({
event: "search_submitted",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
query: event.data?.searchResult?.query,
});
});
analytics.subscribe("collection_viewed", (event) => {
window.dataLayer.push({
event: "collection_viewed",
timestamp: event.timestamp,
id: event.id,
client_id: event.clientId,
url: event.context.document.location.href,
collection_id: event.data?.collection?.id,
collection_title: event.data?.collection?.title,
});
});Конфигуриране на Google Tag Manager за приемане на събития от Вашия персонализиран пиксел
След като създадете своя персонализиран пиксел, трябва да конфигурирате Google Tag Manager да приема събития от него. За целта са Ви необходими таг, тригер и променливи на dataLayer в Google Tag Manager.
Някои примери за избрани стандартни клиентски събития и техните еквиваленти в Google Tag Manager са изброени в следващата таблица:
| Събитие в Shopify | Тригер | Събитие в GTM |
|---|---|---|
| payment_info_submitted | Подаване на информация за плащане | add_payment_info |
| checkout_address_info_submitted | Подаване на информация за доставка | add_shipping_info |
| product_added_to_cart | Добавяне на артикул в пазарската количка | add_to_cart |
| checkout_started | Започване на плащане | begin_checkout |
| checkout_completed | Завършване на плащане | purchase |
| product_removed_from_cart | Премахване на артикул от количката | remove_from_cart |
| cart_viewed | Преглед на пазарска количка | view_cart |
| product_viewed | Преглед на страница с подробности за продукта | view_item |
| collection_viewed | Преглед на списък с артикули | view_item_list |
Параметрите на събитията на таговете на GTM трябва да съответстват на expected naming conventions, за да могат да бъдат обработени събитията на dataLayer на Вашия персонализиран пиксел.
Някои примери за избрани свойства на събития на dataLayer на персонализиран пиксел и техните еквивалентни параметри на събития в Google Analytics 4 (GA4) са следните:
Събития на dataLayer на персонализиран пиксел | Параметри на събития в GA4 |
|---|---|
| event.data?.checkout?.currencyCode | currency |
| event.data?.checkout?.totalPrice?.amount | value |
| event.data?.checkout?.order?.id | transaction_id |
| event.data?.checkout?.discountAllocations | coupon |
| event.data?.checkout?.shippingLine?.price?.amount | shipping |
| event.data?.checkout?.totalTax | tax |
| event.data?.checkout?.lineItems | items |
Ето един пример, използващ следното събитие checkout_completed:
analytics.subscribe("checkout_completed", (event) => {
window.dataLayer.push({
event: "checkout_completed",
orderId: event.data?.checkout?.order?.id,
currency: event.data?.checkout?.currencyCode,
price: event.data.checkout.totalPrice.amount,
shippingLine: event.data.checkout.shippingLine.price.amount,
totalTax: event.data.checkout.totalTax,
});
});Тригерът на Google Tag Manager е персонализиран тип събитие с име на събитието checkout_completed. Полето Event name в тригера трябва да съвпада с ключа event във Вашия персонализиран пиксел.
orderId и currency са променливите, които използвате в Google Tag Manager за улавяне на данните от събитието. Те могат да бъдат съпоставени на променлива dataLayer в Google Tag Manager. Всяка променлива на събитие изисква своя собствена променлива dataLayer. Настройте тригера да се задейства при всички персонализирани събития.
Създайте таг, който използва току-що създадения от Вас тригер. Под параметрите на събитието добавете променливите, които искате да уловите. В примера по-горе orderId, currency, price, shippingLine и totalTax биха се настроили като променливи на dataLayer. Всеки път, когато тагът се задейства, той ще улавя тези променливи на dataLayer заедно със събитието.
Имайте предвид, че трябва да бъдат настроени поне един таг и един тригер в Google Tag Manager, за да се осъществи прехвърлянето на данни.
Замяна на стари извиквания на dataLayer.push(event) с analytics.publish()
Ако преди това сте настройвали Google Tag Manager, тогава трябва да замените своите извиквания на dataLayer.push с извиквания на Shopify.analytics.publish(). Можете да намерите своите извиквания на dataLayer.push във Вашите файлове theme.liquid, в секция Layout на Вашия редактор на теми.
Също така трябва да замените извикванията на dataLayer.push в checkout.liquid. Въпреки това, тъй като checkout.liquid не е съвместим с Shopify Extensions, трябва да използвате разширение на потребителския интерфейс, за да изпращате данни към уеб пиксели.
По-долу е представен опростен пример за проследяване на персонализирано събитие за регистрация по имейл с помощта на dataLayer във файлове theme.liquid:
<script>
dataLayer.push({ event: 'email_signup', email: customer.email });
</script>Еквивалентът в Shopify се показва по този начин, като изпраща данните към Вашия персонализиран пиксел:
<script>
Shopify.analytics.publish('email_signup', {email: customer.email });
</script>След това във Вашия код на персонализиран пиксел бихте добавили нещо подобно:
analytics.subscribe("email_signup", (event) => {
window.dataLayer.push({
'event': 'email_signup',
'email': event.customData.email,
});
});Замяна на старото dataLayer.push(data)
Google Tag Manager има функция, която Ви позволява да изпращате обект dataLayer със запазено състояние при всяко събитие. Изолираната среда за пиксели на Shopify не включва еквивалентна функция, но можете да постигнете същия резултат, като създадете свой собствен обект с данни и го предадете на персонализирани събития.
Например дефинирайте обект „customData“, преди да бъдат публикувани някои от Вашите персонализирани събития:
<script>
const customData = {email: customer.email}
</script>След това, когато искате да включите Вашите персонализирани данни, ги предайте на Вашия метод за публикуване:
<script>
Shopify.analytics.publish('email_signup', customData);
</script>Съвети за настройка на Google Analytics 4
Вземете предвид следните съвети за настройка на Google Analytics 4 (GA4), когато използвате Google Tag Manager като персонализиран пиксел.
По-чисти URL адреси на страници
Когато GA4 работи в изолирана среда, може да забележите, че URL адресите на страниците включват информация за изолираната среда, в която работи. Ако искате да премахнете информацията за изолираната среда от тези URL адреси, тогава можете да изключите автоматичното проследяване на страници на GA4 и вместо това да внедрите свое собствено, като използвате стандартното събитие page_viewed.
analytics.subscribe('page_viewed', (event) => {
window.dataLayer.push({
'event': 'page_viewed',
'page_location': event.context.window.location.href,
'page_title': event.context.document.title,
});
});След като публикувате свое собствено събитие в dataLayer, можете да създадете GA4 таг page_view, който се задейства от събитието page_viewed. Най-често можете да използвате типа таг Google Analytics: GA4 Event и да зададете името на събитието на page_view. След като зададете типа таг и името на събитието, трябва да добавите параметър за page_location и да зададете стойността му на същата стойност, която сте предали на Вашия dataLayer от Вашия персонализиран пиксел.
Подобрено измерване
При зареждане на GA4 в изолираната среда за пиксели на Shopify някои събития, които обикновено се извеждат автоматично, ще трябва да се настроят ръчно. Например кликванията върху изходящи връзки, като част от настройката за подобрено измерване на GA4, не могат да се задействат автоматично от съображения за сигурност при използване на персонализирани пиксели. Възможно е обаче сами да внедрите събитията за подобрено измерване на GA4 като персонализирани събития.
Кодът, предоставен по-долу, включва опростен пример за проследяване на кликвания върху изходящи връзки:
<script>
function detectOutboundLink() {
// add your logic for determining if a link click is outbound
// if the link click is outbound then publish it
if (isOutboundLink) {
Shopify.analytics.publish('outbound_link', { link_url: link_url });
}
}
</script>Накрая, в GTM, създайте GA4 таг, който изпраща кликването върху връзката до GA4, като се уверите, че името на събитието е click, за да съответства на подобреното именуване на събития на GA4.
Можете да постигнете същото проследяване за всеки от показателите за подобрено измерване на Google.
Тестване и отстраняване на грешки на Вашия персонализиран пиксел
Когато сте готови да тествате своя персонализиран пиксел с GTM, използвайте Shopify Pixel Helper, за да се уверите, че всички събития, които искате да проследявате, се добавят в изолираната среда без грешки.
Можете също да използвате разширението за страници Google Tag Assistant, за да тествате кои тагове на Google се зареждат на страницата. Функцията Отстраняване на неизправности в тага на Google Tag Assistant обаче не е съвместима с персонализираните пиксели и не открива никакви тагове на Google в персонализиран пиксел или други пиксели, зареждани от GTM.