יש סוג של פיצ'ר שנשמע קטן עד שמבינים כמה קל לעשות אותו לא נכון: אנליטיקה.
ב-Online Converter רציתי להבין איך אנשים משתמשים בכלי בלי להפוך כלי פרטיות לכלי מעקב. זה נשמע כמו משפט יפה, אבל בפועל זו החלטת מוצר עם גבולות טכניים מאוד ברורים: למדוד את השימוש, לא את התוכן. לדעת שאנשים המירו JSON ל-CSV, לא מה היה בתוך ה-JSON שלהם.
זה ההבדל בין לבנות מוצר שאפשר לשפר לבין לבנות מוצר שמבקש יותר אמון ממה שהוא צריך.
הבעיה: כלי המרה רואה מידע רגיש
כלי המרה מקבל לפעמים טקסטים אמיתיים: JSON מתוך מערכת, CSV של לקוחות, XML של אינטגרציה, YAML של קונפיגורציה. גם אם הכל רץ בצד לקוח, חוויית המשתמש נשענת על ההבטחה שהמידע לא נשלח החוצה.
אבל בלי מדידה בכלל קשה לשפר את המוצר. קשה לדעת איזה כלים באמת בשימוש, איפה אנשים נתקעים, האם חיפוש עובד, האם קטגוריות עוזרות, ואם כפתור מסוים בכלל נלחץ.
המתח הוא ברור: אני רוצה ללמוד על ההתנהגות של המוצר, אבל לא על המידע של המשתמש.
האבחון: האירוע חשוב, התוכן לא
הפתרון התחיל בהפרדה פשוטה: יש דברים שמותר למדוד ויש דברים שלא.
מותר למדוד שאירוע קרה: משתמש פתח כלי, הפעיל המרה, שינה אפשרות, טען דוגמה, ניקה קלט, עבר לכלי ההפוך, לחץ על קישור חיצוני או ראה מיקום פרסום. אסור למדוד את הקלט, הפלט או טקסט החיפוש עצמו.
לכן במקום לשלוח payload חופשי, בניתי שכבת analytics שמקבלת אירועים עם props מצומצמים ומסננת אותם לערכים פשוטים בלבד: string, number ו-boolean. גם כשהמשתמש מחפש, האירוע שומר אורך חיפוש וכמות כלים גלויים, לא את המילים שהוא הקליד.
העיקרון היה: מדידה צריכה לענות על שאלת מוצר, לא לפתוח חלון לתוכן פרטי.
הפתרון: שכבת אירועים עם גבולות
במקום לפזר קריאות לכל ספק אנליטיקה בתוך הקומפוננטות, הוספתי שכבה אחת שמרכזת את המדידה.
העמודים מעבירים context בסיסי כמו סוג עמוד, שפה, קטגוריה, כלי ו-converter. הקומפוננטות שולחות אירועים כמו `convert_tool`, `clear_input`, `toggle_auto_convert` או `open_reverse_tool`. שכבת האנליטיקה מחברת ביניהם, דוחפת ל-`dataLayer`, ואם מוגדר Plausible שולחת גם אליו.
היתרון הוא שהקומפוננטה לא צריכה לדעת מי ספק האנליטיקה. היא רק מודיעה שמשהו משמעותי קרה. והכי חשוב: היא לא מעבירה את הדאטה שהמשתמש הכניס.
גם פרסומות קיבלו מדידה זהירה: לא “מי המשתמש”, אלא האם מיקום פרסום מסוים הופיע במסך, והאם זה היה ad אמיתי או placeholder. זה מספיק כדי להבין את המבנה בלי להפוך את הדף למכונת מעקב.
איך בדקתי שזה נשאר בטוח
הוספתי בדיקת E2E שמוודאת שעמוד כלי משדר אירוע `view_tool`, שהמרה משדרת `convert_tool`, ושאירוע ההמרה כולל את מזהה הכלי. הבדיקה לא מחפשת תוכן קלט בתוך האירוע, כי זאת בדיוק הנקודה: התוכן לא אמור להיות שם.
בדיקה כזאת היא לא רק QA. היא גבול. היא אומרת שגם אם בעתיד אוסיף עוד ספק אנליטיקה או עוד אירועים, יש ציפייה ברורה: מודדים פעולות, לא קוראים מידע אישי.
מה למדתי
אנליטיקה טובה לא מתחילה בשאלה “מה אפשר לאסוף?”. היא מתחילה בשאלה “מה באמת צריך לדעת כדי לשפר את המוצר?”.
כשעונים על השאלה הזאת בכנות, הרבה מידע מיותר יורד מהשולחן. לא צריך את תוכן ההמרה כדי לדעת שכלי מסוים שימושי. לא צריך את מילות החיפוש כדי לדעת שחיפוש עוזר. לא צריך לזהות משתמש כדי לדעת אם כפתור משמש מישהו.
במוצר שמבטיח פרטיות, גם המדידה צריכה להיות חלק מההבטחה. לא נספח טכני, לא משהו שמוסיפים בסוף, אלא החלטת מוצר בפני עצמה.