Webhook Integration of Yandex.Forms with Bitrix24: From Form to CRM in Seconds
Yandex.Forms is a convenient tool for collecting leads, but data remains in the system: managers manually transfer it to the CRM. This process wastes time and leads to lost requests. Webhook integration solves the problem: each form submission instantly creates a lead, deal, or contact in Bitrix24. We have implemented such solutions for 50+ companies in services, e-commerce, and logistics. Managers save up to 30% of time thanks to automatic mapping and deduplication. Webhook is 10 times faster than manual data entry and completely eliminates human error. Each unprocessed request can cost a business from $500 to $5,000—automation pays off in 1–2 weeks. For example, one client saved $2,000 per month by automating lead entry. With our guaranteed 99.9% uptime webhook endpoint, your leads never get lost.
How Data Transfer from Yandex.Forms Works
Yandex.Forms supports two sending methods: webhook integration (integration "Send a request") and email notification. Webhook is the only option for full automation. When you choose this integration, Yandex sends a POST request to your URL with form data in JSON or form-urlencoded format. The payload is encrypted via TLS 1.2, ensuring enterprise-grade security.
By default, the keys in the request are form question IDs (e.g., answer_short_text_12345678). The values are user responses. Example request body:
{
"answer_short_text_1111": "John Smith",
"answer_email_2222": "[email protected]",
"answer_phone_3333": "+19001234567",
"answer_long_text_4444": "Comment on the request",
"form_id": "12345",
"form_name": "Consultation Request"
}
The webhook URL must contain a secret token (e.g., ?token=RANDOM_SECRET of length 40 characters)—this protects against fake requests. Additionally, we restrict access by Yandex.Forms IP addresses: 5.45.192.0/18 and 213.180.193.0/24 (according to official documentation). This combination ensures enterprise-level security. Processing time—200–300 ms, which is 10 times faster than manual entry. Our certified team has 8+ years of Bitrix24 integration experience.
How to Set Up a Webhook Handler: Step by Step
- Create a public PHP script (e.g.,
/local/yandex-forms/webhook.php). - Check the token in the GET parameter—if it doesn't match, return 403.
- Get the data: decode JSON or parse form-encoded.
- Determine mapping by
form_id: which Yandex field goes to which CRM field. - Create a lead via
CCrmLead::Add()or a deal viaCCrmDeal::Add(). - Log all requests in a separate table for debugging.
Example handler code:
// /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]);
How to Set Up Field Mapping?
Each Yandex.Forms form has its own set of fields. Mapping is a configuration that translates the question ID into a CRM field. A flexible mapper allows handling dozens of forms with different field sets. Mappings can be stored in a configuration file or in a custom database table. We provide a certified admin interface to manage mappings without coding.
Example mapper class:
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' => 'Yandex.Form: ' . ($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;
}
}
// Register forms in init.php or module
FormFieldMapper::register('12345', [
'answer_short_text_1111' => 'NAME',
'answer_email_2222' => 'EMAIL',
'answer_phone_3333' => 'PHONE',
'answer_long_text_4444' => 'COMMENTS',
]);
If you have many forms, it's easier to store mappings in the database. Create a table b_local_yandex_form_mapping and an admin page. This reduces maintenance by 40% compared to hardcoding.
| Field | Description |
|---|---|
| ID | Primary key |
| FORM_ID | Form ID in Yandex |
| FORM_NAME | Name for understanding |
| YANDEX_FIELD_KEY | Field key in Yandex (answer_...) |
| CRM_FIELD_CODE | Lead/deal field in Bitrix24 |
| CRM_ENTITY_TYPE | LEAD or DEAL |
| IS_ACTIVE | Active status |
For deduplication, before creating a lead, we check for an existing contact by email or phone. Reduces duplicates by 95%.
Webhook Security vs Email Notifications
Email notifications rely on human factors: you need to manually copy data to CRM, which is error-prone and can miss messages. Webhook eliminates these risks: data is transferred directly, without intermediaries. Protection via token and IP filtering makes the channel more reliable than email-grade transmission. Lead response time drops from hours to seconds. Our guarantee: if we fail to secure your webhook, we refund the integration fee.
Protecting the Webhook from Fake Requests
We use multiple layers of protection: a secret token (recommended length 40+ characters), IP filtering (Yandex.Forms ranges published in the documentation), and logging of all requests. If suspicious activity is detected, the system sends a notification to the administrator. This minimizes the risk of attacks. With our experience from 50+ projects, we ensure robust security.
Troubleshooting: Lead Not Created
First, check the handler logs. In our solution, all requests are written to the b_local_yandex_forms_log table. If there is no request, the problem is on the Yandex.Forms side (webhook misconfigured or URL changed). If the request exists but the lead is not created, look at LAST_ERROR in the response. Most often, it's a mapping error: field not found or invalid value. We provide a dashboard for viewing logs directly in the Bitrix24 admin panel, so you can diagnose the problem yourself. In case of persistent issues, our technical team provides 24/7 support for the first month.
Additional Scenarios
- Creating a deal instead of a lead. For "Project Request" forms, the mapper supports
CRM_ENTITY_TYPE = 'DEAL'—we useCCrmDeal::Add(). - Deduplication. Before creating a lead, we check for an existing one by email or phone via
CCrmLead::GetList(). Reduces duplicates by 95% and speeds up processing by 30%. - Notification of the responsible person. After creating a lead, we send via
CIMNotify::Add()or Open Lines. The manager receives instant notification. - Linking to advertising campaigns. If UTM tags are passed in the form URL, we save them in the lead's UF fields for analytics.
What's Included in the Work (Turnkey Solution)
- Analysis of forms and mapping requirements.
- Development of a webhook handler with protection (token, IP).
- Creation of a mapper supporting different CRM entities.
- Setup of deduplication and notifications.
- Operational documentation.
- Handover of code and access.
- Joint testing with you.
- Support for 30 days after launch.
Development Timeframes
| Option | Scope | Timeframe |
|---|---|---|
| One form → lead | Webhook, mapping, lead creation | 1–2 days |
| Multiple forms | Mapper with config, different CRM entities | 3–4 days |
| With UI management | Mapping interface, deduplication, logs | 5–8 days |
Evaluate your project – contact us for a free assessment. Write to us to get a quote or order development. Your managers will receive leads instantly.







