Как использовать сквозную аналитику при создании сделки и контакта

Scope: crm

Кто может выполнять метод: пользователи с административным доступом к разделу CRM

Если вы разрабатываете интеграции для Битрикс24 с помощью AI-инструментов (Codex, Claude Code, Cursor), подключите MCP-сервер, чтобы ассистент использовал официальную REST-документацию.

Пример использования сквозной аналитики при создании сделки и контакта. Предварительно создайте php-страницу с веб-формой обратной связи: Ф.И.О, телефон. На странице разместите код примера.

Что происходит во время выполнения кода?

  1. Подключается стандартный js-код из сквозной аналитики Битрикс24
  2. После заполнения формы, помимо полей формы, в скрытом поле передается код для сквозной аналитики b24Tracker.guest.getTrace()
  3. Далее создается сделка и связанный контакт
  4. И затем регистрируется «след» аналитики для этих объектов, с передачей их типов и идентификаторов вида:
/rest/crm.tracking.trace.add?ENTITIES[0][TYPE]=CONTACT&ENTITIES[0][ID]=3215&ENTITIES[1][TYPE]=LEAD&ENTITIES[1][ID]=1&TRACE=…
        

Скрипт сквозной аналитики устанавливается на вашем сайте перед закрывающим тегом </body> на всех страницах сайта, включая страницу с формой.

<!DOCTYPE html>
        <html lang="ru">
        <head>
            <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
        </head>
        <body class="container">
        <h1>Feedback</h1>
        <div class="col-12">
            <p id="message"></p>
        </div>
        <form id="feedbackForm">
            <input type="hidden" id="FORM_TRACE" name="TRACE">
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Name*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="NAME" required>
                </div>
            </div>
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Last name*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="LAST_NAME" required>
                </div>
            </div>
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Phone*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="PHONE" required>
                </div>
            </div>
            <div class="row">
                <div class="col-sm-10">
                    <input type="submit" class="btn btn-primary" value="Send">
                </div>
            </div>
        </form>
        <script>
            document.getElementById('feedbackForm').addEventListener('submit', function(event) {
                event.preventDefault();
                var formData = new FormData(event.target);
                var fields = {
                    NAME: formData.get('NAME'),
                    LAST_NAME: formData.get('LAST_NAME'),
                    PHONE: [{ value: formData.get('PHONE') }]
                };
        
                BX24.callMethod(
                    'crm.contact.add',
                    { fields: fields },
                    function(resultContact) {
                        if (resultContact.error()) {
                            document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultContact.error_description();
                        } else {
                            var arDealFields = {
                                TITLE: 'Feedback page: ' + formData.get('NAME') + ' ' + formData.get('LAST_NAME'),
                                CONTACT_ID: resultContact.data()
                            };
        
                            BX24.callMethod(
                                'crm.deal.add',
                                { fields: arDealFields },
                                function(resultDeal) {
                                    if (resultDeal.error()) {
                                        document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultDeal.error_description();
                                    } else {
                                        if (formData.get('TRACE')) {
                                            BX24.callMethod(
                                                'crm.tracking.trace.add',
                                                {
                                                    ENTITIES: [
                                                        { TYPE: 'CONTACT', ID: resultContact.data() },
                                                        { TYPE: 'DEAL', ID: resultDeal.data() }
                                                    ],
                                                    TRACE: formData.get('TRACE')
                                                },
                                                function(resultTrace) {
                                                    if (resultTrace.error()) {
                                                        document.getElementById('message').innerText = 'Feedback has not been saved: ' + resultTrace.error_description();
                                                    } else {
                                                        document.getElementById('message').innerText = 'Feedback saved';
                                                    }
                                                }
                                            );
                                        } else {
                                            document.getElementById('message').innerText = 'Feedback saved';
                                        }
                                    }
                                }
                            );
                        }
                    }
                );
            });
        
            window.onload = function(e) {
                var traceDom = document.getElementById('FORM_TRACE');
                if (traceDom) {
                    var trace = b24Tracker.guest.getTrace();
                    traceDom.value = trace;
                }
            }
        </script>
        </body>
        </html>
        

Примечание

Для использования примеров на PHP настройте работу класса CRest и подключите файл crest.php в файлах, где используется этот класс. Подробнее

<!DOCTYPE html>
        <html lang="ru">
        <head>
            <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/4.3.1/css/bootstrap.min.css" crossorigin="anonymous">
        </head>
        <body class="container">
        <h1>Feedback</h1>
        <?
        include("crest.php");
        $message = '';
        if(!empty($_POST['SAVE']))
        {
            $fields = [
                'NAME' => $_POST['NAME'],
                'LAST_NAME' => $_POST['LAST_NAME'],
                'PHONE' => [ [ 'value'=>$_POST['PHONE'] ] ],
            ];
            $resultContact = CRest::call(
                'crm.contact.add',
                [
                    'fields' => $fields
                ]
            );
            if (!empty($resultContact['result']))
            {
                $arDealFields = [
                    'TITLE' => 'Feedback page: '.$_POST['NAME'].' '.$_POST['LAST_NAME'],
                    'CONTACT_ID' => $resultContact['result']
                ];
                $resultDeal = CRest::call(
                    'crm.deal.add',
                    [
                        'fields' => $arDealFields
                    ]
                );
                if (!empty($resultDeal['result']))
                {
                    if(!empty($_POST['TRACE']))
                    {
                        $resultTrace = CRest::call(
                            'crm.tracking.trace.add',
                            [
                                'ENTITIES' => [
                                    [
                                        'TYPE' => 'CONTACT',//COMPANY, CONTACT, DEAL, LEAD, QUOTE
                                        'ID' => $resultContact['result']
                                    ],
                                    [
                                        'TYPE' => 'DEAL',//COMPANY, CONTACT, DEAL, LEAD, QUOTE
                                        'ID' => $resultDeal['result']
                                    ]
                                ],
                                'TRACE' =>    $_POST['TRACE']
                            ]
                        );
                    }
                    $message = 'Feedback saved';
                }
                elseif (!empty($resultDeal['error_description']))
                {
                    $message =    'Feedback has not been saved: '.$resultDeal['error_description'];
                }
                else
                {
                    $message = 'Feedback has not been saved';
                }
            }
            elseif (!empty($resultContact['error_description']))
            {
                $message =    'Feedback has not been saved: '. $resultContact['error_description'];
            }
            else
            {
                $message = 'Feedback has not been saved';
            }
        }
        ?>
        <div class="col-12">
            <p><?=$message?></p>
        </div>
        <form method="post" action="">
            <input type="hidden" id="FORM_TRACE" name="TRACE">
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Name*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="NAME" required>
                </div>
            </div>
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Last name*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="LAST_NAME" required>
                </div>
            </div>
            <div class="row">
                <div class="col-4 mt-3">
                    <label>Phone*</label>
                </div>
                <div class="col-6 mt-3">
                    <input type="text" name="PHONE" required>
                </div>
            </div>
            <div class="row">
                <div class="col-sm-10">
                    <input type="submit" name="SAVE" class="btn btn-primary" value="Send">
                </div>
            </div>
        </form>
        <script>
            window.onload = function(e){
                var traceDom = document.getElementById('FORM_TRACE');
                if(traceDom)
                {
                    var trace = b24Tracker.guest.getTrace();
                    traceDom.value = trace;
                }
            }
        </script>
        </body>
        </html>