מדריך אינטגרציה · Lead Capture

איך בונים דף נחיתה
שמתחבר למערכת הלידים

כל מה שצריך כדי שדף נחיתה ישלח לידים נכון אל מערכת הפרסום של Hebrew Calendar — מבנה הבקשה, השדות, ולמה כל ליד נחשב תקין.

1 איך זה עובד

דף הנחיתה שלכם שולח בקשת POST אחת עם פרטי הליד. המערכת מאמתת אותה, שומרת אותה במסד הנתונים, מצרפת אותה לקמפיין (לפי campaign_id), ושולחת התראת טלגרם מיידית על כל ליד תקין.

Landing page → POST /v1/lead → validatestoreTelegram alert + dashboard

2 נקודת הקצה (Endpoint)

POSThttps://ads.hebcal.co.il/v1/lead

גוף הבקשה הוא JSON עם הכותרת Content-Type: application/json. אין צורך במפתח API — הדף הציבורי שולח ישירות.

3 שדות הבקשה

שדהחובה?תיאור
nameחובהשם מלא של המתעניין.
emailחובה*אימייל תקין. *ראו סעיף 4 — דפי נחיתה ללא שדה אימייל חייבים placeholder.
phoneרשותטלפון. מומלץ מאוד — משמש לזיהוי כפילויות וליצירת קשר.
messageרשותפרטי ההצעה / טקסט חופשי (למשל דגם רכב, מחיר, consent).
companyרשותשם החברה, אם רלוונטי.
campaign_idרשותמזהה הקמפיין (מספר). אם לא קיים — הליד נשמר ללא שיוך, אך עדיין תקין.
sourceרשותמקור הליד. עבור דף נחיתה תמיד "form". ראו סעיף 5.
landing_pageרשותכתובת הדף ששלח את הליד. שלחו window.location.href.
countryרשותקוד מדינה, אם ידוע. אחרת מזוהה אוטומטית לפי IP.

4 כלל האימייל — חשוב!

המערכת דורשת כרגע אימייל תקין בכל ליד. בקשה ללא אימייל (או עם אימייל ריק) נדחית עם שגיאת 400 — והליד אובד.

לא לעשות

לשלוח { "name": "...", "phone": "..." } בלי שדה email → הליד נדחה ולא נשמר.

אם בדף שלכם אין שדה אימייל

צרו אימייל placeholder בצד הלקוח לפני השליחה, נגזר מהטלפון, כך שהליד נשמר תקין ועדיין מזוהה ככזה ללא אימייל אמיתי:

// אם המשתמש לא מילא אימייל — צרו placeholder תקין
if (!payload.email) {
  const digits = (payload.phone || '').replace(/\D/g, '');
  payload.email = digits
    ? `${digits}@no-email.hebcal.co.il`      // דדופ לפי אדם
    : `lead-${Date.now()}@no-email.hebcal.co.il`; // גיבוי
}
למה זה עובד

ה-placeholder עובר את בדיקת תקינות האימייל, נשמר תקין (is_valid=1), וההתראה נשלחת. הסיומת @no-email.hebcal.co.il מאפשרת לסנן את הלידים האלו בדוחות.

לתשומת לב

אימייל ה-placeholder יופיע בדשבורד, בייצוא ה-CSV ובהתראת הטלגרם, וקישורי ה-mailto: אליו לא יעבדו. זהו פתרון ביניים — בעתיד המערכת תתמוך באימייל ריק באופן מובנה.

5 ערכי source מותרים

השדה מקבל רק ערכים מתוך רשימה לבנה. כל ערך אחר מתאפס אוטומטית ל-"form":

form   whatsapp   phone   email

עבור דף נחיתה רגיל השתמשו תמיד ב-"form".


6 דוגמה מלאה — טופס + שליחה

קוד מוכן להעתקה. הטופס קולט שם, טלפון ואימייל (רשות), קורא את campaign_id מכתובת ה-URL, ומפעיל את ה-placeholder אם האימייל ריק.

HTML

<form id="lead-form">
  <input name="name"  placeholder="שם מלא" required />
  <input name="phone" placeholder="טלפון" type="tel" required />
  <input name="email" placeholder="אימייל (רשות)" type="email" />
  <button type="submit">שליחה</button>
</form>

JavaScript

const ENDPOINT = 'https://ads.hebcal.co.il/v1/lead';
const form = document.getElementById('lead-form');

form.addEventListener('submit', async (e) => {
  e.preventDefault();

  const payload = {
    name:    form.name.value.trim(),
    phone:   form.phone.value.trim(),
    email:   form.email.value.trim(),
    source:  'form',
    campaign_id: new URLSearchParams(location.search).get('campaign_id'),
    landing_page: location.href,
  };

  // Workaround: synthesize a placeholder email when blank
  if (!payload.email) {
    const digits = payload.phone.replace(/\D/g, '');
    payload.email = digits
      ? `${digits}@no-email.hebcal.co.il`
      : `lead-${Date.now()}@no-email.hebcal.co.il`;
  }

  try {
    const res = await fetch(ENDPOINT, {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(payload),
    });
    const data = await res.json();
    if (data.success) {
      // הציגו הודעת תודה
    } else {
      // data.error מכיל את הסיבה
    }
  } catch (err) {
    // שגיאת רשת — בקשו מהמשתמש לנסות שוב
  }
});

7 מתי ליד נחשב תקין

גם לידים "לא תקינים" נשמרים (לצורך תיעוד) אך אינם מפעילים התראה ואינם מופיעים בתצוגות ברירת המחדל. ליד יסומן is_valid=1 כאשר:

סיבת פסילהמתי
bad_emailאימייל לא תקין או ארוך מ-200 תווים.
duplicateאותו אימייל + קמפיין נשלח כבר ב-30 הימים האחרונים.
rate_limitיותר מדי בקשות מאותו IP בזמן קצר.

8 תשובות השרת

הצלחה

200 OK
{ "success": true }

שגיאה

400 { "error": "Missing name or email" }   // שדה חובה חסר
500 { "error": "..." }                       // תקלת שרת
שימו לב

ליד שנשמר אך נפסל כספאם (כפילות / rate limit) עדיין מחזיר 200 עם success: true — הוא פשוט לא מפעיל התראה. אל תתבססו על קוד התשובה כדי לדעת אם ליד "אמיתי" נקלט.

9 צ'קליסט לפני העלאה

  • שולחים POST עם Content-Type: application/json.
  • תמיד source: "form".
  • מעבירים campaign_id נכון (בד"כ מה-URL) לשיוך מדויק.
  • מעבירים landing_page: location.href.
  • יש שדה אימייל — או placeholder אוטומטי אם אין.
  • אוספים טלפון — קריטי לזיהוי כפילויות וליצירת קשר.
  • מטפלים גם בשגיאות רשת (try/catch) ומציגים משוב למשתמש.