توی این سناریو ما با دو حالت مجزا مواجه هستیم:

حالت 1: اگه لینکای وبسایتتون حاوی پارامتر # یا همون Hashmark هست. 

فکر کن داری یه کمپین تبلیغاتی راه می‌ندازی که یه عالمه آدم رو می‌کشونه به یه صفحه خاص، مثلاً landingpage.com. حالا وقتی بازدیدکننده می‌ره روی دکمه اصلی، مثلاً «تخفیفتو بگیر»، هدایت می‌شه به یه صفحه دیگه، مثلاً 2ndpage.com، که اونجا باید یه کار نهایی رو انجام بده، مثل نصب اپلیکیشن، پر کردن یه فرم، یا ثبت‌نام.

وقتی این کار تموم می‌شه، یه رویداد تو گوگل آنالیتیکس ثبت می‌شه. ولی مشکل اینجاست که وقتی می‌ری گزارش‌های گوگل آنالیتیکستو چک کنی، می‌بینی همه کانورژن‌ها به landingpage.com نسبت داده شدن. از نظر فنی این درسته، چون همه بازدیدکننده‌ها از landingpage.com به 2ndpage.com اومدن، ولی تو دوست داری بدونی منبع اصلی که این بازدیدکننده رو آورده کجا بوده، نه؟

تو این پست وبلاگ، بهت نشون می‌دم چطور پارامترهای UTM رو از صفحه اولیه (landingpage.com) به صفحه بعدی (2ndpage.com) منتقل کنی، اگه امکان ردیابی بین‌دامنه‌ای (cross-domain tracking) وجود نداشته باشه.

نکته: اسکریپت اولیه فقط برای یه دامنه کار می‌کرد. آخر این پست یه اسکریپت دیگه هم اضافه کردم که یه لیست از دامنه‌ها رو چک می‌کنه. اگه می‌خوای پارامترهای UTM رو به somedomain1.com، somedomain2.com و somedomain3.com منتقل کنی، از اسکریپتی که آخر پست گذاشتم استفاده کن.

راه‌حل – نمای کلی

یکی از راه‌حل‌ها اینه که پارامترهای UTM رو از domain.com منتقل کنی و به‌صورت خودکار به همه لینک‌هایی که کاربر رو به appstore.com/domain هدایت می‌کنن اضافه کنی. این کار رو با گوگل تگ منیجر و یه اسکریپت سفارشی انجام می‌دیم.

utm-script older version.txt

وقتی بازدیدکننده وارد domain.com می‌شه و آدرس صفحه شامل utm_medium، utm_source و utm_campaign باشه، این اسکریپت اجرا می‌شه. اسکریپت کل صفحه رو اسکن می‌کنه و دنبال لینک‌هایی می‌گرده که شامل دامنه لندینگ پیج، یعنی domain.com، باشن.
اگه اسکریپت همچین لینکی پیدا کنه، این کارا رو انجام می‌ده:
1. هر سه پارامتر UTM رو از نوار آدرس مرورگر می‌گیره.
2. این پارامترهای UTM رو به لینکی که پیدا کرده (یعنی شامل appstore.com) اضافه می‌کنه.

پس به جای appstore.com/domain، همه لینک‌های تو domain.com خودکار به این شکل تغییر می‌کنن:  
appstore.com/domain?utm_medium=referral&utm_source=promo&utm_campaign=blackfriday2017  
حالا مسیر جدید سفر بازدیدکننده این‌جوریه:
Updated Visitor Journey

پیاده‌سازی تو گوگل تگ منیجر (GTM)
اول از همه، باید سه متغیر URL بسازیم که مقادیر سه پارامتر UTM، یعنی utm_medium، utm_source و utm_campaign رو بگیرن. اینا مهم‌ان چون تو اسکریپت ;کاستوم ازشون استفاده می‌کنیم.
utm campaign source and medium
**مهم**: تو گوگل تگ منیجر، باید متغیرها رو دقیقاً همون‌جوری که تو اسکریپت نام‌گذاری شدن (حساس به حروف بزرگ و کوچیک!) نام‌گذاری کنی:  
URL – utm_medium، URL – utm_source، URL – utm_campaign.

مرحله بعدی، ساختن تریگره. باید اسکریپت کاستوم فقط وقتی اجرا بشه که هر سه متغیر UTM یه چیزی توشون باشه و undefined نباشن. علاوه بر این، نیاز داریم DOM کامل لود شده باشه تا بتونیم تغییراتی اعمال کنیم.
برای همین یه تریگر از نوع Pageview با این تنظیمات می‌سازیم:
DOM Ready Trigger - URL contains UTMs
آخرین مرحله، ساخت یه تگ کاستوم HTML با استفاده از اسکریپتی که بالاتر گذاشته بودم.واسه راحتی شما این پایین هم میزارمش.

utm-script older version.txt
Inherit UTMs - Custom HTML tag

**نکته مهم**: وقتی مقدار utmInheritingDomain رو عوض می‌کنی، نباید //:https یا هر چیزی که بعد از دامنه میاد رو وارد کنی. مثال‌های درست:
- appstore.com
- www.mywebsite.com
مثال‌های غلط:
- https://appstore.com
- www.mywebsite.com/pages/contact

ستاپ رو تست کنیم
همه تغییرات رو ذخیره کن، حالت Preview و Debug رو توی GTM فعال کن. حالا برو به صفحه‌ای که داری روش کار می‌کنی. دو تا موقعیت رو باید تست کنیم:
1. مطمئن شو که هر سه پارامتر UTM تو آدرس صفحه هستن. تو این مثال، آدرس صفحه اینه:  
www.domain.com?utm_medium=referral&utm_source=promo&utm_campaign=blackfriday2017  
2. روی لینکی که شامل دامنه‌ایه که تو اسکریپت کاستوم تعریف کردی  (www.appstore.com/domain) کلیک کن.  
بعد از اینکه هدایت شدی، آدرس صفحه (appstore.com/domain) باید اون سه پارامتر UTM رو هم داشته باشه. نتیجه نهایی تو نوار آدرس مرورگر باید این باشه:  
www.appstore.com/domain?utm_medium=referral&utm_source=promo&utm_campaign=blackfriday2017  
Appstore URL in browser address bar

یه موقعیت دیگه هم تست کن: وقتی هیچ UTMی تو آدرس صفحه نیست. تو این حالت، هیچ UTMی هم نباید به لینک‌های appstore.com اضافه بشه.
یه مورد سوم هم هست: حداقل چند تا لینک اکسترنال دیگه (که به appstore.com ربطی ندارن) رو چک کن. اینا هیچ‌وقت نباید پارامتر UTM داشته باشن.

اگه بخوای همزمان چند تا دامنه رو اصلاح کنی چی؟
راه‌حلی که بالا توضیح دادم فقط برای وقتیه که بخوای همه لینک‌های یه دامنه خاص رو تغییر بدی. ولی اگه بیشتر از یه دامنه داشته باشی چی؟ مثلاً externaldomain1.com و externaldomain2.com.

تو این موقعیت، باید از یه نسخه دیگه استفاده کنی که یه لیست از دامنه‌ها رو چک می‌کنه.

utm-multiple domain.txt

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

اگه بخوای فقط یه سری زیردامنه‌های خاص از دامنه‌های اکسترنال رو هدف بگیری، فقط همون زیردامنه‌های خاص رو وارد کن. وگرنه، اگه فقط externaldomain1.com رو وارد کنی، این اسکریپت روی همه زیردامنه‌های externaldomain1.com، مثل www.externaldomain1.com، app.externaldomain1.com و غیره اعمال میشه.

اگه پارامترهای UTM توشون علامت «+» داشته باشن چی؟
بعضی وقتا ممکنه UTMها علامت «+» داشته باشن، مثلاً:

utm_campaign=Prospecting+-+Facebook+Image+2

متأسفانه چیزی که متوجه شدم اینه که بعضی مرورگرها (حداقل کروم) به‌صورت خودکار علامت «+» رو با %20 (که معادل هش شده ی فضای خالیه) جایگزین می‌کنن. به عبارت دیگه، کروم اینو:

utm_campaign=Prospecting+-+Facebook+Image+2

تبدیل می‌کنه به این:

utm_campaign=Prospecting%20-%20Facebook%20Image%202

طبیعتاً راه‌حلی که تو این پست وبلاگ توضیح دادم، مقادیر رو با %20 می‌گیره و لینک‌های خاصی رو بر اساس اون تغییر می‌ده. متأسفانه راهی برای جلوگیری از این مشکل پیدا نکردم. پس بهترین توصیه‌ام فعلاً اینه که تو تگ‌های UTM از علامت «+» استفاده نکنی.

حالت دوم: دامنه های فاقد هشمارک (#)

در ادامه این پست وبلاگ، یه تکنیک خاص با استفاده از گوگل تگ منیجر بهت نشون می‌دم که چطور پارامترهای UTM (یا هر پارامتر URL دیگه‌ای) رو از صفحه اولیه (landingpage.com) به‌صورت خودکار پیدا کنی و به لینک‌های خروجی که به صفحه بعدی (2ndpage.com) اشاره دارن اضافه کنی. این روش وقتی مفیده که cross_domain Tracking امکان‌پذیر نباشه.

یه بار دیگه بیا مشکل رو بررسی کنیم:
فرض کن داری یه محصول رو تبلیغ می‌کنی که تو اپ استور (مثلاً اپ استور شاپیفای) موجوده. اسم محصول رو می‌ذاریم Lorem Appsum. صفحه اپ استور این محصول به‌تنهایی نمی‌تونه همه مزایا و ویژگی‌های باحالشو نشون بده. برای همین تصمیم می‌گیری یه لندینگ پیج جداگونه بسازی و ترافیک رو به سمت اون هدایت کنی. همه لینک‌های ورودی (مثل لینک‌هایی که تو وب‌سایت‌ها، فروم‌ها و جاهای دیگه هستن) که به این لندینگ پیج می‌رسن رو هم با پارامترهای UTM علامت‌گذاری کردی.
این لندینگ پیج جدید پر از نکات کلیدی فروش، توضیحات ویژگی‌ها، یه ویدیو و یه دکمه بزرگ «الان اپ رو بگیر» (CTA) هست. عالیه! بازدیدکننده میاد به صفحه اولیه، روی دکمه CTA کلیک می‌کنه، می‌ره به صفحه اپ استور و اپ رو نصب می‌کنه. حالا مسیر سفر بازدیدکننده این‌جوریه:

Visitor journey

توجه کن که پارامترهای UTM بعد از اینکه بازدیدکننده روی لینک appstore.com تو صفحه loremappsum.com کلیک می‌کنه،از دست میرن.

مشکل اینجاست که گوگل آنالیتیکس این کانورژن رو به loremappsum.com نسبت می‌ده، در حالی که اگه بتونی مقادیر اولیه UTM رو ببینی، خیلی بهتره.

حالا بریم یه سری نکات کلی در مورد راه حل این مشکل بگیم:

با این نسخه:
- می‌تونی هر نوع پارامتر کوئری (نه فقط UTMها) رو منتقل کنی.
- نیازی به ساخت URL variable نداری.
- می‌تونی لینک‌های چند دامنه رو تغییر بدی.
- پارامترهای کوئری که می‌خوای منتقل کنی اختیاری‌ان (یعنی اگه مثلاً utm_campaign تو URL نباشه، راه‌حل همچنان کار می‌کنه).
یکی از راه‌حل‌ها اینه که پارامترهای UTM رو از loremappsum.com منتقل کنی و به‌صورت خودکار به همه لینک‌هایی که کاربر رو به appstore.com/loremappsum هدایت می‌کنن اضافه کنی. این کار رو با گوگل تگ منیجر و یه اسکریپت سفارشی انجام می‌دیم.
**مهم**: اگه دیدی اسکریپت تو یه موقعیت خاص کار نمی‌کنه، بهم خبر بده تا ببینم چیکار می‌تونم بکنم که درستش کنم.

utm-transfer-links without hashmark.txt

وقتی بازدیدکننده وارد loremappsum.com می‌شه و آدرس صفحه شامل utm_medium، utm_source یا هر پارامتر URL دیگه‌ای (که برات مهمه) باشه، تگ اجرا می‌شه. این تگ کل صفحه رو اسکن می‌کنه و دنبال لینک‌هایی می‌گرده که شامل دامنه(های) صفحه مقصذ (تو این مثال appstore.com) باشن.

اگه اسکریپت همچین لینکی پیدا کنه، این کارا رو انجام می‌ده:
1. پارامترهای URL (مثل UTMها) رو از نوار آدرس مرورگر می‌گیره.
2. این پارامترها رو به لینکی که پیدا کرده (یعنی شامل appstore.com) اضافه می‌کنه.

پس به جای appstore.com/loremappsum، همه لینک‌های تو loremappsum.com خودکار به این شکل تغییر می‌کنن:  
appstore.com/loremappsum?utm_medium=referral&utm_source=promo&utm_campaign=blackfriday2017  
حالا مسیر جدید سفر بازدیدکننده این‌جوریه:
Updated Visitor Journey

### این راه‌حل همه موارد رو ۱۰۰٪ پوشش نمی‌ده
تو بعضی موقعیت‌ها این راه‌حل درست کار نمی‌کنه:
- اگه URLهایی که می‌خوای تغییرشون بدی شامل # باشن، سعی کن از راه حل اول این بلاگ پست  استفاده کنی.
- اگه URLهایی که می‌خوای تغییر بدی از قبل شامل پارامترهای کوئری (یا همون پارامترهای URL) باشن، این پارامترها جایگزین نمی‌شن. اسکریپت اونا رو به URL اضافه می‌کنه (در نتیجه، ممکنه پارامترهای تکراری تو URL داشته باشی).

اجرای راه حل در GTM

تو گوگل تگ منیجر، یه تگ کاستوم HTML بساز و کد جاوااسکریپتی که تو فصل قبلی دادم رو توش کپی کن.
utm-transfer-links without hashmark.txt


حالا باید یه سری تنظیمات انجام بدیم.

ویرایش لیست دامنه‌ها
تو خط سوم، یه آرایه به اسم `domainsToDecorate` می‌بینی:
اینجا باید دامنه(های) لندینگ پیج(های) نهایی رو وارد کنی. اگه بازدیدکننده وارد یه لندینگ پیج میانی بشه، اسکریپت دنبال لینک‌هایی می‌گرده که شامل دامنه(های) توی آرایه `domainsToDecorate` باشن.
به عبارت دیگه، اگه مسیر سفر بازدیدکننده این باشه: 

یه وب‌سایت < صفحه محصول<  appstore.com

تو باید «appstore.com» رو تو آرایه `domainsToDecorate` وارد کنی.

اگه بخوای فقط URLهای یه دامنه رو اصلاح کنی، می‌تونی فقط یه دامنه رو توی این اسکریپت نگه داری. اگه بخوای ۴ تا دامنه اضافه کنی، اونم ممکنه. فقط حواست باشه که هیچ اشتباه تایپی، کاما یا علامت نقل قول حذف شده ای نداشته باشی.

اگه بخوای دقیق‌تر عمل کنی و فقط بعضی لینک‌ها رو تغییر بدی، می‌تونی اینکار رو هم کنی. به جای appstore.com، می‌تونی مثلاً appstore.com/your-app رو وارد کنی.

یه مثال با یه دامنه رو پایین آوردم (که باید عوضش کنی):
اضافه کردن پارامترهای URL که می‌خوای منتقل بشن:

بعدش، تو باید لیست پارامترهای URL که می‌خوای از آدرس صفحه(page URL) بگیری رو ادیت کنی تا بتونی اونها رو به لینک‌های خروجی خاصی منتقل کنی.

مثلاً اگه آدرس صفحه (جایی که بازدیدکننده الان توش هست) این باشه: https://www.loremappsum.com/?utm_medium…..، اون پارامترها (مثل utm_medium) به همه URLهای appstore.com اضافه می‌شن، مثلاً: https://appstore.com/loremappsum/?utm_medium… 
نکته باحال آپدیت جدید این راه‌حل اینه که:
- لازم نیست برای هر پارامتر یه GTM Variable بسازی.
- می‌تونی هر پارامتر URL (یا همون کوئری پارامتر) رو منتقل کنی، این فقط شامل UTMها نمیشه.
- پارامترهایی که تو آرایه `queryParams` وارد کردی اختیاری‌ هستن. اگه آدرس صفحه مثلاً utm_campaign نداشته باشه، اسکریپت بازم درست کار می‌کنه.
- UTMها می‌تونن علامت «+» هم داشته باشن و درست منتقل می‌شن، بدون اینکه به %2B تبدیل بشن.

این هم یه مثال از ادیت تنظیمات:

تگ رو ذخیره کن. حالا وقت اصلاح تریگره.

تریگر
نمی‌خوای این تگ HTML سفارشی رو تو همهی صفحات اجرا کنی. در عوض، بهتره فقط وقتی تریگر باید فایر بشه که URL شامل حداقل یکی از پارامترهای کوئری که می‌خوای منتقل کنی باشه . بیایم با همون مثال ادامه بدیم که این پارامترهای کوئری رو تو تگ HTML سفارشی وارد کردیم:
پس اگه هر کدوم از این پارامترها تو URL باشه، تگ کاستوم HTML سفارشی باید اجرا بشه. هر پارامتر تو URL باید یه علامت «=» هم داشته باشه، برای همین شرط تریگر باید این‌جوری باشه:
- نوع تریگر: DOM ready
- فایر شدن تریگر در بعضی رویدادهای DOM Ready
- Page URL matches RegEx (ignore case) 

حالا ولیوی رجکس رو توی این فایل میارم که درست کپی بشه

utm-example.txt



کاری که کردم اینه که بعد از هر پارامتر یه «=» گذاشتم و بعدشون رو با یه پایپ ( | ) که تو عبارات منظم (RegEx) یعنی «یا» از هم جدا کردم.
این تریگر رو ذخیره کن و به تگ کاستوم HTML وصل کن.

وقت تست رسیده
همه تغییرات رو ذخیره کن و حالت Preview و Debug رو فعال کن. حالا برو به صفحه‌ای که داری روش کار می‌کنی. دو تا حالت رو باید تست کنیم:

1. مطمئن شو که حداقل یکی از پارامترهای کوئری (که می‌خوای منتقل کنی) تو آدرس صفحه باشه. مثلا اگه آدرس صفحه اینه:  
`www.loremappsum.com?utm_medium=referral&utm_source=promo&utm_campaign=blackfriday2017`
2. روی لینکی که شامل دامنه‌ تعریف شده توی کاستوم اسکریپت کلیک کن (اینجا www.appstore.com/loremappsum) .  
بعد از اینکه هدایت شدی، آدرس صفحه (appstore.com/loremappsum) باید اون سه پارامتر UTM رو هم داشته باشه. نتیجه نهایی تو نوار آدرس مرورگر باید این باشه:  
Appstore URL in browser address bar

توی حالت دوم: هیچ UTM یا پارامتر دیگه‌ای تو آدرس صفحه نباید باشه. تو این حالت، هیچ‌چیزی نباید به لینک‌های appstore.com اضافه بشه.
یه حالت سوم هم هست: حداقل چند تا لینک اکسترنال دیگه (که به appstore.com ربطی ندارن) رو چک کن. اینا هیچ‌وقت نباید پارامتر UTM رو بگیرن.

حرف آخر:

این راهنما یه پلن B هستش اگه به هر دلیلی نتونی Cross-domain tracking رو پیاده‌سازی کنی.
توی این حالت به‌طور پیش‌فرض، همه داده‌های مربوط به سورس ترافیک (attribution data) رو از دست می‌دی و گوگل آنالیتیکس لندینگ پیج میانی‌تو به‌عنوان referral نشون می‌ده.
با اسکریپتی که به اشتراک گذاشتم، می‌تونی پارامترهای UTM صفحه لندینگ اولیه رو دوباره استفاده کنی و لینک‌های خاصی رو باهاشون تغییر بدی.
ولی یادت باشه که رفتن از صفحه میانی به لندینگ نهایی یه سشن جدید شروع می‌کنه (و تو گزارش‌های گوگل آنالیتیکس، یه کاربر همچنان به‌عنوان دو کاربر مختلف دیده می‌شه).
موقعیتی که توضیح دادم خیلی رایج نیست، ولی هر از گاهی پیش می‌اد.