Cross-domain ترکینگ تو GA4 یه راه‌حل جذابه که بهت اجازه می‌ده اطلاعات کاربر رو از یه دامنه به دامنه دیگه بفرستی و داده‌های سشن رو بین دامنه‌ها منتقل کنی. این کار باعث می‌شه یه کاربر به‌طور مداوم و دقیقی تو چندین وب‌سایت ترکینگ بشه و تحلیل‌های دقیق‌تر و یکپارچه‌تری داشته باشی.
اگه این مقاله رو می‌خونی، احتمالاً  با Cross-domain ترکینگ  آشنا هستی و مشتاق بودی ستاپ کنی - ولی دیدی طبق انتظارت کار نمی‌کنه. این واسه همه مون پیش میاد!
تو این مقاله، چند دلیل احتمالی برای کارنکردن Cross-domain ترکینگ در گوگل آنالیتیکس ۴ و راه‌حل‌های احتمالیش رو بررسی می‌کنیم.

Cross-domain ترکینگ تو گوگل آنالیتیکس ۴
اگه می‌خوای بیشتر درباره ترکینگ بین‌دomini تو گوگل آنالیتیکس ۴ بدونی، پست وبلاگی‌مو درباره این موضوع چک کن. این مقاله فرآیند راه‌اندازی Cross-domain ترکینگ رو قدم‌به‌قدم توضیح می‌ده، پس ممکنه بدرد بخوره.
اگه هنوز مشکل داری، موارد پایین رو چک کن:

 دامنه اشتباه ست شده
این یه توضیح ساده‌ست، ولی اگه دامنه‌ها (که می‌خوای بینشون ترکینگ کنی) اشتباه تنظیم شده باشن، GA4 نمی‌تونه داده‌ها رو به‌درستی به یه کاربر بین اون دامنه‌ها پاس بده.

برای چک کردن این قضیه، به این مسیر برو Admin > Data streams برو و دیتا استریم مرتبط رو انتخاب کن.

تو بخش Configure tag settings، روی "Configure your domains" کلیک کن و مطمئن شو که لیست دامنه‌ها تو بخش Domains شامل همه دامنه‌هایی که می‌خوای ترکینگ کنی باشه.

مطمئن شو همه دامنه‌های مرتبط رو اضافه کردی و اشتباه املایی تو دامنه‌های اضافه شده نباشه.

سرور ریدایرکت‌ها
اگه صفحه‌ای که کاربر روش فرود میاد کاربر رو به صفحه دیگه‌ای ریدایرکت می‌کنه یا پارامترهای کوئری دلخواه رو پشتیبانی نمی‌کنه، ترکینگت به مشکل میخوره. Cross-domain ترکینگ به یه پارامتر _gl وابسته س که  GA4 از اون پارامتر برای انتقال داده‌های کاربر بین دامنه‌ها استفاده می‌کنه.
یه افزونه کروم به اسم Redirect Path هست که بهت نشون می‌ده بعد از یه URL مشخص چه ردیرکت‌هایی اتفاق می‌افته. لینکی که می‌دونی کاربرها رو به دامنه دیگه‌ای منتقل میکنه رو انتخاب کن و تست کن ببین که ریدایرکت روی Cross-domain ترکینگ تأثیر داره یا نه.
به صفحه‌ای که لینک توشه برو، روی لینک کلیک کن و بعد افزونه رو باز کن.

تو تصویر بالا، دو چیز می‌بینی: بخش بالا لینک با پارامتر _gl رو نشون می‌ده و بخش پایین نشون می‌ده کاربر نهایتاً به صفحه /password ریدایرکت شده و پارامتر _gl غیبش زده. این مشکل‌سازه چون GA4 تو صفحه دوم (بدون پارامتر) لود می‌شه.
تنها راه‌حلش اینه که با دولوپرهای تیمت کار کنی. مشکل رو بهشون توضیح بده و ببین که راهی هست که بتونن ستاپ رو در سطح سرور طوری تنظیم کنن که پارامترهای کوئری URL بعد از ردیرکت حفظ بشن.

ریدایرکت‌های جاوااسکریپتی
مشابه مورد بالا، ریدایرکتی که بخاطر کد جاوااسکریپتی سایتت ایجاد شده هم می‌تونه پارامترهایی مثل _gl رو از URL برداره. وقتی کاربر روی لینکی به دامنه‌ای کلیک می‌کنه، ریدایرکت جاوااسکریپتی اون کاربر رو به صفحه دیگه‌ای می‌فرسته و پارامتر _gl رو از URL حذف می‌کنه.
دوباره، می‌تونی از افزونه Redirect Path استفاده کنی و تست کنی. روی لینک منتهی به دامنه دوم کلیک کن، منتظر ریدایرکت باش و افزونه Redirect Path رو بزن تا ببینی چی باعث ردیرکت شده!
این بار، افزونه می‌گه ردیرکت "JAVASCRIPT" بوده.

دوباره، راه‌حل اینه که با دولوپرها تعامل کنی تا کد جاوااسکریپت مشکل‌ساز رو حذف کنن یا حداقل کدی رو تنظیم کنن که پارامتر _gl تو URL باقی بمونه.
تو موارد نادر، موقعیت‌هایی دیدم که کد ریدایرکت‌کننده جاوااسکریپت خودش تو GTM بوده. پس، اگه دولوپرها نمی‌دونن ردیرکت از کجا میاد، چک کردن کانتینرGTM رو شاید مشکل از اونجاست.

() .stopPropogation
وقتی کاربر روی لینکی تو وب‌سایت A که به وب‌سایت B منتهی میشه کلیک می‌کنه، مرورگر یه ایونت کلیک ایجاد می‌کنه. توی Document Object Model (DOM)، ایونت‌ها به‌صورت سلسله‌مراتبی از طریق فرایندی به اسم propagation مدیریت می‌شن. این یعنی وقتی ایونتی مثل کلیک روی دکمه اتفاق می‌افته، اون ایونت فقط تو المانی که ایونت ازش شروع شده نمی‌مونه -و تو DOM "بالا می‌ره".
 ایونت پروپگیشن برای Cross-domain ترکینگ حیاتیه چون ایونت کلیک باید به document (یا "نردبان بالا بره" اگه بخوام بگم) برسه تا GA4 بتونه ایونت رو تشخیص بده و پارامتر _gl رو قبل از ردیرکت کاربر به وب‌سایت B به URL اضافه کنه.
اگه دولوپرهای تیمت از متد جاوااسکریپت() event.stopPropogation استفاده کرده باشن، جلوی رسیدن ایونت‌ها به document رو میگیره که GA4 بهش گوش می‌ده.
راه‌حلش اینه که با دولوپرهات همکاری کنی تا هر جاوااسکریپتی که جلوی رسیدن ایونت کلیک به داکیومنت رو می‌گیره شناسایی کنن. مطمئن شو هیچ اسکریپتی ایونت propagation رو متوقف نکنه.

کلیک روی دکمه‌های معمولی از Cross-domain ترکینگ پشتیبانی نمی‌کنن
Cross-domain ترکینگ به‌طور پیش‌فرض برای لینک‌ها طراحی شده. پس، فرض کن دکمه‌ای با یه هایپرلینک (با تگ <a> تو HTML) کدنویسی شده باشه. تو این حالت، GA4 کاربر رو به‌درستی بین وب‌سایت‌ها ترکینگ می‌کنه چون کلیک روی لینک پارامترهای لازم ترکینگ از جمله _gl رو فعال می‌کنه.

ولی اگه المانی که کاربر روش کلیک می‌کنه یه المان <button> یا المان غیرلینک دیگه (مثل <div>) باشه، Cross-domain ترکینگ خراب می‌شه. تو این موارد، باید ستاپ دستی انجام بدی تا پارامترهای ترکینگ بین دامنه‌ها درست منتقل بشن.

فعلاً، "راه‌حل پیشنهادی گوگل" برای این مشکل اینه که خودت یه ستاپ کاستوم پیاده‌سازی کنی، چون راه‌حل آماده‌ای برای المان‌های غیرلینکی وجود نداره. این یعنی باید با دولوپرها تعامل کنی تا ترکینگ رو دستی مدیریت کنن و مطمئن بشن کلیک روی دکمه‌ها یا المان‌های دیگه رفتاری مثل لینک‌ها داشته باشن تا cross-domain ترکینگ درست عمل کنه.

سابمیت فرم
cross-domain ترکینگ کار نمی‌کنه وقتی بازدیدکننده بعد از سابمیت فرم تو وب‌سایت A به وب‌سایت B ریدایرکت بشه. این به خاطر این دلیله که وقتی ارسال فرم کاربر رو ردیرکت می‌کنه، پارامترهای ترکینگ که GA4 بهشون نیاز داره (مثل _ga) بین دامنه‌ها منتقل نمی‌شن.
ولی اگه از کد ترکینگ  gtag.js برای نصب GA4 استفاده می‌کنی، می‌تونی کد رو تغییر بدی و پارامتر linker رو با decorate_forms: true همراه کنی. این ستاپ سعی می‌کنه URL‌ای که فرم بهش ردیرکت می‌شه رو "اصلاح" کنه، و cross-domain ترکینگ رو فعال کنه. جزئیات بیشتر رو تو این راهنمای گوگل پیدا کنی.

decorate form.txt
;
اگه GA4 رو از طریق Google Tag Manager نصب کرده باشی، متأسفانه گزینه decorate_forms کار نمی‌کنه. تو این حالت، باید راه‌حل کاستوم پیاده‌سازی کنی و اینجا دولوپر می‌تونه کمکت کنه. فرآیند کلی این‌جوریه:
- client_id و session_id رو از سشن یوزر بگیر. این‌ها شناسه‌های کلیدی هستن که GA4 برای ترکینگ کاربر بین دامنه‌ها ازشون استفاده می‌کنه.
-این مقادیر رو به‌عنوان پارامترهای کوئری به URL‌ای که فرم بهش ریدایرکت می‌شه اضافه کن، مثلاً websiteb.com?session_id=123&client_id=321
-تو کانتینر GTM وب‌سایت B، دو وریبل بساز که پارامترهای کوئری رو از URL بخونه.

GTM رو جوری ستاپ کن که پارامترهای client_id و session_id رو به‌عنوان فیلدهای اضافی به تگ کانفیگ گوگل پاس بده. اگه URL این پارامترهای کوئری رو داشته باشه، تگ گوگل از وریبل‌های URL برای تنظیم کوکی استفاده می‌کنه. اگه URL این پارامترها رو نداشته باشه، وریبل‌های URL به صورت undefined می‌شن و تگ گوگل اونا رو نادیده می‌گیره و کوکی‌ها رو به‌صورت عادی تنظیم می‌کنه.


مهم اینه که این روش بیشتر یه کانسپت تستی محسوب می‌شه. اگرچه کار می‌کنه، همه سناریوهای خاص رو کامل تست نکردم. مثلاً، این روش موقعیت‌هایی که کاربرها ممکنه URL (با پارامترهای client_id و session_id) رو تو شبکه‌های اجتماعی یا پلتفرم‌های دیگه به اشتراک بذارن رو در نظر نمی‌گیره، که می‌تونه باعث بشه چند کاربر یه session و client ID مشترک داشته باشن و دقت ترکینگ رو کم کنه.

برای حل این مشکل، باید با دولوپرها تعامل کنی تا یه مکانیزم اضافی برای مدیریت این موارد داشته باشی. یه گزینه اینه که توسعه‌دهنده‌ها یه timestamp به URL  اضافه کنن تا زمان ساخت URL ثبت بشه. بعد، تو GTM می‌تونی با کاستوم جاوااسکریپت چک کنی که timestamp کمتر از پنج دقیقه (یا چیزی نزدیک) باشه. اگه این‌جوری بود، تگ گوگل از اون وریبل‌ها استفاده می‌کنه. اگه نه مقادیر وریبل‌ها undefined برمی‌گردن و تگ گوگل اونا رو نادیده می‌گیره.

iFrame
حتماً متوجه شدی که مشکل اصلیمون گم شدن پارامترهای کوئری حاوی اطلاعات حیاتی برای cross-domain ترکینگ در زمان انتقال کاربر از وب‌سایت A به وب‌سایت B هست. یه راه دیگه که این می‌تونه اتفاق بیفته اینه که کلیک روی لینک منتهی به وب‌سایت B تو یه iFrame  اتفاق بیفته و شما GA4 رو تو صفحه والد/parent نصب کرده باشی.
برای حل این، باید پارامترهای ترکینگ رو از صفحه والد به iFrame بفرستی و مطمئن شی iFrame اونا رو به وب‌سایت B ارسال کنه. باید مطمئن شی محتوای iFrame و صفحه والد به‌درستی برای ارتباط بین خودشون تنظیم شده باشه.
مراحل انجام این راه حل:
-تو صفحه والد (صفحه‌ای که GA4 روش نصب کردی)، client_id (ذخیره‌شده تو کوکی _ga) و session_id (ذخیره‌شده تو کوکی _ga_XXXXXXX، که XXXXXXX آیدی اندازه‌گیریه) رو بخون.
-وقتی مقادیر client_id و session_id رو به دست آوردی، اونا رو به‌عنوان پارامترهای کوئری به URL iFrame اضافه کن، مثلاً <iframe src="website.com?session_id=123&client_id=321" />
_داخل iFrame، مطمئن شو پارامتر کوئری قابل دریافت و استفاده برای ترکینگ باشه.
برای هر لینکی که به وب‌سایت B ردیرکت می‌شه (داخل iFrame)، باید پارامترهای client_id و session_id رو از iFrame URL اضافه کنی.
تو وب‌سایت B، مشابه روشی که برای ترکینگ فرم توضیح دادم، باید پارامترهای کوئری رو از URL بخونی و به تگ گوگل پاس بدی تا GA4 بتونه cross-domain ترکینگ رو با موفقیت کامل کنه.

مژرمنت آیدی‌های متفاوت در هر دو دامنه
برای اینکه cross-domain ترکینگ تو GA4 درست کار کنه، استفاده از یه دستااستریم مشترک بین همه دامنه‌هایی که می‌خوای ترکینگ کنی ضروریه. وقتی از یه دیتااستریم واحد استفاده می‌کنی، GA4 می‌تونه داده‌های سشن کاربر مثل client_id و session_id رو بین دامنه‌ها به‌طور مداوم منتقل کنه.
این باعث می‌شه که یه کاربر به‌عنوان فرد واحد بین دامنه‌های مختلف شناسایی بشه، تداوم یه سشن رو حفظ کنه و اتریبیوشن دقیقی داشته باشه. پس، وقتی از دیتااستریم های متفاوتی استفاده کنی، GA4 سشن جدیدی رو تو هر دامنه استارت می‌زنه که به اتریبیوشن اشتباه منجر می‌شه.
برای دسترسی به تنظیمات دیتااستریم تو GA4، به این مسیر برو Admin > Data streams  و دیتااستریم مرتبط رو انتخاب کن.

مژرمنت آیدی  رو تو بخش Stream details پیدا می‌کنی. چک کن این آیدی تو اسکریپت ترکینگ همه دامنه‌هایی که می‌خوای برای cross domain ترکینگ فعال کنی هست.


در بیشتر موارد، می‌تونی مژرمنت آیدی رو تو سایتت به کمک developer tools (راست‌کلیک روی صفحه و انتخاب "Inspect") و باز کردن تب Elements چک کنی.

اینجا، کلیدهای "control-F" رو بزن تا نوار جستجو باز بشه و مژرمنت آیدی رو سرچ کن. اگه پیداش نکردی، "G-" رو سرچ کن و ببین آیدی دیگه‌ای هست یا نه.

اگه دیدی آیدی‌های مژرمنت متفاوتن، باید نصب GA4ت رو اصلاح کنی. 


 نبود کد ترکینگ تو وب‌سایت B
این کافی نیس که GA4 فقط تو وب‌سایت A نصب شده باشه؛ هر دو وب‌سایت (A و B) باید از کد ترکینگ مربوط به یه دیتا استریم  GA4 مشترک استفاده کنن تا cross domain ترکینگ درست کار کنه. پس، هر دو وب‌سایت باید تو یه پراپرتی GA4 ست شده باشن و به یه دیتااستریم لینک شده باشن.

 سیاست امنیتی محتوا (CSP) باعث بلاک شدن GA4 (یا GTM) تو وب‌سایت B میشه
سیاست امنیتی محتوا (CSP) یه ویژگی امنیتی مرورگره که به جلوگیری از حملاتی مثل تزریق داده کمک می‌کنه. این کار با محدود کردن منابعی که محتوا می‌تونه ازشون لود بشه (مثل جاوااسکریپت) انجام میشه.
فرض کن CSP تو وب‌سایت B اشتباه ست شده باشه. تو این حالت، می‌تونه دیتاهای لازم مثل اسکریپت‌های گوگل آنالیتیکس ۴ یا تک منیجر رو بلاک کنه، چون cross domain ترکینگ به قابلیت لود و اجرای این اسکریپت‌های ترکینگ وابسته‌ست.
چطور می‌تونی بفهمی این مشکل واسه تو هم برقراره؟ به تب کنسول مرورگرت برو (راست‌کلیک روی صفحه و انتخاب "Inspect") و صفحه رو رفرش کن. اگه خطایی شبیه این (یا مشابهش) پیدا کردی، CSP باعث اختلال توی  cross domain ترکینگ شده.
ولی تو این حالت، URL خطا باید google-analytics.com رو داشته باشه.
تو ۲۰۲۲، گوگل URL‌ای که به کمک اون GA4 داده‌ها رو می‌فرسته تغییر داد. قبلاً فقط www.google-analytics.com بود، حالا ممکنه region1.google-analytics.com (یا چیزی شبیه این) باشه. پس بهتره دولوپرهای سایتت CSP رو به‌روز کنن تا همه دامنه‌های حاوی google-analytics.com رو پشتیبانی کنه.
این یعنی دولوپرها باید *.google-analytics.com و *.analytics.google.com رو به دستورات "connect-src" و "img-src" تو CSP اضافه کنن (*. مهمه).
 درباره این موضوع تو مستندات گوگل درباره استفاده از Google Tag Manager با سیاست امنیتی محتوا میتونی یاد بگیری.

Consent
cross domain ترکینگ ممکنه طبق انتظار کار نکنه اگه بازدیدکننده رضایت به ترکینگ تو وب‌سایت A بده ولی تو وب‌سایت B اون رو قبول نکنه. ترجیحات consent که تو یه دامنه مشخص می‌شه، فقط وقتی به‌طور خودکار به دامنه دیگه منتقل می‌شه که تنظیمات خاصی برای به اشتراک گذاشتن این داده‌ها انجام شده باشه (و البته اگه پلتفرم مدیریت رضایت (CMP) همچین قابلیتی رو پشتیبانی کنه. چون به‌طور پیش‌فرض، consent بین دامنه‌ها منتقل نمی‌شه).
بسته به پیاده‌سازی فعلی، اگه کاربر رضایت رو تو وب‌سایت B نده، GA4 بلاک می‌شه و ترکینگ قطع می‌شه.
خیلی ریزه‌کاری و موارد خاصی هست که موقع مدیریت consent و تأثیرش روی cross domain ترکینگ باید در نظرشون بگیری، و این پوشش دادن همه سناریوهای ممکن رو سخت می‌کنه.
نتیجه کلیدی اینه که مطمئن شدن از مدیریت یکپارچه consent بین همه دامنه‌هایی که تو ستاپ ترکینگت درگیرن خیلی مهمه تا از مشکلاتی که ترکینگ رو بلاک می‌کنه جلوگیری بشه.

اسکریپت‌های مشکل ساز تو وب‌سایت
اسکریپت‌های متضاد تو یه وب‌سایت، هرچند خیلی شایع نیستن، گاهی می‌تونن توی کارکرد GA4 Linker یا حتی ویژگی‌های ترکینگ دیگه ی تگ کانفیگ گوگل تداخل درست کنن.
اگه مشکوکی یه اسکریپت ممکنه توی cross domain ترکینگ مشکل ایجاد کرده باشه، می‌تونی با developer tools مرورگرت عیب‌یابی کنی. این‌مورد رو اینجوری چک کن:
دولوپر تولز رو تو مرورگرت باز کن (راست‌کلیک و انتخاب "Inspect") و به تب Network برو.

از فیلتر استفاده کن تا لیست رو با انتخاب "JS" فقط به فایل‌های جاوااسکریپت محدود کنی.

هر اسکریپت رو یکی‌یکی بلاک کن (راست‌کلیک و انتخاب "Block request URL").

بعد از بلاک کردن هر اسکریپت، چک کن آیا ترکینگ بین-domini شروع به کار می‌کنه.
اگه تو یه مورد، بعد از بلاک کردن اسکریپت خاصی، cross domain ترکینگ کار کنه، اون اسکریپت احتمالاً مشکل‌ساز بوده. تو این حالت، با دولوپرهای وب‌سایتت مشورت کن تا ببینن می‌تونن کاری بکنن - مثلا تغییر اسکریپت طوری که ترکینگ GA4 به‌درستی کار کنه.

accept_incoming تو وب‌سایت B روی false ست شده
یه سناریوی نادر دیگه (ولی مهم) اینه که پارامتر accept_incoming تو پارامتر linker با استفاده از gtag.js تو وب‌سایت B ست شده باشه (این سناریو زمانی صادقه که GA4 تو وب‌سایتت به کمک gtag.js نصب شده باشه). پارامتر accept_incoming کنترل می‌کنه که داده‌های cross domain ترکینگ از دامنه‌های دیگه قابل دریافت باشه.
اگه accept_incoming وجود داشته باشه و روی true تنظیم شده باشه، cross domain ترکینگ طبق انتظار کار می‌کنه.
اگه پارامتر accept incoming توی کد اصلاً  نیومده باشه، اشکالی نداره چون مقدار پیش‌فرضش تو این حالت  true هست.
ولی اگه کسی accept_incoming رو تو کد gtag.js روی false تنظیم کرده باشه، cross domain ترکینگ درست کار نمی‌کنه. وقتی مقدار این پارامتر false باشه جلوی پذیرش داده‌های سشن ورودی رو می‌گیره و لینک بین دامنه‌ها رو می‌شکنه.
اگه مورد دوم برای وب‌سایتت صدق می‌کنه، از دولوپر بخواه کد رو تغییر بده و پارامتر رو روی true تنظیم کنه.
قابلیت های حریم خصوصی مرورگر و/یا ادبلاکرها
یه بخش دردسرساز از جمع‌آوری داده های تحلیلی کاربر اینه که حتی اگه همه‌چیز رو درست از سمت خودت انجام بدی، باز ممکنه به خاطر تنظیمات خاص مرورگر (مثل بلاکرهای تبلیغاتی) یا قابلیت های حریم خصوصی فعال‌شده توی مرورگر، داده جمع‌آوری نکنی.
همونطور که قبلا گفتیم cross domain ترکینگ به پارامترهای URL مثل _gl وابسته‌ست. قابلیت های حریم خصوصی مرورگر و ادبلاکرها می‌تونن با حذف یا بلاک کردن این پارامترهای مهم URL توی cross domain ترکینگ تداخل ایجاد کنن و جلوی وصل شدن درست سشن کاربر تو یه دامنه با اکشن هاش تو دامنه دیگه رو بگیرن. مثلاً، مرورگر Brave این کارو می‌کنه.
هرچند همه کاربرها تحت تأثیر این قضیه قرار نمی‌گیرن، اونایی که از ادبلاکرها یا ابزارهای حفاظت از حریم خصوصی استفاده میکنن که پارامترهای URL رو بلاک یا حذف می‌کنه میتونن ما رو با مشکلات ترکینگ روبه‌رو کنن.
متأسفانه، راه قطعی‌ای برای کامل دور زدن تأثیر این ابزارها و قابلیت ها وجود نداره.

نکات آخر
هر وقت چیزی تو جمع‌آوری داده تو گوگل آنالیتیکس ۴ اختلال درست بکنه، سعی برای فهمیدن منشأ مشکل و حلش خیلی سخت می‌شه. cross domain ترکینگ هم همینطور هست چون، همونطور که دیدی، خیلی جاها هستن که میتونن مشکل ساز بشن. یادت باشه با دولوپرها همکاری کنی چون اونا دانش عمیق تری از بکند سایتت دارن. نظرت رو بهم بگو.