ব্লগ
Shopify বা WooCommerce স্টোরে সার্ভার-সাইড ট্যাগিং: কী ফায়ার হয়, কী হয় না, আর কী ইনস্টল করবেন
প্রকাশিত · আপডেট করা হয়েছে · পড়তে 4 মিনিট
একটি সার্ভার কনটেইনার নিজে থেকে কোনো স্টোরকে দিয়ে পারচেজ রিপোর্ট করায় না। ব্রাউজার যা পাঠায়, সেটাই সে Google-এর হোস্টনেমের বদলে আপনার নিজের হোস্টনেম থেকে ফরোয়ার্ড করে — আর সেটা করার মতোই কাজ, কারণ অ্যাড ব্লকার আর Safari মিলে একটি স্টোরের কনভার্সনের উল্লেখযোগ্য অংশ হারিয়ে ফেলে। কিন্তু পারচেজটা আগে পাঠাতে হবে, আর বেশিরভাগ স্টোর যে দুটি প্ল্যাটফর্মে চলে, সেখানে ডিফল্টভাবে কিছুই তা পাঠায় না। প্রথম দিন থেকেই প্রত্যেক গ্রাহকের হাতে যে লেখাটা তুলে দিতে চাইতাম, এটা সেই লেখা।
নয়টি ইভেন্ট, আর তাদের মধ্যে একটিই মিল
পারচেজ ফানেলের জন্য GA4 নয়টি ইভেন্ট নির্ধারণ করেছে: view_item_list, view_item, add_to_cart, remove_from_cart, view_cart, begin_checkout, add_shipping_info, add_payment_info এবং purchase। নামগুলো GA4-এর, কোনো প্ল্যাটফর্মের নয় — একই নয়টি ইভেন্ট Shopify, WooCommerce আর আপনার নিজের বানানো স্টোর, সবখানেই কাজ করে।
তাদের মিলটা হলো একটি মেকানিজম। প্রতিটি ইভেন্ট হলো পেজের dataLayer-এ একটি পুশ, হুবহু ওই নামে, সঙ্গে GA4-এর কাঠামোয় একটি ecommerce অবজেক্ট। Tag Manager-এর একটি ট্রিগার নামটির অপেক্ষায় থাকে; একটি GA4 ইভেন্ট ট্যাগ ecommerce অবজেক্টটি পড়ে পাঠিয়ে দেয়। নামের বানান ভুল হলে, অবজেক্টটি এক স্তর বেশি ভেতরে থাকলে, বা ভুল পেজে পুশ হলে ট্যাগটি কোনো এরর ছাড়াই চিরকাল চুপচাপ বসে থাকবে। একটি পারচেজ পুশ দেখতে এমন:
window.dataLayer = window.dataLayer || [];
window.dataLayer.push({ ecommerce: null });
window.dataLayer.push({
event: 'purchase',
ecommerce: {
transaction_id: 'ORD-10442',
value: 89.90,
currency: 'EUR',
items: [
{ item_id: 'SKU-118', item_name: 'Trail jacket', price: 89.90, quantity: 1 }
]
}
});শুরুতে ecommerce: null পুশ করাটা সাজসজ্জা নয়। এটি না থাকলে আগের ইভেন্টের items পরের ইভেন্টে চুইয়ে ঢুকে পড়তে পারে, আর তিন পেজ আগের একটি view_item হাজির হয় একটি purchase-এর ভেতরে।
Shopify: থিম চেকআউট দেখতে পায় না
Shopify থিমে ইনস্টল করা কনটেইনার স্টোরফ্রন্টে লোড হয় — প্রোডাক্ট পেজ, কালেকশন, কার্ট। চেকআউট বা থ্যাংক-ইউ পেজে লোড হয় না, কারণ Shopify এগুলো নিজের ডোমেইন আর নিজের টেমপ্লেট থেকে দেখায়। তাই থিমে ইনস্টল করা কনটেইনার view_item আর add_to_cart পাঠাতে পারে, কিন্তু কোনো কনফিগারেশনেই কখনো begin_checkout, add_shipping_info, add_payment_info বা purchase পাঠাবে না।
এই চারটি আসে একটি Custom Pixel থেকে। Shopify-এর পিক্সেল স্যান্ডবক্স চেকআউটের ইভেন্টগুলো (checkout_started, checkout_shipping_info_submitted, payment_info_submitted, checkout_completed) দেখতে দেয় এবং পিক্সেলকে নিজস্ব একটি dataLayer-এ পুশ করতে দেয় — একটি ছোট স্ক্রিপ্ট প্রতিটিকে ওপরের GA4 ইভেন্ট নাম ও কাঠামোয় রূপান্তর করে। স্টোরফ্রন্টের ইভেন্টগুলো তখনও থিম থেকেই আসে, তাই একটি সম্পূর্ণ সেটআপে দুটোই থাকে: ব্রাউজিং অংশের জন্য একটি dataLayer অ্যাপ বা থিম স্নিপেট, আর চেকআউট অংশের জন্য একটি Custom Pixel।
আরও একটি সিদ্ধান্ত নিতে হবে। Shopify-এর Google & YouTube চ্যানেল কোনো কনটেইনার ছাড়াই সরাসরি GA4 ইভেন্ট পাঠাতে পারে। আপনি যদি সেখানে একটি GA4 প্রপার্টি কানেক্ট করেন এবং একই প্রপার্টি আপনার কনটেইনারের মধ্য দিয়েও পাঠান, তাহলে প্রতিটি পারচেজ দুবার গোনা হবে। একটি পথ বেছে নিন। উদ্দেশ্য যদি ফার্স্ট-পার্টি ডেটা সংগ্রহ হয়, তাহলে কনটেইনারই সেই পথ, আর চ্যানেলের Analytics কানেকশন বন্ধ থাকবে।
WooCommerce: মূল সফটওয়্যার নিজে কিছুই পুশ করে না
WooCommerce নিজে কোনো dataLayer-ই লেখে না। লেখে একটি প্লাগইন — বেশিরভাগ মানুষ GTM4WP বেছে নেন — আর এর GA4 ই-কমার্স অপশন এই ইভেন্টগুলো সঠিক কাঠামোয়, সঠিক পেজে তৈরি করে: প্রোডাক্ট পেজে view_item, বাটনে add_to_cart, চেকআউট পেজে begin_checkout, আর order-received পেজে purchase।
WooCommerce-এর চিরচেনা সমস্যা হলো দ্বিগুণ পারচেজ, আর এর একটি নির্দিষ্ট কারণ আছে: order-received পেজটি আবার লোড হয়। ভিজিটর পেজটি রিফ্রেশ করেন, পেমেন্ট প্রোভাইডার থেকে এতে ফিরে আসেন, অথবা থিম দুবার এই পেজের মধ্য দিয়ে রিডাইরেক্ট করে — আর একই transaction_id নিয়ে purchase আবার পুশ হয়। GA4 একটি সেশনের মধ্যে transaction_id দিয়ে ডুপ্লিকেট পারচেজ বাদ দেয়, তাতে বেশিরভাগই ধরা পড়ে, কিন্তু পরের দিনের রিলোড ধরা পড়ে না। প্লাগইনের "only fire once per order" সেটিংটি চালু করে রাখা ভালো; এটি ফ্ল্যাগটি সার্ভার-সাইডে রাখে, যেখানে রিলোড করে সেটা রিসেট করা যায় না।
SignalHost আপনার জন্য যা তৈরি করে
প্রতিটি SignalHost কনটেইনারের ওয়েব কনটেইনারে এই নয়টির প্রতিটির জন্য একটি Custom Event ট্রিগার আর একটি GA4 ইভেন্ট ট্যাগ থাকে — সেইসঙ্গে স্টোর নেই এমন সাইটের যে সাতটি লাগে, সেগুলোর জন্যও: সাইন আপ, ট্রায়াল আর লিড। সবগুলোর নামের শুরুতে SH প্রিফিক্স থাকে, তাই আপনার আগে থেকে থাকা কোনো কিছুর সঙ্গে কখনো সংঘর্ষ হয় না। প্রতিটি ট্যাগ ecommerce অবজেক্টটি সরাসরি dataLayer থেকে পাঠায়, তাই প্রতিটি ফিল্ডের জন্য আলাদা ভ্যারিয়েবল ছাড়াই items, value, currency আর transaction_id পৌঁছে যায়; আর প্রতিটি ট্যাগ আপনার মেজারমেন্ট ID উত্তরাধিকারসূত্রে না নিয়ে স্পষ্টভাবে উল্লেখ করে।
আপনার স্টোরে কিছুই ইনস্টল করা হয় না। ট্রিগারগুলো শুধু অপেক্ষা করে; পুশগুলো আসে প্লাগইন বা পিক্সেল থেকে। আপনার কনটেইনার যদি আপনার নিজের কোনো ট্যাগ দিয়ে এর কোনো একটি ইভেন্ট আগে থেকেই GA4-এ পাঠায় — ধরুন, এমন একটি প্লাগইন যা নিজের purchase ট্যাগ নিয়ে এসেছে — তাহলে SignalHost সেই ইভেন্টটি তার হাতেই ছেড়ে দেয় এবং দ্বিতীয় কোনো ট্যাগ বানায় না, তাই কোনো অর্ডার দুবার গোনা হয় না। আপনি ইভেন্টের সঙ্গে যে event_id পুশ করেন, প্রতিটি ট্যাগ সেটাও পাঠিয়ে দেয়, ফলে কোনো বিজ্ঞাপন প্ল্যাটফর্ম একই ইভেন্ট নিজের পিক্সেল থেকেও পেলে সেটি একবারই গোনে।
সার্ভার-সাইডে প্রতি ইভেন্টের জন্য আলাদা কিছু নেই। সার্ভার কনটেইনারের GA4 ট্যাগ যে ইভেন্টই পায়, নাম যা-ই হোক, সবই ফরোয়ার্ড করে, তাই আপনার সাইটে নতুন কোনো ইভেন্ট যোগ হলে আমাদের দিকে কিছুই বদলাতে হয় না। আপনি যে বিজ্ঞাপন প্ল্যাটফর্মগুলো কানেক্ট করেন — Google Ads, Meta, TikTok, Reddit, Pinterest, Snapchat, LinkedIn — সেগুলোও একই ইভেন্ট পায়: একটি purchase, Meta আর TikTok-এর জন্য প্রোডাক্ট ও মূল্যসহ একটি Purchase হয়ে যায়, আর একই পুশ থেকে প্রতিটি প্ল্যাটফর্ম নিজের কাজে লাগে এমন ইভেন্টগুলো পায়।
একটি টেস্ট অর্ডার দিয়ে যাচাই
টেস্ট মোডে একটি আসল অর্ডার দিন, অথবা কম দামের একটি অর্ডার দিয়ে পরে রিফান্ড করুন, আর কনটেইনার পেজের ইভেন্ট তালিকা দেখুন। ক্রমানুসারে আপনার দেখার কথা view_item, add_to_cart, begin_checkout, add_payment_info এবং purchase — প্রতিটি একবার করে, আর আপনার সেটআপ যদি view_cart ও add_shipping_info পুশ করে, তাহলে সেগুলো এদের মাঝে। Shopify-তে purchase না থাকা মানে Custom Pixel ইনস্টল করা নেই বা পুশ করছে না; WooCommerce-এ begin_checkout না থাকা সাধারণত মানে প্লাগইনের চেকআউট ইভেন্ট বন্ধ করা আছে।
আপনি যদি কনটেইনারের মাধ্যমে Google Ads কনভার্সন চালান, তাহলে অন্য কিছু বেছে না নিলে purchase-ই কনভার্সন ইভেন্ট, আর এর value, currency ও transaction ID ওই একই ecommerce অবজেক্ট থেকে পড়া হয়। value ছাড়া একটি purchase পুশ শূন্য মূল্যের একটি কনভার্সন রেকর্ড করে — যা রিপোর্টে একটি আসল সংখ্যা, এবং ভুল সংখ্যা।
এর পরেও GA4 যদি আপনার স্টোরের চেয়ে কম অর্ডার গোনে, এখানে পড়ুন GA4 কেন কম গোনে, আর কোন অংশ ফিরিয়ে আনা যায়।

