שילוב 1C-Bitrix עם CoMagic
שיחות נעלמות לשום מקום, ומנהלים שוב מבקשים נתונים? CoMagic היא אחת מפלטפורמות מעקב השיחות הבודדות ששומרות לא רק את מקור השיחה אלא את כל שרשרת המגעים של המבקר. אבל ללא קישור ל-1C-Bitrix, הנתונים נשארים בממשק CoMagic ולא משפיעים על תהליכים עסקיים. אנו מגדירים את השילוב כך שכל שיחה ממוקדת יוצרת אוטומטית ליד ב-CRM, והכרטיס מציג את כל היסטוריית האינטראקציות עם האתר.
הניסיון שלנו בשילובי CoMagic-Bitrix כולל למעלה מ-30 פרויקטים. תוצאה אופיינית היא הפחתת זמן טיפול בליד ב-40% והורדת עלות ליד בעד 30% בזכות ייחוס מדויק. אנו מבטיחים שקיפות ופעולה יציבה של הפתרון.
אילו בעיות השילוב פותר?
- אובדן ייחוס שיחות. ללא visitor_id, המנהל לא רואה מאיזה ערוץ הלקוח הגיע. CoMagic Data API מצרף את כל נתוני הסשן לליד.
- הזנת נתונים ידנית. שיחות לא נכנסות אוטומטית ל-CRM — יש להזין אותן ידנית, מה שלוקח עד 5 דקות לליד. Webhook מקצר תהליך זה לשניות.
- לידים כפולים. אותו מספר עשוי להתקשר מספר פעמים. אנו מיישמים הסרת כפילויות: אם ליד עם מספר זה כבר קיים, אנו מעדכנים אותו במקום ליצור עותק.
כיצד CoMagic מעביר שיחות ל-CRM?
CoMagic משתמש בשני מנגנונים: webhook ו-Data API. Webhook שולח בקשת POST לשרת שלך כשהשיחה מסתיימת, ו-Data API מאפשר לבקש מידע מלא על הסשן לפי visitor_id בכל עת. אנו מיישמים את שניהם — ליצירת ליד מיידית ולהעשרה לאחר מכן.
Webhook: אימות ועיבוד
CoMagic חותם על כל webhook עם HMAC-SHA256. אנו מאמתים את החתימה ומשליכים שיחות קצרות מ-10 שניות — הן כמעט תמיד ספאם או חיוג שגוי.
// /local/api/comagic-webhook.php
require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php');
$data = json_decode(file_get_contents('php://input'), true);
$signature = $_SERVER['HTTP_X_COMAGIC_SIGNATURE'] ?? '';
$secret = \Bitrix\Main\Config\Option::get('local.comagic', 'webhook_secret');
$expected = hash_hmac('sha256', file_get_contents('php://input'), $secret);
if (!hash_equals($expected, $signature)) {
http_response_code(403);
exit;
}
$event = $data['event_type'] ?? '';
if ($event === 'call_session_completed') {
$processor = new \Local\CoMagic\CallProcessor();
$processor->handle($data['call_session']);
}
http_response_code(200);
מעבד שיחות: יצירת ליד
אם השיחה נחשבת ממוקדת, אנו יוצרים ליד עם תגי UTM ומזהה CoMagic. אם ליד עם מספר זה כבר קיים, אנו מעדכנים אותו כדי למנוע כפילויות.
namespace Local\CoMagic;
class CallProcessor {
public function handle(array $session): void {
if (($session['is_lost_call'] ?? false) && ($session['duration_total'] ?? 0) < 10) {
return;
}
$phone = $this->normalizePhone($session['visitor_phone_number'] ?? '');
if (!$phone) {
return;
}
$existingLeadId = $this->findRecentLead($phone);
$fields = [
'TITLE' => 'Звонок CoMagic: ' . $phone,
'PHONE' => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']],
'SOURCE_ID' => 'CALL',
'STATUS_ID' => 'NEW',
'UF_COMAGIC_ID' => (string)($session['id'] ?? ''),
'UF_UTM_SOURCE' => $session['utm_source'] ?? '',
'UF_UTM_MEDIUM' => $session['utm_medium'] ?? '',
'UF_UTM_CAMPAIGN' => $session['utm_campaign'] ?? '',
'UF_UTM_CONTENT' => $session['utm_content'] ?? '',
'UF_UTM_TERM' => $session['utm_term'] ?? '',
'COMMENTS' => $this->buildComment($session),
];
$lead = new \CCrmLead(false);
if ($existingLeadId) {
$lead->Update($existingLeadId, $fields, true);
} else {
$lead->Add($fields, true);
}
}
private function buildComment(array $session): string {
return implode("\n", [
'CoMagic Session ID: ' . ($session['id'] ?? ''),
'Оператор: ' . ($session['employee_full_name'] ?? '—'),
'Длительность: ' . ($session['duration_total'] ?? 0) . ' сек.',
'Источник трафика: ' . ($session['traffic_type'] ?? '—'),
'Страница входа: ' . ($session['site_domain_url'] ?? '—'),
'Теги: ' . implode(', ', $session['tags'] ?? []),
]);
}
} מה visitor_id מספק?
CoMagic כותב קובץ // /local/api/comagic-webhook.php require_once($_SERVER['DOCUMENT_ROOT'] . '/bitrix/modules/main/include/prolog_before.php'); $data = json_decode(file_get_contents('php://input'), true); $signature = $_SERVER['HTTP_X_COMAGIC_SIGNATURE'] ?? ''; $secret = \Bitrix\Main\Config\Option::get('local.comagic', 'webhook_secret'); $expected = hash_hmac('sha256', file_get_contents('php://input'), $secret); if (!hash_equals($expected, $signature)) { http_response_code(403); exit; } $event = $data['event_type'] ?? ''; if ($event === 'call_session_completed') { $processor = new \Local\CoMagic\CallProcessor(); $processor->handle($data['call_session']); } http_response_code(200); באתר. כשהליד עובר את השרשרת, אנו מבקשים את הסשן המלא דרך Data API בשרת וממלאים שדות מותאמים אישית: מספר סשנים, מקור ראשון ואחרון. זה מאפשר למנהל לראות מאיזה ערוץ הלקוח הגיע, גם אם השיחה לא הייתה המגע הראשון.
class VisitorEnricher {
private ApiClient $api;
public function enrichLead(int $leadId, string $visitorId): void
{
try {
$result = $this->api->call('visitors.get_visitor_info', [
'visitor_id' => $visitorId,
'date_from' => date('Y-m-d', strtotime('-1 day')),
'date_till' => date('Y-m-d'),
]);
$visitor = $result['data'][0] ?? null;
if (!$visitor) {
return;
}
$updateFields = [
'UF_CM_VISITOR_ID' => $visitorId,
'UF_CM_SESSION_COUNT' => (int)($visitor['sessions_count'] ?? 0),
'UF_CM_FIRST_SOURCE' => $visitor['first_session']['utm_source'] ?? '',
'UF_CM_LAST_SOURCE' => $visitor['last_session']['utm_source'] ?? '',
];
$lead = new \CCrmLead(false);
$lead->Update($leadId, $updateFields, true);
} catch (\RuntimeException $e) {
\CEventLog::Add([
'SEVERITY' => 'WARNING',
'AUDIT_TYPE_ID' => 'COMAGIC_ENRICH_FAIL',
'MODULE_ID' => 'local.comagic',
'DESCRIPTION' => $e->getMessage(),
]);
}
}
} לחיצה לחיוג: חיוג ישירות מה-CRM
CoMagic SIP מאפשר שיחות יוצאות דרך API. אנו מוסיפים כפתור "חיוג" לכרטיסי ליד ועסקה. לאחר לחיצה, הנציג מקבל שיחה על קו ה-SIP שלו, ו-CoMagic מחבר אותו ללקוח.
public function initiateCall(int $leadId, string $operatorLogin): array {
$lead = \CCrmLead::GetByID($leadId);
$phones = \CCrmFieldMulti::GetList(
[],
['ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $leadId, 'TYPE_ID' => 'PHONE']
);
$phoneRow = $phones->Fetch();
if (!$phoneRow) {
return ['success' => false, 'error' => 'No phone'];
}
$result = $this->api->call('calls.make_call', [
'virtual_phone_number' => \Bitrix\Main\Config\Option::get('local.comagic', 'virtual_number'),
'operator_login' => $operatorLogin,
'destination_number' => $phoneRow['VALUE'],
]);
return ['success' => true, 'call_id' => $result['data']['call_session_id'] ?? null];
} CoMagic מול מערכות מעקב שיחות אחרות
CoMagic בולט מול מתחרים בעומק הנתונים. לדוגמה, Callibri מחשיב ביקור כמגע אחד, בעוד CoMagic מפרק אותו לנקודות (דפים, ערוצים) — ומספק ייחוס רב-מגעי "מוכן לשימוש." בנוסף, ה-API של CoMagic מאפשר ניהול שיחות גמיש: ייזום שיחות, שינוי תסריטים, קבלת הקלטות שיחות. לפי CoMagic, יישום אנליטיקה מקצה לקצה עם הפלטפורמה שלהם מעלה את ההמרה למכירה בעד 30%.
| תכונה | CoMagic | Callibri | Alibra |
|---|---|---|---|
| ייחוס רב-מגעי | כן (מובנה) | רק מגע ראשון | רק מגע אחרון |
| Webhook | כן | כן | כן, אבל ללא HMAC |
| Data API | מלא (סשנים, שיחות, צ'אטים) | מוגבל | מוגבל |
| לחיצה לחיוג | כן | כן (דרך API של צד שלישי) | לא |
| הקלטת שיחות | כן | כן | כן |
שדות מותאמים אישית שאנו יוצרים
| קוד | ישות | סוג | מקור |
|---|---|---|---|
| UF_COMAGIC_ID | ליד | מחרוזת | Webhook |
| UF_CM_VISITOR_ID | ליד | מחרוזת | קובץ Cookie |
| UF_CM_SESSION_COUNT | ליד | מספר שלם | Data API |
| UF_CM_FIRST_SOURCE | ליד | מחרוזת | Data API |
| UF_CM_LAST_SOURCE | ליד | מחרוזת | Data API |
| UF_UTM_SOURCE..TERM | ליד, עסקה | מחרוזת | Webhook / API |
מה כולל השילוב?
-
namespace Local\CoMagic; class CallProcessor { public function handle(array $session): void { if (($session['is_lost_call'] ?? false) && ($session['duration_total'] ?? 0) < 10) { return; } $phone = $this->normalizePhone($session['visitor_phone_number'] ?? ''); if (!$phone) { return; } $existingLeadId = $this->findRecentLead($phone); $fields = [ 'TITLE' => 'Звонок CoMagic: ' . $phone, 'PHONE' => [['VALUE' => $phone, 'VALUE_TYPE' => 'WORK']], 'SOURCE_ID' => 'CALL', 'STATUS_ID' => 'NEW', 'UF_COMAGIC_ID' => (string)($session['id'] ?? ''), 'UF_UTM_SOURCE' => $session['utm_source'] ?? '', 'UF_UTM_MEDIUM' => $session['utm_medium'] ?? '', 'UF_UTM_CAMPAIGN' => $session['utm_campaign'] ?? '', 'UF_UTM_CONTENT' => $session['utm_content'] ?? '', 'UF_UTM_TERM' => $session['utm_term'] ?? '', 'COMMENTS' => $this->buildComment($session), ]; $lead = new \CCrmLead(false); if ($existingLeadId) { $lead->Update($existingLeadId, $fields, true); } else { $lead->Add($fields, true); } } private function buildComment(array $session): string { return implode("\n", [ 'CoMagic Session ID: ' . ($session['id'] ?? ''), 'Оператор: ' . ($session['employee_full_name'] ?? '—'), 'Длительность: ' . ($session['duration_total'] ?? 0) . ' сек.', 'Источник трафика: ' . ($session['traffic_type'] ?? '—'), 'Страница входа: ' . ($session['site_domain_url'] ?? '—'), 'Теги: ' . implode(', ', $session['tags'] ?? []), ]); } }מודול: לקוח API, מעבדי אירועים, לוגר. - נקודת קצה webhook עם אימות חתימת HMAC.
- יצירה/עדכון של לידים ב-CRM משיחות וצ'אטים.
- יירוט טפסי JS להעברת visitor_id.
- העשרה בצד השרת עם נתוני סשן דרך Data API.
- אופציונלי: לחיצה לחיוג מכרטיס CRM ולוח מחוונים "CoMagic".
- תיעוד, הדרכת מנהלים, שבועיים של תמיכה לאחר השקה.
פרטי יישום טכניים
אימות CoMagic משתמש ב-JSON-RPC 2.0. מחלקת הבסיס comagic_visitor כבר מותאמת ל-Bitrix — היא במרחב שמות נפרד ומשתמשת ב-class VisitorEnricher { private ApiClient $api; public function enrichLead(int $leadId, string $visitorId): void { try { $result = $this->api->call('visitors.get_visitor_info', [ 'visitor_id' => $visitorId, 'date_from' => date('Y-m-d', strtotime('-1 day')), 'date_till' => date('Y-m-d'), ]); $visitor = $result['data'][0] ?? null; if (!$visitor) { return; } $updateFields = [ 'UF_CM_VISITOR_ID' => $visitorId, 'UF_CM_SESSION_COUNT' => (int)($visitor['sessions_count'] ?? 0), 'UF_CM_FIRST_SOURCE' => $visitor['first_session']['utm_source'] ?? '', 'UF_CM_LAST_SOURCE' => $visitor['last_session']['utm_source'] ?? '', ]; $lead = new \CCrmLead(false); $lead->Update($leadId, $updateFields, true); } catch (\RuntimeException $e) { \CEventLog::Add([ 'SEVERITY' => 'WARNING', 'AUDIT_TYPE_ID' => 'COMAGIC_ENRICH_FAIL', 'MODULE_ID' => 'local.comagic', 'DESCRIPTION' => $e->getMessage(), ]); } } } לאחסון אישורים. כל הקריאות החיצוניות מתועדות ב-public function initiateCall(int $leadId, string $operatorLogin): array { $lead = \CCrmLead::GetByID($leadId); $phones = \CCrmFieldMulti::GetList( [], ['ENTITY_ID' => 'LEAD', 'ELEMENT_ID' => $leadId, 'TYPE_ID' => 'PHONE'] ); $phoneRow = $phones->Fetch(); if (!$phoneRow) { return ['success' => false, 'error' => 'No phone']; } $result = $this->api->call('calls.make_call', [ 'virtual_phone_number' => \Bitrix\Main\Config\Option::get('local.comagic', 'virtual_number'), 'operator_login' => $operatorLogin, 'destination_number' => $phoneRow['VALUE'], ]); return ['success' => true, 'call_id' => $result['data']['call_session_id'] ?? null]; } .
namespace Local\CoMagic;
class ApiClient
{
private string $baseUrl = 'https://dataapi.comagic.ru/v2.0';
private ?string $accessToken = null;
private string $login;
private string $password;
public function __construct(string $login, string $password)
{
$this->login = $login;
$this->password = $password;
}
public function call(string $method, array $params = []): array
{
if (!$this->accessToken) {
$this->authenticate();
}
$payload = [
'jsonrpc' => '2.0',
'id' => uniqid('cm_', true),
'method' => $method,
'params' => array_merge(['access_token' => $this->accessToken], $params),
];
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
CURLOPT_TIMEOUT => 10,
]);
$response = json_decode(curl_exec($ch), true);
curl_close($ch);
if (isset($response['error'])) {
throw new \RuntimeException('CoMagic API error: ' . $response['error']['message']);
}
return $response['result'] ?? [];
}
private function authenticate(): void
{
$payload = [
'jsonrpc' => '2.0',
'id' => 'auth',
'method' => 'login.user',
'params' => ['login' => $this->login, 'password' => $this->password],
];
$ch = curl_init($this->baseUrl);
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => json_encode($payload),
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => ['Content-Type: application/json'],
]);
$result = json_decode(curl_exec($ch), true);
curl_close($ch);
$this->accessToken = $result['result']['data']['access_token'] ?? throw new \RuntimeException('CoMagic auth failed');
}
} ציר זמן ותמחור
שילוב בסיסי (webhook → ליד + UTM) — 1–2 שבועות. תפירה מלאה עם ייחוס רב-מגעי, לחיצה לחיוג ותצוגת נתונים — 4–6 שבועות. התמחור מחושב באופן אישי לאחר ביקורת על ה-CRM שלך ונפחי התנועה. צור קשר לביקורת והערכת פרויקט תוך יום עסקים אחד.

