CloseUp-CRM Lead Bridge — תיעוד
כל מה שצריך כדי להתקין, להגדיר, לאבטח ולפתור תקלות בתוסף.
סקירה
CloseUp-CRM Lead Bridge הוא תוסף וורדפרס שלוכד כל שליחת טופס באתר שלכם ומזרים אותה ל-CloseUp CRM בזמן אמת — בלי לשנות דבר בטפסים הקיימים. הוא נבנה למשווקים, סוכנויות וצוותי מכירות שכבר אוספים לידים דרך תוספי טפסים פופולריים בוורדפרס ורוצים שהלידים האלה יגיעו ל-CRM מיידית, באמינות ועם ייחוס שיווקי מלא.
מבחינה ארכיטקטונית, התוסף מתחבר לאירוע ההשלמה של כל מנוע טפסים נתמך, קורא את השדות שנשלחו, מזהה אוטומטית את השם, האימייל והטלפון של איש הקשר, מעשיר את הרשומה בפרמטרי UTM והקשר דפדפן/מכשיר, שומר אותה אופציונלית בטבלה מקומית, ומעביר payload חתום בפורמט JSON לנקודת הקצה של ה-Webhook שהגדרתם מעל HTTPS — הכל בנתיב לא-חוסם כך שהמבקר אף פעם לא ממתין.
דרישות
- WordPress 5.6 ומעלה.
- PHP 7.2 ומעלה.
- נקודת קצה Webhook ב-HTTPS שמסוגלת לקבל בקשת POST עם גוף JSON.
- חשבון CloseUp CRM לקבלת הלידים הנכנסים ולעבודה עליהם.
התקנה
- בפאנל הניהול של וורדפרס, עברו אל תוספים ← הוסף חדש ← העלה תוסף ובחרו את קובץ ה-ZIP של CloseUp-CRM Lead Bridge.
- לחצו על התקן עכשיו ואז הפעל.
wp_cll_leads — אין שלבים ידניים במסד הנתונים. הוא גם בודק בעצמו קבצים חסרים וגרסת PHP לא נתמכת, ומציג התראת ניהול ברורה במקום להיכשל בשקט.התחלה מהירה (5 דק')
- הפעילו את התוסף.
- פתחו את CloseUp-CRM ← הגדרות בפאנל הניהול.
- הדביקו את כתובת ה-Webhook ואת ה-API Key (ואם אתם משתמשים באימות חתימה, גם את ה-Webhook Secret).
- שלחו טופס כלשהו באתר.
- ראו את הליד מופיע תחת CloseUp-CRM ← Leads — ומועבר ל-CRM שלכם בזמן אמת.
מדריך הגדרות
כל שדה במסך CloseUp-CRM ← הגדרות:
| הגדרה | מה היא עושה |
|---|---|
| Webhook URL | נקודת הקצה ב-HTTPS שאליה נשלחים הלידים שנלכדו. חובה לצורך העברה. |
| Webhook Secret | חותם את גוף הבקשה ב-HMAC-SHA256. החתימה נשלחת כ-X-CLL-Signature: sha256=<hmac> (לצד Authorization: Bearer <secret>). ה-secret עצמו לעולם אינו נשלח כטקסט גולמי בגוף — הוא משמש רק כדי להוכיח את האותנטיות והשלמות של ה-payload. |
| API Key | מפתח משותף פשוט הנשלח כטקסט גולמי תחת כותרת, כדי שנקודת הקצה תוכל לאמת את הקורא. בניגוד ל-secret, ערך זה מועבר כפי שהוא. |
| API Key Header | שם הכותרת שתחתיה נשלח ה-API key. ברירת מחדל X-API-Key. |
| מיפוי שדות | מזהי שדות שם / טלפון / אימייל אופציונליים לכל טופס. השאירו ריק לשימוש בזיהוי חכם. |
| מנועי טפסים | הפעלה או כיבוי של לכידה לכל ספק. כל אחד מציג סטטוס מזוהה / לא מזוהה חי לתוספים המותקנים באתר. |
| שמירת לידים | קובע האם לידים שנלכדו נשמרים בטבלה המקומית wp_cll_leads. |
| איסוף IP | קובע האם כתובת ה-IP של המבקר נרשמת. כבוי כברירת מחדל לצורך ידידותיות ל-GDPR. |
Secret מול API key, בשורה אחת: ה-secret מוכיח שהגוף לא שונה (הוא לעולם לא נשלח גולמי); ה-API key הוא סיסמה משותפת גולמית שמזהה את הקורא.
תוספי טפסים נתמכים
Lead Bridge מתחבר לכל מנוע דרך הוק ההשלמה המקורי שלו, כך שהטפסים מתנהגים בדיוק כמו קודם.
| תוסף טפסים | הוק מנוצל | הערות |
|---|---|---|
| Contact Form 7 | wpcf7_mail_sent | קורא את נתוני השליחה לאחר ש-CF7 שולח את המייל שלו. המיילים, ההפניות והודעות התודה המקוריות נשארות ללא שינוי. |
| Elementor / Elementor Pro | elementor_pro/forms/new_record | מתחבר לרשומת טופס ה-Pro בעת שליחה. עובד עם טפסים מרובי-שלבים וטפסי פופאפ. |
| ACF Forms | acf/save_post | לוכד שליחות טפסי Advanced Custom Fields מצד הלקוח בעת השמירה. |
| Formidable Forms | frm_after_create_entry | מופעל לאחר שהרשומה נשמרה, כך שהליד נלכד עם ערכי השדות הסופיים. |
| Fluent Forms | fluentform/submission_inserted | קורא את השליחה שנוספה; נתמכים גם טפסים שיחתיים ופריסות מרובות-עמודות. |
| Frontend Admin by DynamiApps | fea/form/submit | לוכד שליחות פוסט/פרופיל מצד הלקוח שנוצרות דרך טפסי DynamiApps Frontend Admin. |
כיצד פועלת לכידת הלידים
כשמבקר שולח טופס, Lead Bridge מאזין להוק ההשלמה של מנוע הטפסים הרלוונטי לאחר שאותו מנוע סיים את עבודתו — שלח את המיילים שלו, שמר את הרשומה והריץ את ההפניה או הודעת התודה. לכן הלכידה אף פעם לא חוסמת או מעכבת את השליחה, וההתראות וההפניות המקוריות נשמרות ללא שינוי.
זיהוי אוטומטי. התוסף בוחן את השדות שנשלחו ומשווה אותם למאגר דפוסים נפוצים כדי לזהות את השם, האימייל והטלפון — גם כשהשדות נקראים your-name, fname, email_address או tel. אימייל מזוהה גם לפי צורת הערך כגיבוי, וטלפון לפי דפוסי ספרות. אם הגדרתם מיפוי שדות מפורש לטופס, המיפוי גובר על הזיהוי האוטומטי.
העשרה והעברה. איש הקשר שזוהה משולב עם ייחוס שיווקי (מעוגייה מהצד הראשון) והקשר דפדפן/מכשיר, נכתב אופציונלית למאגר המקומי, ומועבר ל-Webhook שלכם כ-POST חתום בפורמט JSON — הכל בנתיב רקע לא-חוסם.
מבנה ה-Webhook payload
כל ליד שנלכד מועבר כ-POST בודד עם גוף ה-JSON הבא. השדות יציבים ובטוחים למיפוי ישיר ב-CRM שלכם.
{
"event": "lead.captured",
"lead": {
"name": "Dana Cohen",
"email": "dana.cohen@example.com",
"phone": "+972-52-555-0142"
},
"form": {
"provider": "contact-form-7",
"form_id": "412",
"name": "Homepage — Request a demo",
"fields": {
"your-name": "Dana Cohen",
"email_address": "dana.cohen@example.com",
"tel": "+972-52-555-0142",
"company": "Northwind Ltd.",
"message": "Interested in the Pro plan."
}
},
"attribution": {
"utm_source": "google",
"utm_medium": "cpc",
"utm_campaign": "spring_demo",
"utm_term": "wordpress crm",
"utm_content": "hero_cta",
"gclid": "Cj0KCQiA1234EXAMPLE",
"fbclid": null
},
"enrichment": {
"browser": "Chrome 126",
"os": "macOS 14",
"device": "desktop",
"language": "en-US",
"referrer": "https://www.google.com/",
"page_url": "https://example.com/?utm_source=google&utm_medium=cpc"
},
"meta": {
"lead_id": "9f8b7c6d-5e4a-4b3c-2d1e-0f9a8b7c6d5e",
"source_url": "https://example.com/contact/",
"site": "https://example.com",
"plugin_version": "1.1.0",
"is_test": false,
"timestamp": "2026-07-22T09:14:07Z"
}
}וזו בקשת ה-HTTP המדויקת, כולל כל הכותרות:
POST /webhooks/leads HTTP/1.1
Host: crm.example.com
Content-Type: application/json
User-Agent: CloseUp-CRM-Lead-Bridge/1.1.0
X-CLL-Signature: sha256=9b2e1f0a7c... (HMAC-SHA256 of the raw body)
X-API-Key: your-shared-api-key
Authorization: Bearer your-webhook-secret
{ ...the JSON body shown above... }אבטחה
Lead Bridge חותם כל גוף בקשה ב-HMAC-SHA256 עם ה-Webhook secret שלכם ושולח את התוצאה כ-X-CLL-Signature: sha256=<hmac>. בנקודת הקצה שלכם, חשבו מחדש את ה-HMAC על גוף הבקשה הגולמי עם אותו secret משותף והשוו אותו לכותרת בזמן קבוע. אם הם תואמים, ה-payload אותנטי ולא שונה.
PHP — אימות החתימה:
<?php
// Read the RAW body exactly as received — do not decode + re-encode.
$rawBody = file_get_contents('php://input');
$secret = getenv('CLL_WEBHOOK_SECRET');
$header = $_SERVER['HTTP_X_CLL_SIGNATURE'] ?? ''; // "sha256=<hmac>"
$expected = 'sha256=' . hash_hmac('sha256', $rawBody, $secret);
if (!hash_equals($expected, $header)) {
http_response_code(401);
exit('Invalid signature');
}
// Optional: also require the raw API key.
$apiKey = $_SERVER['HTTP_X_API_KEY'] ?? '';
if (!hash_equals(getenv('CLL_API_KEY'), $apiKey)) {
http_response_code(401);
exit('Invalid API key');
}
$payload = json_decode($rawBody, true);
// ... handle $payload['lead'] ...Node.js (Express) — אימות החתימה:
import crypto from 'node:crypto';
import express from 'express';
const app = express();
// Capture the RAW body — signature must be checked against the exact bytes.
app.post(
'/webhooks/leads',
express.raw({ type: 'application/json' }),
(req, res) => {
const raw = req.body; // Buffer
const expected =
'sha256=' +
crypto
.createHmac('sha256', process.env.CLL_WEBHOOK_SECRET)
.update(raw)
.digest('hex');
const got = req.get('X-CLL-Signature') || '';
const ok =
expected.length === got.length &&
crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(got));
if (!ok) return res.status(401).send('Invalid signature');
if (req.get('X-API-Key') !== process.env.CLL_API_KEY) {
return res.status(401).send('Invalid API key');
}
const payload = JSON.parse(raw.toString('utf8'));
// ... handle payload.lead ...
res.sendStatus(200);
},
);Python (Flask) — אימות החתימה:
import hmac, hashlib, os
from flask import Flask, request, abort
app = Flask(__name__)
@app.post("/webhooks/leads")
def leads():
raw = request.get_data() # RAW bytes — do not use request.json here
secret = os.environ["CLL_WEBHOOK_SECRET"].encode()
expected = "sha256=" + hmac.new(secret, raw, hashlib.sha256).hexdigest()
got = request.headers.get("X-CLL-Signature", "")
if not hmac.compare_digest(expected, got):
abort(401, "Invalid signature")
if not hmac.compare_digest(
os.environ["CLL_API_KEY"], request.headers.get("X-API-Key", "")
):
abort(401, "Invalid API key")
payload = request.get_json()
# ... handle payload["lead"] ...
return "", 200X-API-Key) והשוו אותו לערך השמור לפני שאתם סומכים על הבקשה. השתמשו בחתימה כדי להבטיח שלמות וב-API key כדי להבטיח זהות.בדיקות
ה-כלי בדיקה המובנה מאפשר להוכיח לכידה והעברה בלי לגעת בטפסים החיים:
- טופס בדיקה מותאם. שלחו טופס לדוגמה מובנה וצפו ב-payload שנוצר נלכד ומועבר.
- בדיקה עצמית לספק. ירו שליחה סינתטית דרך כל מנוע מופעל כדי לוודא שההוק מנוצל ושה-Webhook נגיש.
- יצירת טפסי דמו אמיתיים. צרו טפסים מקוריים אמיתיים — עם שמות שדות אקראיים — בתוך כל תוסף טפסים מותקן, כולם נאספים בדף דמו יחיד, כדי לאמת את הזיהוי האוטומטי מול מזהי שדות ריאליסטיים ובלתי צפויים.
כל שליחת בדיקה מסומנת ב-is_test: true ב-payload ובמאגר המקומי, כך שקל לסנן אותה מדוחות אמיתיים.
לידים וייצוא
כשאחסון מקומי מופעל, כל ליד שנלכד נכתב לרשימת ה-Leads הממותגת בפאנל הניהול. פתחו כל שורה לתצוגת ליד בודד המציגה את איש הקשר שזוהה, שדות הטופס הגולמיים, הייחוס המלא והקשר ההעשרה.
ייצאו את כל המאגר בכל עת ל-CSV, XML או JSON. לידים שנוצרו על ידי כלי הבדיקה נושאים את הדגל is_test כך שתוכלו לכלול או להחריג אותם מהייצוא ומהדוחות.
ייחוס שיווקי
בביקור הראשון, Lead Bridge לוכד את ההקשר השיווקי — utm_source, utm_medium, utm_campaign, utm_term, utm_content, וכן gclid ו-fbclid — מכתובת ה-URL ושומר אותו בעוגיית צד ראשון. כשהמבקר שולח טופס מאוחר יותר, הייחוס השמור מצורף לליד ומועבר ב-payload בתוך אובייקט ה-attribution, כך שאתם שומרים על המקור המקורי גם לאורך מספר צפיות בדפים.
פתרון תקלות
לידים לא מגיעים
- האם כתובת ה-Webhook מוגדרת ונכונה?
- האם נקודת הקצה מוגשת מעל HTTPS ונגישה מהשרת שלכם?
- האם מתג מנוע הטפסים מופעל עבור התוסף שאתם בודקים, והוא מוצג כ-מזוהה?
- האם חומת אש או תוסף אבטחה חוסם בקשות יוצאות מוורדפרס?
לא ניתן להפעיל
- העלו מחדש את ה-ZIP המלא — העלאה חלקית עלולה להשאיר קבצים חסרים.
- ודאו שהשרת מריץ PHP 7.2+; התוסף מציג התראה ברורה כשלא.
אי-התאמת חתימה
- אמתו מול הגוף הגולמי — אל תקודדו מחדש או תעצבו את ה-JSON לפני החישוב, כי זה משנה את הבתים ושובר את ה-HMAC.
- ודאו ששני הצדדים משתמשים ב-אותו Webhook secret.
שאלות נפוצות
תשובות מורחבות לשאלות הנפוצות ביותר.
האם זה ישנה או ישבור את הטפסים הקיימים שלי?
האם צריך לשנות שמות או להגדיר מחדש את שדות הטופס?
אילו תוספי טפסים נתמכים?
כיצד ה-Webhooks מאובטחים?
האם זה ידידותי ל-GDPR?
האם צריך ליצור טבלה במסד הנתונים?
יומן שינויים
היסטוריית הגרסאות של התוסף. ניתן להגדרה מפאנל הניהול.
- נוסף Frontend Admin by DynamiApps כמנוע טפסים נתמך.
- כלי בדיקה מובנה חדש: יצירת טפסי דמו אמיתיים עם שמות שדות אקראיים בתוך כל תוסף טפסים מותקן.
- זיהוי השדות החכם מזהה כעת יותר דפוסים נפוצים של שם, אימייל וטלפון.
- העברת ה-Webhook שולחת כעת גם את חתימת הגוף HMAC-SHA256 (X-CLL-Signature) וגם כותרת API-key הניתנת להגדרה.
- מאגר הלידים המקומי מקבל ייצוא ל-CSV, XML ו-JSON בתוספת תצוגת ליד בודד.