GTM সেটআপ শুরু থেকে — server-side tracking-এর জন্য
GTM একদম খালি? Data layer, web container (variable, trigger, GA4 ও Meta Pixel tag) আর server container (GA4 client, Conversions API Tag) বানান — browser ও server-এর জন্য একই Event ID দিয়ে।
এই guide শুরু হয় একদম খালি Google Tag Manager web container থেকে, আর TrackPilot-এর সাথে server-side tracking-এর জন্য একটা shop-এর যা যা লাগে সব বানায়: data layer, web container-এর প্রতিটা variable, trigger ও tag, আর GA4 ও Meta Conversions API event পাঠানোর server container। Browser আর server event একই Event ID ব্যবহার করে, তাই Meta প্রতিটা action একবারই গোনে। সময় লাগবে প্রায় এক ঘণ্টা।
Server container host করা (Container Config, custom domain, loader snippet) আছে Server-side GTM (sGTM) সেটআপ guide-এর ধাপ ১–৫-এ। আগে সেগুলো করুন; এই page সেখান থেকেই এগোয়।
শুরুর আগে যা লাগবে
- Google Tag Manager-এ একটা web container (
GTM-ABC1234) আর একটা server container; server container TrackPilot-এ চলছে আর আপনার domain active — নিচে আমরাhttps://data.yourshop.comলিখছি। - TrackPilot dashboard থেকে নেওয়া first-party loader আপনার site-এর সব page-এ বসানো, আর পুরনো GTM snippet সরানো।
- আপনার Meta Pixel ID (Events Manager → আপনার dataset) আর একটা Conversions API access token (dataset → Settings → Generate access token)।
- ঐচ্ছিক: Google Analytics report চাইলে একটা GA4 Measurement ID (
G-XXXXXXXXXX)। - ধাপ ১-এর জন্য shop-এর code বা theme বদলাতে পারেন এমন কেউ।
সব অংশ কীভাবে জোড়া লাগে
- আপনার shop
purchase-এর মতো একটা eventdataLayer-এ push করে। - Web container ওই event-এ দুটো tag fire করে: একটা Meta Pixel tag (browser event) আর একটা GA4 Event tag, যেটা Google-এ না গিয়ে আপনার tagging server-এ যায়।
- Server container-এর GA4 client সেটা গ্রহণ করে, আর Conversions API Tag সেটা Meta-তে পাঠায় (server event)।
- দুটোতেই একই
event_idথাকে, তাই Meta একটা রাখে আর অন্যটাকে Deduplicated দেখায়।
ধাপ ১ — Website data layer
আপনার shop-কে GTM-কে জানাতে হবে কী ঘটেছে, GA4 ecommerce format-এ। এই চারটা event push করুন:
| Event | কখন | ecommerce-এর field |
|---|---|---|
view_item | Product page খুললে | items (product), value, currency |
add_to_cart | Add to cart চাপলে | items (product + quantity), value, currency |
add_payment_info | Checkout-এ payment method বেছে নিলে | items (পুরো cart), value, currency |
purchase | Thank-you / order-received page, প্রতি order-এ একবার | transaction_id, items, value (order total), currency |
items-এর প্রতিটা entry-তে item_id, item_name, price আর quantity লাগবে। item_id আপনার product catalog-এর সাথে একই রাখুন (SKU বা product ID)। সংখ্যা অবশ্যই number হবে, মুদ্রার চিহ্নসহ text নয়।
প্রতিটা ecommerce event-এর ঠিক আগে সবসময় { ecommerce: null } push করুন। নাহলে GTM নতুন event-কে আগেরটার সাথে merge করে ফেলে, আর পুরনো item ঢুকে পড়ে।
window.dataLayer = window.dataLayer || [];
// Product page
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'view_item',
ecommerce: {
currency: 'BDT',
value: 1200,
items: [{ item_id: 'SKU-123', item_name: 'Cotton Panjabi', price: 1200, quantity: 1 }]
}
});
// Thank-you page
dataLayer.push({ ecommerce: null });
dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'ORD-10045',
value: 2450, // shipping আর discount-এর পরের order total
currency: 'BDT',
items: [
{ item_id: 'SKU-123', item_name: 'Cotton Panjabi', price: 1200, quantity: 2 },
{ item_id: 'SKU-456', item_name: 'Leather Belt', price: 50, quantity: 1 }
]
},
customer_data: { // ঐচ্ছিক, Meta match quality বাড়ায়
em: '[email protected]',
ph: '8801712345678', // country code + number, শুধু digit
fn: 'Rahim'
}
});
add_to_cart আর add_payment_info-এর গঠন view_item-এর মতোই। customer_data ঐচ্ছিক; customer যেখানে নিজে দিয়েছেন (checkout, thank-you page) শুধু সেখানেই push করুন। সাধারণ text হিসেবে পাঠান — Conversions API Tag আপনার server থেকে বেরোনোর আগেই hash করে দেয়। WooCommerce, Shopify আর বেশিরভাগ platform-এ GA4 data-layer plugin বা app এই push-গুলো বানিয়ে দেয়; GTM Preview-তে যাচাই করুন (ধাপ ৬)।
ধাপ ২ — Web container: variable
Web container → Variables → User-Defined Variables → New। নিচের প্রতিটা ঠিক এই নামে বানান — ধাপ ৪-এর tag-গুলো নাম ধরেই এদের খোঁজে।
| নাম | Variable type | Setting |
|---|---|---|
| DLV - ecommerce.items | Data Layer Variable | Name ecommerce.items, version 2 |
| DLV - ecommerce.items.0.item_id | Data Layer Variable | ecommerce.items.0.item_id |
| DLV - ecommerce.items.0.item_name | Data Layer Variable | ecommerce.items.0.item_name |
| DLV - ecommerce.value | Data Layer Variable | ecommerce.value |
| DLV - ecommerce.transaction_id | Data Layer Variable | ecommerce.transaction_id |
| DLV - customer_data.em | Data Layer Variable | customer_data.em |
| DLV - customer_data.ph | Data Layer Variable | customer_data.ph |
| DLV - customer_data.fn | Data Layer Variable | customer_data.fn |
| User-Provided Data | User-Provided Data | Manual configuration: Email = {{DLV - customer_data.em}}, Phone = {{DLV - customer_data.ph}}, First name = {{DLV - customer_data.fn}} |
| Const - Currency | Constant | আপনার shop-এর currency, যেমন BDT |
| Const - Content Type | Constant | product |
| Const - GA4 Measurement ID | Constant | G-XXXXXXXXXX |
| Const - Meta Pixel ID | Constant | আপনার Pixel ID, যেমন 123456789012345 |
| Event ID | Event Id (Community Template Gallery) | কোনো setting নেই — নিচে দেখুন |
| Cookie - _fbp | 1st Party Cookie | Cookie Name _fbp |
| Cookie - _fbc | 1st Party Cookie | Cookie Name _fbc (Meta ad থেকে visit করার পরেই থাকে) |
| JS - FB Contents (String) | Custom JavaScript | নিচের code — GA4 tag-এর জন্য |
| JS - FB Contents (Array) | Custom JavaScript | নিচের code — Meta Pixel tag-এর জন্য |
| JS - FB Content IDs | Custom JavaScript | নিচের code — Meta Pixel tag-এর জন্য |
| JS - FB Value | Custom JavaScript | নিচের code — শুধু shop-এ ecommerce.value না থাকলে |
| JS - FB Num Items | Custom JavaScript | নিচের code |
Event ID: Variables → New → Variable Configuration → Discover more variable types in the Community Template Gallery → Event Id খুঁজুন → Add to workspace। নাম দিন Event ID। এটা প্রতিটা data-layer event-কে নিজস্ব একটা ID দেয়, আর একই event-এ fire হওয়া সব tag একই মান পায় — deduplication-এর জন্য ঠিক এটাই দরকার।
Custom JavaScript code (প্রতিটা আলাদা variable-এ paste করুন):
JS - FB Contents (String) — GA4 parameter text হিসেবে পাঠায়, তাই list-কে JSON string বানানো হয়:
function () {
var items = {{DLV - ecommerce.items}} || [];
return JSON.stringify(items.map(function (i) {
return { id: String(i.item_id), quantity: Number(i.quantity) || 1, item_price: Number(i.price) || 0 };
}));
}
JS - FB Contents (Array) — browser Pixel আসল list নেয়:
function () {
var items = {{DLV - ecommerce.items}} || [];
return items.map(function (i) {
return { id: String(i.item_id), quantity: Number(i.quantity) || 1, item_price: Number(i.price) || 0 };
});
}
JS - FB Content IDs
function () {
var items = {{DLV - ecommerce.items}} || [];
return items.map(function (i) { return String(i.item_id); });
}
JS - FB Value
function () {
var items = {{DLV - ecommerce.items}} || [];
var total = 0;
for (var k = 0; k < items.length; k++) {
total += (Number(items[k].price) || 0) * (Number(items[k].quantity) || 1);
}
return total;
}
JS - FB Num Items
function () {
var items = {{DLV - ecommerce.items}} || [];
var n = 0;
for (var k = 0; k < items.length; k++) {
n += Number(items[k].quantity) || 1;
}
return n;
}
এই guide-এ যেখানে {{DLV - ecommerce.value}} লেখা আছে, shop ecommerce.value push না করলে সেখানে {{JS - FB Value}} ব্যবহার করতে পারেন। purchase-এর জন্য আসল order total-ই ভালো, কারণ তাতে shipping আর discount ধরা থাকে।
ধাপ ৩ — Web container: trigger
Web container → Triggers → New:
| নাম | Trigger type | Setting |
|---|---|---|
| Initialization - All Pages | Initialization | All Initialization Events |
| CE - view_item | Custom Event | Event name view_item, All Custom Events |
| CE - add_to_cart | Custom Event | Event name add_to_cart |
| CE - add_payment_info | Custom Event | Event name add_payment_info |
| CE - purchase | Custom Event | Event name purchase |
একটা action-এর GA4 tag আর Meta tag-কে একই trigger ব্যবহার করতে হবে। তাহলে দুটোই একই data-layer event-এ fire করে আর একই {{Event ID}} পায়।
ধাপ ৪ — Web container: tag
৪.১ Google tag (GA4 আপনার server-এ পাঠায়)
Tags → New → Google tag। নাম দিন GA4 - Google tag।
- Tag ID: {{Const - GA4 Measurement ID}}।
- Configuration settings → এই parameter-গুলো যোগ করুন:
| Parameter | Value | কেন |
|---|---|---|
server_container_url | https://data.yourshop.com | প্রতিটা GA4 hit Google-এর বদলে আপনার tagging server-এ যায় |
first_party_collection | true | Server user-provided data পেতে পারে |
x-fb-ck-fbp | {{Cookie - _fbp}} | Conversions API Tag এখান থেকে Meta-র browser ID পড়ে |
x-fb-ck-fbc | {{Cookie - _fbc}} | Meta click ID, ad attribution-এর জন্য |
event_id | {{Event ID}} | Server PageView-কে browser PageView-এর সাথে deduplicate করে (৪.৩) |
Trigger: Initialization - All Pages। এই tag page_view-ও পাঠায়।
৪.২ GA4 Event tag
Tags → New → Google Analytics: GA4 Event, প্রতি event-এ একটা: GA4 - view_item, GA4 - add_to_cart, GA4 - add_payment_info, GA4 - purchase।
- Measurement ID: {{Const - GA4 Measurement ID}}।
- Event Name: event-এর নাম হুবহু (
view_item,add_to_cart,add_payment_info,purchase)। - More Settings → Ecommerce → Send Ecommerce data টিক দিন, Data source Data Layer। এতে
itemslist আরtransaction_idযায়। - Event Parameters:
| Parameter | Value |
|---|---|
event_id | {{Event ID}} |
value | {{DLV - ecommerce.value}} |
currency | {{Const - Currency}} |
content_ids | {{DLV - ecommerce.items.0.item_id}} |
content_type | {{Const - Content Type}} |
content_name | {{DLV - ecommerce.items.0.item_name}} |
num_items | {{JS - FB Num Items}} |
contents | {{JS - FB Contents (String)}} — অবশ্যই String version |
user_data | {{User-Provided Data}} — server-এ আসে user_data.email_address, user_data.phone_number, user_data.address.first_name নামে |
transaction_id | {{DLV - ecommerce.transaction_id}} — শুধু purchase-এ |
Trigger: মিলে যাওয়া CE - … trigger। টিপ: GA4 - view_item পুরোটা বানিয়ে বাকি তিনটার জন্য Copy (⋮ menu) করুন, তারপর শুধু নাম, event name আর trigger বদলান।
৪.৩ Meta Pixel tag
Tags → New → Discover more tag types in the Community Template Gallery → Meta Pixel খুঁজুন → Add to workspace। এই official template ব্যবহার করুন, পুরনো Facebook Pixel (facebookarchive) template নয় — ওটায় Event ID field নেই।
পাঁচটা tag বানান। প্রতিটায়: Pixel ID = {{Const - Meta Pixel ID}}, Event Name = Standard + Meta event, আর More Settings → Event ID = {{Event ID}}। Meta-enabled Conversions API opt-in বন্ধ রাখুন — আপনার server container-ই server event পাঠায়।
| Tag-এর নাম | Meta event | Trigger |
|---|---|---|
| Meta - PageView | PageView | Initialization - All Pages |
| Meta - ViewContent | ViewContent | CE - view_item |
| Meta - AddToCart | AddToCart | CE - add_to_cart |
| Meta - AddPaymentInfo | AddPaymentInfo | CE - add_payment_info |
| Meta - Purchase | Purchase | CE - purchase |
চারটা ecommerce tag-এ Object Properties যোগ করুন (Property Name → Property Value):
| Property | Value |
|---|---|
content_ids | {{JS - FB Content IDs}} |
content_type | {{Const - Content Type}} |
content_name | {{DLV - ecommerce.items.0.item_name}} |
contents | {{JS - FB Contents (Array)}} — Array version |
num_items | {{JS - FB Num Items}} |
value | {{DLV - ecommerce.value}} |
currency | {{Const - Currency}} |
৪.৪ Event map
Server-এর Conversions API Tag নিজেই GA4 event-কে Meta event-এর নামে বদলে নেয়। Browser tag-কে মিলিয়ে Meta-র নাম ব্যবহার করতে হবে:
| Data layer / GA4 event | Meta event | Web tag (একই trigger) |
|---|---|---|
page_view (Google tag পাঠায়) | PageView | GA4 - Google tag + Meta - PageView |
view_item | ViewContent | GA4 - view_item + Meta - ViewContent |
add_to_cart | AddToCart | GA4 - add_to_cart + Meta - AddToCart |
add_payment_info | AddPaymentInfo | GA4 - add_payment_info + Meta - AddPaymentInfo |
purchase | Purchase | GA4 - purchase + Meta - Purchase |
ধাপ ৫ — Server container
- Server container URL: server container → Admin → Container Settings →
https://data.yourshop.com→ Save (sGTM সেটআপ-এর ধাপ ৪ করে থাকলে এটা করাই আছে)। - Clients:
- GA4 — প্রতিটা নতুন server container-এ থাকে। রেখে দিন; ধাপ ৪-এর event এটাই গ্রহণ করে।
- Google Tag Manager: Web Container — Clients → New → এই type → Allowed Container IDs =
GTM-ABC1234। বাধ্যতামূলক: এটা না থাকলে tagging servergtm.js-এ 400 Bad Request দেয়, আর আপনার site-এ কোনো tag-ই load হয় না।
- Trigger: Triggers → New → Custom → Some Events →
Client NameequalsGA4। নাম দিনGA4 client - all events। (তালিকায় Client Name না থাকলে Variables → Configure থেকে চালু করুন।) - Conversions API Tag: Templates → Tag Templates → Search Gallery → facebookincubator-এর Conversions API Tag → Add। তারপর Tags → New → Conversions API Tag:
| Field | Value |
|---|---|
| Pixel ID | আপনার Meta Pixel / dataset ID |
| API Access Token | Events Manager → dataset → Settings-এর token |
| Action Source | Website |
| Extend Meta Pixel cookies (fbp/fbc) | On |
| Enable Event Enhancement | On |
| Test Event Code | শুধু test করার সময় (ধাপ ৬)। Live করার আগে মুছে দিন, নাহলে Meta সব server event-কে test ধরবে। |
| Trigger | GA4 client - all events |
ঐচ্ছিক — Google Analytics report। server_container_url দিলে GA4 hit আর সরাসরি Google-এ যায় না। GA4 report রাখতে চাইলে Tags → New → Google Analytics: GA4 যোগ করুন (Measurement ID খালি রাখুন, event-এরটাই ব্যবহার হবে), trigger একই GA4 client - all events।
ধাপ ৬ — Publish ও যাচাই
- আগে server container publish করুন (Submit → Publish), তারপর web container। উল্টো করলে website এমন server-এ পাঠাতে শুরু করে যেখানে এখনো Web Container client বা CAPI tag নেই। Tagging server নতুন version প্রায় এক মিনিটে load করে।
- Site খুলে Ctrl+Shift+R দিয়ে hard-reload করুন — browser কয়েক মিনিট পুরনো
gtm.jsরেখে দেয়। - Web Preview (web container → Preview): একটা product দেখুন, cart-এ দিন, checkout করুন। প্রতিটা event-এ
GA4 - …আরMeta - …দুটোই fired দেখাবে, আর Variables tab-এ {{Event ID}}-এর একটাই মান থাকবে। - Server Preview (server container → Preview, ওই tab খোলা রেখে অন্য tab-এ site ব্যবহার করুন): প্রতিটা request GA4 client নেবে। Event Data-তে
event_id,items,value(number),contents(quote-এর ভেতর JSON list),x-fb-ck-fbpআর checkout-এuser_dataদেখুন। Tags-এ Conversions API Tag fired হবে, আরgraph.facebook.com-এ তার outgoing request 200 দেবে। - Events Manager → Test events: Test Event Code CAPI tag-এ দিয়ে publish করুন, আবার action-গুলো করুন। প্রতিটায় একটা Browser আর একটা Server row আসবে; server row-এ Deduplicated লেখা থাকবে আর দুটোর Event ID একই।
- Meta Pixel Helper (Chrome extension): event খুললে browser-এর পাঠানো Event ID আর
contentsদেখায়। - Test Event Code মুছে server container আবার publish করুন। শেষ।
সাধারণ ভুল
- Server-এ
contentsদেখায়[object Object]: array ধরা GA4 parameter text হিসেবে যায়। GA4 tag-এ {{JS - FB Contents (String)}} ব্যবহার করুন; Array version শুধু Pixel-এ রাখুন। - Server event-এ শুধু
valueআরcurrency:itemslist যাচ্ছে না। প্রতিটা GA4 Event tag-এ Send Ecommerce data টিক দিন। - Pixel tag-এ Event ID field নেই: আপনি পুরনো "Facebook Pixel" (facebookarchive) template-এ আছেন। Meta Pixel template যোগ করুন, বা GTM-এর দেওয়া update accept করুন, তারপর More Settings → Event ID দিন।
- Publish করার পরেও বদল দেখা যাচ্ছে না:
gtm.jscache হয়ে থাকে — hard-reload করুন, বা কয়েক মিনিট অপেক্ষা করুন। - Test events-এ Browser row-এ Event ID নেই: ID পাঠানো হলেও browser row-এ ওই column প্রায়ই খালি থাকে। Meta Pixel Helper-এ দেখুন; server row-এ Deduplicated থাকলে কাজ হচ্ছে।
সমস্যা ও সমাধান
- কোনো tag-ই fire হয় না — loader-এর
gtm.js400 দেয়: Web Container client নেই, বা server container publish হয়নি (ধাপ ৫)। - GA4 tag fire হয় কিন্তু server-এ কিছু পৌঁছায় না — Google tag-এর
server_container_urlদেখুন, আর TrackPilot dashboard-এ আপনার domain active কি না দেখুন। - Server event আসে, কিন্তু CAPI tag fire হয় না — trigger অবশ্যই Client Name equals GA4 হতে হবে, আর request-টা GA4 client-কেই claim করতে হবে।
- CAPI request 400 দেয় — Pixel ID ভুল বা access token মেয়াদ শেষ; Server Preview-র response body-তে কারণ লেখা থাকে।
- Event দুবার গোনা হচ্ছে — একটা action-এর GA4 আর Meta tag আলাদা trigger ব্যবহার করছে, তাই Event ID আলাদা (ধাপ ৩)।
আরও কারণ ও সমাধান: sGTM সেটআপের সমস্যা ও সমাধান table। Meta কীভাবে browser আর server event মেলায়: Event deduplication।
Stuck? Ask for setup help — we answer in বাংলা or English.