בעקבות הדוגמא שהראיתי בהרצאה שלי בכנס All Things DATA האחרון, ובעקבות בקשות לשיתוף הסקריפט, החלטתי לכתוב על זה פוסט.
איך לשמור את מקור התנועה הראשון של הגולש בעזרת גוגל אנליטיקס וגוגל תג מנג’ר
כמו שאתם בטח יודעים, כאשר גולש מבצע המרה באתר גוגל אנליטיקס נותן את הקרדיט למקור התנועה האחרון שהביא את אותו גולש.
לדוגמא, גולש שהגיע מאדוורדס ולא המיר, נכנס שוב מפייסבוק ולא המיר, נכנס שוב מניוזלטר ולא המיר ואז נכנס שוב מתוצאה אורגנית והמיר – הקרדיט ילך ל-google / organic כיוון שהוא היה האחרון שהביא את הגולש.
האם זה פייר? לא נכנס לזה כרגע (תקראו קצת על attribution בגוגל).
בכל אופן יש הרבה עסקים שרוצים לדעת את ה-first lead source שלהם, כלומר רוצים לדעת מי היה מקור התנועה שהכניס את הגולש לפאנל, גם אם הוא לא היה המקור האחרון ש”סגר” את ההמרה.
זה נפוץ בעיקר בעולמות בהם הגולש משאיר קודם ליד ורק אחרי כמה זמן מבצע את התשלום (מישהו אמר פורקס?), ומכיוון שיכולים לעבור הרבה שלבים מהליד עד התשלום, החברה רוצה למדוד תהליך נקי ומעדיפה להתייחס למקור התנועה הראשון שהביא את הליד.
הפתרון – Custom Dimension בשילוב localStorage ו-Google Tag Manager
נשמע מסובך? אז זהו שממש לא.
המרשם שלנו יראה כך:
1. בכל פעם שהגולש נכנס לאתר אנחנו נבחן האם הוא גולש חוזר או גולש חדש.
1.1. במידה והוא גולש חוזר (כלומר יש לנו מידע על ה-First Source שלו) – ניתן לו להמשיך לגלוש כרגיל.
1.2. במידה וזיהינו שהוא גולש חדש (כלומר אין לנו מידע על ה-First Source שלו) – נבצע מספר בדיקות שיספקו לנו את מקור התנועה ממנו הוא הגיע.
2. לאחר שקיבלנו את מקור התנועה, נשמור אותו ב-local storage שזה בעצם משהו שדומה מאוד לקוקי ומאפשר לנו לשמור ערכים לשימוש חוזר בעתיד.
3. כאשר הגולש משאיר ליד (או אפילו מבצע את ה”המרה הגדולה” = הפקדה של כסף) – נשלוף את הערך ששמרנו ב-local storage ונשלח אותו בתור custom dimension לגוגל אנליטיקס.
שלב ראשון – יצירת custom dimension
קאסטום דיימנשן זה בעצם dimension משלנו שלא קיים בדוחות הרגילים בגוגל אנליטיקס.
מי שרוצה יכול להרחיב על הנושא כאן או כאן, אבל בקצרה אציין שדימנשן זה country למשל, והערכים של הדימנשן הזה הם israel, united states וכו’ וכו’.
כאשר נרצה לראות כמה גולשים הגיעו מכל מדינה ומה היה אחוז ההמרה של כל מדינה – נשים את הדימנשן Country לצד מטריקות כמו Sessions ו-Goal Conversion Rate.
גם במקרה שלנו אנחנו רוצים לדעת כמה גולשים הגיעו כאשר מקור התנועה הראשון שלהם היה XYZ, ומה היה אחוז ההמרה של כל מקור תנועה ראשון שכזה.
לצורך כך ניצור custom dimension חדש:
ונראה מה ה-index שלו, כלומר לאיזה slot עלינו לשלוח את הערכים של ה-first source שיתקבל בהמשך.
שלב שני – זיהוי מקור התנועה ושמירתו ב-local storage
כעת נעבור לתג מנג’ר, נוסיף תג מסוג Custom HTML ונדביק בו את הקוד הבא (עם טריגר של All Pages כמובן):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <script> if (localStorage.getItem('firstSource') ==null) { var firstSource; if ({{Page URL}}.indexOf("gclid") > -1) { firstSource = "AdWords" } else if ({{utm_source param}} != undefined) { firstSource = "{{utm_source param}} / {{utm_medium param}}" } else if ( ({{Referrer}}.indexOf('google') > -1) || ({{Referrer}}.indexOf('bing') > -1)){ var Referrer = {{Referrer}}.split('.co')[0].split('www.')[1]; firstSource = Referrer + " / organic" } else if ( {{Referrer}} !== '') { firstSource = {{Referrer}} } else if ({{Referrer}} == '') { firstSource = "direct"; } localStorage.setItem('firstSource',firstSource); dataLayer.push({'event':'setTheFirstSource','firstSource':firstSource}); } </script> |
כמו כן ניצור 2 variable נוספים שיקלטו את הפרמטרים utm_source ו/או utm_medium מתוך ה-URL:
הסקריפט שכתבתי למעלה מדמה את הפעולות שגוגל אנליטיקס בעצמו עושה כדי לזהות את מקור התנועה של הגולש:
בדיקה ראשונה: האם ה-URL מכיל את הפרמטר gclid – אם כן הגולש הגיע מאדוורדס, אחרת תמשיך לבדיקה הבאה,
בדיקה שניה: האם ה-URL מכיל פרמטר של utm_source? אם כן – מקור התנועה הוא source / medium (פרמטר אחד או יותר, על פי מה ששורשר. במקרה שלי לא עשיתי בדיקה אם utm_medium קיים כי הנחתי שאם אני שולח utm_source כנראה שאני שולח גם utm_medium), אם לא מכיל – תעבור לבדיקה הבאה,
בדיקה שלישית: האם האתר המפנה מכיל דומיין שמזוהה בתור מנוע חיפוש (אני שמתי רק google או bing) – אם כן, זה אורגני, אם לא תמשיך לבדיקה הבאה,
בדיקה רביעית: האם יש referrer? אם כן – מקור התנועה הוא ה-Referrer (מדובר ב-variable בילטאין בתג מנג’ר), אחרת תמשיך לבדיקה הבאה,
בדיקה חמישית: האם Referrer הוא ריק? אם כן – מקור התנועה הוא דיירקט.
[למתקדמים]
ליתר בטחון הוספתי תנאי נוסף על דרך החיוב שבודק האם Referrer ריק, כי לא רציתי להתבסס על דרך השלילה (אם כל התנאים שלמעלה לא התקיימו), אבל אפשר לעשות שם else רגיל שקובע את מקור התנועה בתור דיירקט גם בלי בדיקה נוספת.
[/למתקדמים]
לבסוף הסקריפט שומר את הפרמטר firstSource בלוקאל סטורג’, ושולח איוונט כלשהוא לדטאלייר למקרה שתרצו לעשות עם זה משהו.
שלב שלישי: שליחת המידע לגוגל אנליטיקס
כעת נלך לתג ה-analytics event שלנו שנורה כאשר גולש מבצע את ההמרה (שליחת ליד במקרה שלנו), ונגיד לו לשלוח custom dimension לסלוט מספר 6 (שם נמצא ה-CD שלנו אם אתם זוכרים מהשלב הראשון).
הערך של ה-custom dimension יהיה variable מסוג Custom JS, שיקח את הערך שמוטמע בלוקאל סטורג’ עבור firstSource.
סיכום
בואו נראה שזה עובד –
נחפש “ליקספיקס” בגוגל, נקליק על התוצאה האורגנית ונראה שהסקריפט שלנו אכן שמר את מקור התנועה בלוקאל סטורג’:
עכשיו נשלח ליד ונבדוק אם הוא שולח את הערך בתור custom dimension בסלוט מספר 6 –
הי שוקי
תודה רבה
שי
שלום שוקי,
סקריפט יפה רק שיש כאן הנחה סמויה (ושגויה) והיא שיש למשתמש דיווס יחיד…
כאשר יש למשתמש גישה משולחני וטל נייד, אז כל דיווס חדש דורס את נתוני היוזר ושומר בלוקל סטורג’ ואז שומר את זה באנליטיקס. בכל ביקור חוזר בכל דיווס הם נלחמים על “הפירסט” לפי ההגדרה הלוקלית כי אין מנגנון סינקרון.
התוצאה היא שלא ניתן להיסתמך על “פירסט”.
במידה ויש לנו מזזה ייחודי (או אינטגרציה עם שרות שמספק יכול כזו) ניתן לשמור את ה”הפירסט” לפי הש בפיירבייס (remote storage) ולשלוף אותו כל ססשיון ולשמרו מקומית.
עם זאת הרי שיש באנליטיקס כלי אטטריביון, ניתוח אסיסטים, מולטי צ’נל פנל ויוזר אקסלורר ועוד שנותנים מענה לבעיה המקורית שהוצגה בתחילת המאמר ללא צורך בפיתוח.
היי אורן,
אתה צודק אבל רוב האתרים לא משתמשים בuser id בכלל, ובוודאי שלא תומכים באינטגרציה עם שירותים חיצוניים שיכולים לספק את המידע הזה.
לפי זה אי אפשר להסתמך על שום דבר כמעט בגוגל אנליטיקס, ובכל זאת עובדים איתו, למרות המגבלות.
בנוסף, גם אם עושים אינטגרציה זה יתפוס רק את מי שהזדהה כבר בסשן הראשון (מה שהרבה פעמים לא קורה).
מנסיון בעבודה עם first source הוא יכול לתת תובנות משמעותיות, גם אם לא מדוייקות ב-100%
הי
ב ATD הקודמים היו מספר עצות להתכונן לקרוס-דיווס.
אגב לגוגל יש יכולות קרוס דיווס היסתברותית דרך double-click והם שיחררו עדכון בנושא לאחרונה בכל כלי הפרסום. לכן שהטעון בתגובה לא מחזיק מיים. יותר מזאת גוגל מאפשרים להאריך את שגיאה של last-click מזה מספר שנים ע”י בדיקה של מודלים כגון first-click.
בקיצור בלי התייחסות להשפע של ריבוי דיווסים השיטה הנ”ל פגומה מהיסוד. בהעדר יכולת להעריך את השגיאה הסיטמית הזו – רוב הלקוחות עימם אני עובד במהרה יקלטו כי יש משהוא לא “כשר”. אני עדיף להתמודד עם אתגרי רישום וקידוד אזור אישי מאשר חוסר אמון בנתונים שאני מציג.
הי שוקי,
תודה על המאמר.
נראה לי שניתן להוריד את כל השורות שמכילות כתיבה לקונסול.
שמוליק
Attribution model שמייחס את ההמרה במודל “חצי חצי” הרבה יותר פשוט ויחסוך את הצורך בסקריפט…
היי שוקי,
תודה על המידע!
יש לי רק שאלה – למה לשמור ב-LocalStorage, לא עדיף לשמור ב-cookie ולהגדיר לו גם פג תוקף שמשמעותו תהיה חלון זמן להמרה?
פשוט יותר נוח לי לשמור ככה מידע, אבל זה באמת רעיון.
בכל מקרה אפשר להוסיף חלון זמן גם בלוקאל סטורג’ עם עוד קצת קוד.
בשלב 3 איבדת אותי:
“כעת נלך לתג ה-analytics event שלנו שנורה כאשר גולש מבצע את ההמרה”
לא בדיוק הבנתי על מה אתה מדבר ואיך אני מגיע לשם…
הייֿ,
גם אני נאבדתי בשלב הזה (כאחד שמתעסק עם גוגל טאג לראשונה)
תוכל להסביר איפה זה נמצא?
היי, גם אני איבדתי את הדרך בשלב הזה, תוכל להסביר איפה זה נמצא?
תתעלם, הבנתי (אבל אולי שווה להוסיף פה צילומסך לטובת אלה שלא מבינים)
עשיתי הכל במדויק. כשאני עושה submit ב- tag manager זה כותב לי
Invalid Template – 1st source finder – Invalid HTML, CSS, or JavaScript found in template.
תודה על המתכון…
אבל, נתונים מסכמים של המקור תנועה הראשון קיימים באופן מובנה גוגל אנליטקס תחת Conversions
ב-Multi Channel Funnels – Top Conversion Path
האם ההבדל במה שהצעת הוא ברמת User data layer ?
אני תקוע בשלב הראשון, לא מגיע לאפשרויות של ה slots index אלא מקבל 3 שורות עם קוד java…..rauo”העתק את קטע הקוד הבא עבור הפלטפורמה שלך. אל תשכח להחליף את dimensionValue בערך משלך.”
היי שוקי, עשיתי את כל הפעולות ובשלב ה-submit מופיעה לי ההודעה הבאה, שמתייחסת ל-variable first source finder:
Error at line 2, character 26: Parse error. Character ‘‘’ (U+2018) is not a valid identifier start char
מה אני עושה לא נכון?
נסי להעתיק עכשיו. היתה איזו בעיה עם הפורמט שהוורדפרס הציג את הקוד
הצליח! תודה שוקי 🙂
אילו פרמרטרים עליי לכלול בדו״ח שיציג לי את הנתון הזה?
היי שוקי,
משהו לא עובד לי נכון בסקריפט.
כשאני בודק –
הוא בעצם מבצע עדכון ל SOURCE ב LOCAL STORAGE בכל עמוד באתר,
כלומר דורס את המקור.
למה זה קורה?