כל הפרויקטים

מערכת מעקב לידים וזיהוי כפילויות

התאמת Gmail → Worldfilia CRM, דו"ח invalid-rate לפי UTM ל-Google Sheets.

המטרה

קמפיינים מספקים לידים דרך Gmail ומוכשרים ב-Worldfilia. בלי אוטומציה, invalid-rate לפי UTM לא היה גלוי, כפילויות עובדו פעמיים, והחלטות תקציב התבססו על ניחוש. המטרה: Job שממזג לידים של Gmail עם CRM ומפרסם דו"ח per-campaign.

הפתרון

CLI ב-Python עם 5 מצבי הפעלה (INIT, date-range, --watch N, --dry-run, --from-cache). כל ריצה מושכת אימיילי לידים חדשים מ-Gmail API, משיגה טרנזקציות Worldfilia, מריצה matcher רב-שכבתי (exact/phone/email/fuzzy), מקבצת לפי utm_campaign, כותבת summary + raw leads ל-Sheets, ומסמנת אימיילים כקרואים רק אחרי כתיבה מוצלחת.

עיקרי הדברים

  • סימון כקרוא רק אחרי כתיבה מוצלחת ל-Sheets — pipeline re-runnable לחלוטין
  • Matcher ב-4 שכבות עם match_tier גלוי מאפשר ללקוח לבדוק ביטחון
  • 5 מצבי הפעלה מ-CLI אחד (INIT, date-range, watch, dry-run, from-cache)

האתגר

אותו מספר טלפון הופיע בכמה קמפיינים באותו יום, מנפח נתונים ומטשטש invalid-rate.

Matcher עם ארבע שכבות עם תג match_tier גלוי בכל שורה, כדי שהלקוח יוכל לבדוק ביטחון; לידים ללא התאמה מוצגים בנפרד.

ה-session tokens של Worldfilia פגים בלי התראה והריצה המתוזמנת נכשלה בשקט.

שגיאה ממוזזת WorldfiliaAuthExpiredError עם הודעה ישירה למפעיל ויציאה עם קוד שגיאה כדי שהסקדולר ידווח.

סדר סמן-כקרוא-ואז-כתוב נאיבי מאבד לידים אם הכתיבה נכשלת אחרי הסימון.

סדר commit קפדני — משיכה, התאמה, אגרגציה, כתיבה ל-Sheets, ואז סימון. יחד עם cache JSON מקומי, ה-pipeline re-runnable לחלוטין.

Bootstrap בהעלייה: אלפי אימיילים היסטוריים לא-קרואים — חייבים לעבד פעם אחת בלי לעבד פעמיים את העתידיים.

מצב --init מרחיב את החלון ל-~2 שנים, מעבד הכל פעם אחת, מסמן כקרוא, ומדפיס הודעת מעבר ל-`--unread-only / --watch N`.

מה נמסר

  • CLI main.py עם 5 מצבי הפעלה
  • gmail_client.py, worldfilia_client.py, sheets_writer.py, auth_google.py, lead_matcher.py
  • WorldfiliaAuthExpiredError עם הודעה אקטיבית
  • Cache JSON פר טווח תאריכים
  • Google OAuth token קבוע
  • requirements.txt עם גרסאות נעולות

תוצאות

Gmail + Worldfilia

מקורות דאטה

4

שכבות match

5

מצבי הפעלה

Zero

איבוד דאטה בכישלון

מה זה לימד אותי

  • סדר commit (כתוב-קודם-אז-סמן) הופך סנכרון שביר ל-re-runnable
  • Match רב-שכבתי עם match_tier גלוי בונה אמון — auditability מנצח black-box
  • שגיאות ממוזזות עם הנחיות פעולה חוסכות תמיכה כש-APIs פגים