حل مشکل Duplicate Events در گوگل آنالیتیکس به قلم مجتبی سادات، COO اوتیچر
اینکه هدفها دو بار در سیستم اتفاق میافتد خود آن نیاز به debug دارد که در این مقاله فرصت توضیح آن نیست (عکس بالا مشکل مربوطه را نمایش می دهد). اما مواردی که باعث شمارش دوبار یک رویداد (در عکس بالا purchase دو بار شمارش شده است) می شود به شرح زیر می باشد. فرض کنید هدف ما به این شکل تعیین شده است که url یک صفحه خاص توسط کاربر بازدید شد، آن را شمارش کند. اما در حالتهای زیر شمارش هدف بیش از چند بار شمارش می شود.
۱- اگر آدرس صفحه مورد نظر رفرش شود.
۲- اگر آدرس صفحه را کاربر کپی کند و بعدا مجدد وارد مرورگر کند.
۳- اگر کاربر ادرس صفحه را به هر دلیل در همان لحظه مجدد در آدرس بار Enter بزند.
۴- در حالت back زدن صفحه امکان دارد در سایت های SPA این اتفاق بیافتد.
برای رفع این مشکل ابتدا من دنبال تنظیمات داخل GTM بودم اما چیزی یافت نشد حتی مقالههای مختلفی را دیدم که آخرش نتیجهای در برنداشت. در CHAT-GPT من دنبال پاسخهایی بودم ببینم تنظیمات برای این موضوع وجود دارد یا نه که در ابتدا چندین پیشنهاد داد و پس از بررسی متوجه شدم این اپشنها وجود ندارد و با فیدبکهایی که به آن دادم مشخص شد چنین تنظیماتی وجود ندارد. یک نکته خیلی مهمی که در مورد استفاده از CHAT-GPT این است که راه حلها شاید اشتباه باشد و همچنان سیستم در حال اموزش و یادگیری است. اینکه سوال درست کنیم مهمترین بخش کار است. خوبی این ابزار این است که کلیه مستندات وب را مطاله کرده است و با پرسشهای مختلف می توان به نتیجه مورد نظر رسید. پیشنهادی که این ابزار هوش مصنوعی میداد برای حل این مشکل، بایستی در نهایت از راهحلهای فنّی مانند استفاده از کدهای جاوا اسکریپت و گزینش مناسب همان رویدادهایی که برای تحلیل مورد نظر هستند، استفاده کرد.
در زیر سوالی نهایی که من از CHAT-GPT پرسیدم و پاسخ کلی که داده بود را قرار دادم. البته در نظر داشته باشید کلی چت بین ما رد و بدل شده بود و خیلی پاسخها رد شده بود و کلی سناریوهای مختلف را من توضیح داده بودم. در واقع با کپی کردن این سوال من قطعا پاسخ مختلفی خواهید دریافت کرد. خیلی مهم است سناریوها را با مثال برای این سیستم هوش مصنوعی توضیح دهید حتی می توانید راه حلهایی که در بعضی سایتها موجود است را با این سیستم بررسی کنید.
برای حل این مشکل، نکته مهمی که در گامها مشخص است باید در سمت کاربر مقادیر خاص در کوکی کاربر ذخیره شود تا مشخص شود صفحه مورد نظر بازدید شده یا خیر. سپس اجرای رویداد (شمارش رویداد) را به مقداری که این کوکی در آن ذخیر شده است باید وابسته کرد. به زبان ساده یعنی اگر کوکی اعلام کرد این صفحه بازدید نشده رویداد را اجرا کن. در سناریویی که من در حال کارکردن بودم یک صفحه PaymentSuccessful وجود که بعد از پرداخت از طریق درگاه یا والت کاربری با یک QueryString منحصر به فرد به کاربر نمایش داده میشود. این QueryString شامل شماره رسید پرداخت است و داخل صفحه رسید پرداخت کاربر نمایش داده میشود و به صورت اتوماتیک ریدایرکت ندارد. پس این شماره در کل سیستم فقط یک بار تولید می شود. ایدهای که به ذهن من رسید این بود که این مقدار را داخل کوکی کاربر ذخیره کنم و پیش شرط اجرا برای رویداد قرار دهم. یعنی اگر این ادرس برای بار اول درحال نمایش است پس در کوکی وجود ندارد و ایونت اجرا میشود و سپس باید این ادرس در کوکی کاربر ذخیره شود تا اگر کاربر صفحه را رفرش کرد یا یکی از موارد فوق که توضیح داده شد را انجام داد، مجدد ایونت اجرا نشود.
گام اول: باید یک تگ در GTM تعریف شود با نوع Custom HTML که داخل آن کدهای جاوا اسکریپت قرار داد. عملیاتی که باید انجام شود خواندن url و ذخیر آن سمت کاربر است. یک موضوعی که من در نتایج گوگل به آن رسیده بودم دیتای کاربرها را به جای کوکی در لوکال سشن (localsession) ذخیره کرده بود. من تفاوتش را با کوکی از CHAT-GPT پرسیدم پیشنهاد این بود به جای کوکی و لوکال سشن از لوکال استوریج استفاده کنم. تفاوت آن به شرح زیر است (منبع CHAT-GPT) :
LocalStorage ،sessionStorage و cookies سه مکانیزم متفاوت برای ذخیره اطلاعات در سمت کلاینت در برنامههای وب هستند، هر کدام به روش متفاوتی کار میکنند.
LocalStorage اطلاعات را بدون تاریخ انقضا ذخیره میکند. برنامههای تحت وب در یک منبع مشترک میتوانند به آن دسترسی داشته باشند. اطلاعات حین بسته شدن مرورگر یا دوباره شروع شدن صفحه نیز باقی میماند. این مکانیزم 5-10 مگابایت فضای ذخیرهسازی فراهم میکند، بسته به نوع مرورگری که استفاده میشود.
sessionStorage شبیه به LocalStorage است، اما اطلاعات در آن یکتا برای یک نشست مرورگری است. این بدان معنی است که در صورت بستن پنجره یا تب، اطلاعات از بین میروند. این مکانیزم تقریباً همان حجم فضای ذخیره سازی LocalStorage را دارد.
Cookies اطلاعاتی را که دارای تاریخ انقضا هستند ذخیره میکنند و میتواند به وسیله سمت سرور یا اسکریپتهای سمت کلاینت به آن دسترسی داشته باشند. میتوانند برای مدیریت نشست، ترجیحات کاربر و پیگیری استفاده شوند. حداکثر طول آنها 4 کیلوبایت است.
کدهای زیر داخل تگ Custom HTML در GTM را کافی است قرار دهیم و سپس یک شرط به آن اضافه کنیم که فقط روی صفحه هدف ما load شود. در مثال اینجا همان PaymentSuccessful مد نظر است. با کد زیر هر بار صفحه که پرداخت باز می شود ادرس صفحه که شمال QueryString نیز می باشد را داخل LocalStorage چک میکند اگر وجود نداشت به آن اضافه می کند.
گام دوم: در این مرحله باید یک متغیر از نوع Custom JavaScript تعریف کرد که در صفحه هدف اگر زمان باز شدن بررسی کند اگر این صفحه برای بار اول سمت کاربر در حال باز شدن می باشد آن وقت مقدار false در غیر صورت مقدار true برگرداند. به زبان ساده این متغیر باعث می شود رویداد فقط زمانی اجرا شود که صفحه هدف قبلا ویزیت نشده باشد. طراحی این متغییر از طریق CHAT-GPT به شرح زیر است.
گام سوم: در مرحله آخر کافی است یک تگ برای فراخوانی رویداد تعریف کرد این رویداد میتواند به GA3 یا GA4 بر اساس نیاز شما ارسال اطلاعات کند. فقط در بخش Triggering زمانی که روی pageview تنظیمات انجام میدهید هم باید صفحه هدف به صورت تارگت قرار گیرد و شرط دیگری که باید چک شود متغیری است که در مرحله دوم تعریف شد. برای درک بهتر عکس زیر را از GTM قرار دادم.
در عکس بالا Page Path برای صفحه هدف paymentSuccess تنظیم شده است یعنی فقط روی همین صفحه رویداد فراخوانی میشود و شرط دوم Payment Visited همان متغییر تعریف شده در مرحله دوم میباشد. در زمانی که این مقدار false باشد اجازه فرخوانی رویداد را میدهد.
خلاصه
این مقاله برای کسانی است که تخصص کافی روی GTM دارند و قبلا دانش تعریف رویداد روی این ابزار را کسب کردهاند. از CHAT-GPT برای تعریف کدهای مورد نظر برای ذخیره سازی url صفحات سمت کاربر و بازخوانی آن استفاده شده است. از این جهت نیاز به داشتن برنامه نویس یا درخواست به تیم فنی نخواهیم داشت. کنترل کامل سمت تیم مارکتینگ میباشد با این مدل می توان کارهای خیلی بیشتری انجام داد. مثلا می توان userid هر کاربر به سمت سرور ارسال کرد و داخل دیتابیس ذخیر کرد. یک همگام سازی می توان شکل داد آن وقت با گزارش روی دیتابیش می توان به دقیق ترین شکل ممکن کمپین های مارکتینگ را آنالیز کرد.
سلام
با تاخیر فراوان بله شناسایی میشه دلیلش هم اینه اون صفحه پیمنت هر بار که نمایش میده دارای پرامتر منحصر به فرد هست مثل شماره فاکتور. برای همین منظور هر خرید فقط فقط یک بار شمارش میشه
خیلی ممنونم بابت این مقاله کاربردی.
سوالم این هست که اگر از LocalStorage استفاده کنید و دیتا رو نگهداره. اگر کاربر چند روز بعد باز بیاد و خرید کنه، پیمنت براش شمرده میشه یا نه؟