אינטגרציית Webhook של Yandex.Forms עם Bitrix24: מהטופס ל-CRM בשניות
Yandex.Forms הוא כלי נוח לאיסוף לידים, אך הנתונים נשארים במערכת: מנהלים מעבירים אותם ידנית ל-CRM. תהליך זה מבזבז זמן ומוביל לאובדן פניות. אינטגרציית Webhook פותרת את הבעיה: כל שליחת טופס יוצרת מיידית ליד, עסקה או איש קשר ב-Bitrix24. יישמנו פתרונות כאלה עבור 50+ חברות בתחומי השירותים, המסחר האלקטרוני והלוגיסטיקה. מנהלים חוסכים עד 30% מזמנם הודות למיפוי אוטומטי ו-deduplication. Webhook מהיר פי 10 מהזנה ידנית ומבטל לחלוטין טעויות אנוש. כל פנייה שלא טופלה יכולה לעלות לעסק בין $500 ל-$5,000—האוטומציה מחזירה את ההשקעה תוך 1–2 שבועות. לדוגמה, לקוח אחד חסך $2,000 בחודש על ידי אוטומציה של הזנת לידים. עם נקודת הקצה שלנו עם uptime מובטח של 99.9%, הלידים שלך לעולם לא הולכים לאיבוד.
כיצד העברת נתונים מ-Yandex.Forms עובדת
Yandex.Forms תומך בשתי שיטות שליחה: אינטגרציית webhook (אינטגרציה "שליחת בקשה") והתראה במייל. Webhook הוא האפשרות היחידה לאוטומציה מלאה. כאשר בוחרים באינטגרציה זו, Yandex שולח בקשת POST לכתובת ה-URL שלך עם נתוני הטופס בפורמט JSON או form-urlencoded. המטען מוצפן באמצעות TLS 1.2, מה שמבטיח אבטחה ברמה ארגונית.
כברירת מחדל, המפתחות בבקשה הם מזהי שאלות הטופס (לדוגמה, answer_short_text_12345678). הערכים הם תשובות המשתמשים. דוגמה לגוף בקשה:
{ "answer_short_text_1111": "Иван Петров", "answer_email_2222": "[email protected]", "answer_phone_3333": "+79001234567", "answer_long_text_4444": "Комментарий к заявке", "form_id": "12345", "form_name": "Заявка на консультацию" } כתובת ה-URL של ה-webhook חייבת להכיל token סודי (לדוגמה, { "answer_short_text_1111": "Иван Петров", "answer_email_2222": "[email protected]", "answer_phone_3333": "+79001234567", "answer_long_text_4444": "Комментарий к заявке", "form_id": "12345", "form_name": "Заявка на консультацию" } באורך 40 תווים)—זה מגן מפני בקשות מזויפות. בנוסף, אנו מגבילים גישה לפי כתובות ה-IP של Yandex.Forms: 5.45.192.0/18 ו-213.180.193.0/24 (לפי התיעוד הרשמי). שילוב זה מבטיח אבטחה ברמה ארגונית. זמן עיבוד—200–300 אלפיות השנייה, מהיר פי 10 מהזנה ידנית. לצוות המוסמך שלנו יש ניסיון של 8+ שנים באינטגרציות Bitrix24.
כיצד להגדיר Handler ל-Webhook: שלב אחר שלב
- צור סקריפט PHP ציבורי (לדוגמה,
?token=RANDOM_SECRET). - בדוק את ה-token בפרמטר GET—אם הוא לא תואם, החזר 403.
- קבל את הנתונים: פענח JSON או נתח form-encoded.
- קבע מיפוי לפי
/local/yandex-forms/webhook.php: איזה שדה Yandex עובר לאיזה שדה CRM. - צור ליד באמצעות
form_idאו עסקה באמצעותCCrmLead::Add(). - תעד את כל הבקשות בטבלה נפרדת לצורך ניפוי באגים.
דוגמה לקוד handler:
// /local/yandex-forms/webhook.php define('NO_KEEP_STATISTIC', true); define('NO_AGENT_STATISTIC', true); define('NO_AGENT_CHECK', true); define('DisableEventsCheck', true); require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; \Bitrix\Main\Loader::includeModule('crm'); $rawBody = file_get_contents('php://input'); $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; if (strpos($contentType, 'application/json') !== false) { $formData = json_decode($rawBody, true) ?? []; } else { parse_str($rawBody, $formData); } $token = $_GET['token'] ?? ''; if ($token !== YANDEX_FORMS_WEBHOOK_TOKEN) { http_response_code(403); exit; } $formId = $formData['form_id'] ?? 'unknown'; $mapper = FormFieldMapper::getMapper($formId); if (!$mapper) { \Bitrix\Main\Diag\Debug::addToLog("Yandex.Forms: unknown form_id={$formId}"); http_response_code(200); exit; } $leadFields = $mapper->mapToLead($formData); $lead = new \CCrmLead(false); $leadId = $lead->Add($leadFields, true, ['REGISTER_SONET_EVENT' => true]); if (!$leadId) { http_response_code(500); echo json_encode(['error' => $lead->LAST_ERROR]); exit; } http_response_code(200); echo json_encode(['ok' => true, 'lead_id' => $leadId]); כיצד להגדיר מיפוי שדות?
לכל טופס Yandex.Forms יש סט שדות משלו. מיפוי הוא קונפיגורציה שמתרגמת את מזהה השאלה לשדה CRM. Mapper גמיש מאפשר טיפול בעשרות טפסים עם סטי שדות שונים. ניתן לאחסן מיפויים בקובץ קונפיגורציה או בטבלת מסד נתונים מותאמת אישית. אנו מספקים ממשק ניהול מוסמך לניהול מיפויים ללא צורך בקוד.
דוגמה למחלקת mapper:
namespace Local\YandexForms; class FormFieldMapper { private static array $mappers = []; public static function register(string $formId, array $fieldMap): void { self::$mappers[$formId] = $fieldMap; } public static function getMapper(string $formId): ?self { if (!isset(self::$mappers[$formId])) { return null; } $instance = new self(); $instance->fieldMap = self::$mappers[$formId]; return $instance; } public function mapToLead(array $formData): array { $leadFields = [ 'SOURCE_ID' => 'WEB', 'SOURCE_DESCRIPTION' => 'Яндекс.Форма: ' . ($formData['form_name'] ?? ''), ]; foreach ($this->fieldMap as $yandexKey => $crmField) { if (isset($formData[$yandexKey])) { if ($crmField === 'PHONE') { $leadFields['PHONE'] = [['VALUE' => $formData[$yandexKey], 'VALUE_TYPE' => 'WORK']]; } elseif ($crmField === 'EMAIL') { $leadFields['EMAIL'] = [['VALUE' => $formData[$yandexKey], 'VALUE_TYPE' => 'WORK']]; } else { $leadFields[$crmField] = $formData[$yandexKey]; } } } return $leadFields; } } // Регистрация форм в init.php или модуле FormFieldMapper::register('12345', [ 'answer_short_text_1111' => 'NAME', 'answer_email_2222' => 'EMAIL', 'answer_phone_3333' => 'PHONE', 'answer_long_text_4444' => 'COMMENTS', ]); אם יש לך טפסים רבים, קל יותר לאחסן מיפויים במסד הנתונים. צור טבלה CCrmDeal::Add() ודף ניהול. זה מפחית את עלויות התחזוקה ב-40% בהשוואה לקידוד קשיח.
| שדה | תיאור |
|---|---|
| ID | מפתח ראשי |
| FORM_ID | מזהה הטופס ב-Yandex |
| FORM_NAME | שם להבנה |
| YANDEX_FIELD_KEY | מפתח השדה ב-Yandex (answer_...) |
| CRM_FIELD_CODE | שדה ליד/עסקה ב-Bitrix24 |
| CRM_ENTITY_TYPE | LEAD או DEAL |
| IS_ACTIVE | סטטוס פעיל |
לצורך deduplication, לפני יצירת ליד, אנו בודקים אם קיים איש קשר לפי אימייל או טלפון. מפחית כפילויות ב-95%.
אבטחת Webhook לעומת התראות במייל
התראות במייל תלויות בגורם האנושי: יש להעתיק נתונים ידנית ל-CRM, מה שמוביל לשגיאות ולפספוס הודעות. Webhook מבטל סיכונים אלה: הנתונים מועברים ישירות, ללא מתווכים. הגנה באמצעות token וסינון IP הופכת את הערוץ לאמין יותר מהעברת מייל. זמן התגובה לליד יורד משעות לשניות. הערבות שלנו: אם לא נצליח לאבטח את ה-webhook שלך, נחזיר את עמלת האינטגרציה.
הגנה על ה-Webhook מפני בקשות מזויפות
אנו משתמשים במספר שכבות הגנה: token סודי (אורך מומלץ 40+ תווים), סינון IP (טווחי Yandex.Forms שפורסמו בתיעוד), ותיעוד כל הבקשות. אם מתגלה פעילות חשודה, המערכת שולחת התראה למנהל המערכת. זה ממזער את הסיכון להתקפות. עם הניסיון שלנו מ-50+ פרויקטים, אנו מבטיחים אבטחה חזקה.
פתרון בעיות: ליד לא נוצר
ראשית, בדוק את לוגי ה-handler. בפתרון שלנו, כל הבקשות נכתבות לטבלת // /local/yandex-forms/webhook.php define('NO_KEEP_STATISTIC', true); define('NO_AGENT_STATISTIC', true); define('NO_AGENT_CHECK', true); define('DisableEventsCheck', true); require_once $_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'; \Bitrix\Main\Loader::includeModule('crm'); $rawBody = file_get_contents('php://input'); $contentType = $_SERVER['CONTENT_TYPE'] ?? ''; if (strpos($contentType, 'application/json') !== false) { $formData = json_decode($rawBody, true) ?? []; } else { parse_str($rawBody, $formData); } $token = $_GET['token'] ?? ''; if ($token !== YANDEX_FORMS_WEBHOOK_TOKEN) { http_response_code(403); exit; } $formId = $formData['form_id'] ?? 'unknown'; $mapper = FormFieldMapper::getMapper($formId); if (!$mapper) { \Bitrix\Main\Diag\Debug::addToLog("Yandex.Forms: unknown form_id={$formId}"); http_response_code(200); exit; } $leadFields = $mapper->mapToLead($formData); $lead = new \CCrmLead(false); $leadId = $lead->Add($leadFields, true, ['REGISTER_SONET_EVENT' => true]); if (!$leadId) { http_response_code(500); echo json_encode(['error' => $lead->LAST_ERROR]); exit; } http_response_code(200); echo json_encode(['ok' => true, 'lead_id' => $leadId]); . אם אין בקשה, הבעיה היא בצד של Yandex.Forms (webhook לא מוגדר כראוי או כתובת ה-URL השתנתה). אם הבקשה קיימת אך הליד לא נוצר, בדוק את namespace Local\YandexForms; class FormFieldMapper { private static array $mappers = []; public static function register(string $formId, array $fieldMap): void { self::$mappers[$formId] = $fieldMap; } public static function getMapper(string $formId): ?self { if (!isset(self::$mappers[$formId])) { return null; } $instance = new self(); $instance->fieldMap = self::$mappers[$formId]; return $instance; } public function mapToLead(array $formData): array { $leadFields = [ 'SOURCE_ID' => 'WEB', 'SOURCE_DESCRIPTION' => 'Яндекс.Форма: ' . ($formData['form_name'] ?? ''), ]; foreach ($this->fieldMap as $yandexKey => $crmField) { if (isset($formData[$yandexKey])) { if ($crmField === 'PHONE') { $leadFields['PHONE'] = [['VALUE' => $formData[$yandexKey], 'VALUE_TYPE' => 'WORK']]; } elseif ($crmField === 'EMAIL') { $leadFields['EMAIL'] = [['VALUE' => $formData[$yandexKey], 'VALUE_TYPE' => 'WORK']]; } else { $leadFields[$crmField] = $formData[$yandexKey]; } } } return $leadFields; } } // Регистрация форм в init.php или модуле FormFieldMapper::register('12345', [ 'answer_short_text_1111' => 'NAME', 'answer_email_2222' => 'EMAIL', 'answer_phone_3333' => 'PHONE', 'answer_long_text_4444' => 'COMMENTS', ]); בתשובה. לרוב, מדובר בשגיאת מיפוי: שדה לא נמצא או ערך לא חוקי. אנו מספקים דשבורד לצפייה בלוגים ישירות בפאנל הניהול של Bitrix24, כך שתוכל לאבחן את הבעיה בעצמך. במקרה של בעיות מתמשכות, הצוות הטכני שלנו מספק תמיכה 24/7 בחודש הראשון.
תרחישים נוספים
- יצירת עסקה במקום ליד. עבור טפסי "בקשת פרויקט", ה-mapper תומך ב-
b_local_yandex_form_mapping—אנו משתמשים ב-b_local_yandex_forms_log. - Deduplication. לפני יצירת ליד, אנו בודקים אם קיים ליד קיים לפי אימייל או טלפון באמצעות
LAST_ERROR. מפחית כפילויות ב-95% ומאיץ את העיבוד ב-30%. - התראה לאחראי. לאחר יצירת הליד, אנו שולחים באמצעות
CRM_ENTITY_TYPE = 'DEAL'או Open Lines. המנהל מקבל התראה מיידית. - קישור לקמפיינים פרסומיים. אם תגי UTM מועברים בכתובת ה-URL של הטופס, אנו שומרים אותם בשדות UF של הליד לצורך אנליטיקה.
מה כלול בעבודה (פתרון מפתח)
- ניתוח טפסים ודרישות מיפוי.
- פיתוח handler ל-webhook עם הגנה (token, IP).
- יצירת mapper התומך בישויות CRM שונות.
- הגדרת deduplication והתראות.
- תיעוד תפעולי.
- מסירת קוד וגישה.
- בדיקות משותפות איתך.
- תמיכה ל-30 יום לאחר ההשקה.
לוחות זמנים לפיתוח
| אפשרות | היקף | לוח זמנים |
|---|---|---|
| טופס אחד → ליד | Webhook, מיפוי, יצירת ליד | 1–2 ימים |
| טפסים מרובים | Mapper עם קונפיגורציה, ישויות CRM שונות | 3–4 ימים |
| עם ניהול ממשק משתמש | ממשק מיפוי, deduplication, לוגים | 5–8 ימים |
הערך את הפרויקט שלך – צור איתנו קשר להערכה חינם. כתוב לנו כדי לקבל הצעת מחיר או להזמין פיתוח. המנהלים שלך יקבלו לידים באופן מיידי.







