Главная » Интеграции » Интеграция Битрикс с amoCRM: передача заявок в воронку

Интеграция Битрикс с amoCRM: передача заявок в воронку

Схема интеграции сайта на Битрикс с amoCRM: заявка с формы создаёт сделку с контактом через API

amoCRM — распространённая альтернатива Битрикс24 для отделов продаж. Если компания уже работает в ней, сайт на 1С-Битрикс нужно связать именно с amoCRM: заявки с форм должны попадать в воронку автоматически, а не переноситься руками из почты.

В отличие от связки с Битрикс24, здесь нет штатной интеграции — потребуется либо готовое решение из Маркетплейса, либо собственный код. Разберём оба пути, устройство API и то, что чаще всего ломается при передаче заявок.

Готовый модуль или свой код

Критерий Модуль из Маркетплейса Своя интеграция
Скорость запуска Часы Дни
Гибкость В рамках настроек Полная
Обновления Поддерживает разработчик На вас
Стоимость Лицензия, обычно ежегодно Время разработчика
Когда выбирать Типовые задачи, нет разработчика Нестандартная логика, много полей

Практический ориентир: если задача — «передавать заявки с трёх форм в одну воронку», берите готовый модуль. Если нужна сложная логика распределения, обогащение данными из каталога или двусторонний обмен — пишите своё.

Авторизация в API

amoCRM использует OAuth 2.0. В отличие от вебхука Битрикс24, где достаточно одного секретного адреса, здесь придётся работать с токенами и их обновлением.

Порядок получения доступа:

  1. В личном кабинете amoCRM создайте интеграцию в разделе для разработчиков.
  2. Получите client_id, client_secret и код авторизации.
  3. Обменяйте код на пару токенов: access_token и refresh_token.
  4. Сохраните оба токена и время истечения.

Ключевая особенность: access_token живёт ограниченное время и его нужно обновлять по refresh_token. Интеграция, где это не предусмотрено, однажды просто перестаёт работать — обычно в самый неудобный момент.

Токены удобно хранить в настройках модуля:

<?php

use Bitrix\Main\Config\Option;

Option::set('amocrm', 'access_token',  $accessToken);
Option::set('amocrm', 'refresh_token', $refreshToken);
Option::set('amocrm', 'expires_at',    time() + $expiresIn);

Механика хранилища разобрана в статье Bitrix\Main\Config\Option.

Обновление токена

<?php

use Bitrix\Main\Web\HttpClient;
use Bitrix\Main\Web\Json;
use Bitrix\Main\Config\Option;

function getAmoToken(): ?string
{
    $expiresAt = (int)Option::get('amocrm', 'expires_at', 0);

    // обновляем заранее, за пять минут до истечения
    if ($expiresAt > time() + 300) {
        return Option::get('amocrm', 'access_token');
    }

    $http = new HttpClient(['waitResponse' => true]);

    $response = $http->post('https://your-domain.amocrm.ru/oauth2/access_token', Json::encode([
        'client_id'     => Option::get('amocrm', 'client_id'),
        'client_secret' => Option::get('amocrm', 'client_secret'),
        'grant_type'    => 'refresh_token',
        'refresh_token' => Option::get('amocrm', 'refresh_token'),
        'redirect_uri'  => 'https://site.ru/amocrm/callback.php',
    ]));

    $data = Json::decode($response);

    if (empty($data['access_token'])) {
        return null;
    }

    Option::set('amocrm', 'access_token',  $data['access_token']);
    Option::set('amocrm', 'refresh_token', $data['refresh_token']);
    Option::set('amocrm', 'expires_at',    time() + $data['expires_in']);

    return $data['access_token'];
}

Обратите внимание: refresh_token тоже обновляется при каждом обмене. Если сохранить только новый access_token, следующее обновление не пройдёт.

Нужна помощь с Битрикс?





    Создание сделки с контактом

    Заявку с сайта обычно заводят как сделку вместе с контактом. amoCRM позволяет сделать это одним запросом через сложное добавление:

    <?php
    
    use Bitrix\Main\Web\HttpClient;
    use Bitrix\Main\Web\Json;
    
    $token = getAmoToken();
    
    if (!$token) {
        return;
    }
    
    $payload = [[
        'name'  => 'Заявка с сайта',
        'price' => 0,
        '_embedded' => [
            'contacts' => [[
                'first_name' => $data['name'],
                'custom_fields_values' => [
                    [
                        'field_code' => 'PHONE',
                        'values'     => [['value' => $data['phone']]],
                    ],
                ],
            ]],
        ],
    ]];
    
    $http = new HttpClient([
        'waitResponse' => true,
        'socketTimeout' => 10,
    ]);
    
    $http->setHeader('Authorization', 'Bearer ' . $token);
    $http->setHeader('Content-Type', 'application/json');
    
    $response = $http->post(
        'https://your-domain.amocrm.ru/api/v4/leads/complex',
        Json::encode($payload)
    );

    Тело запроса здесь — массив массивов: API принимает несколько сущностей за раз. Передача одного объекта вместо массива — типичная причина ошибки 400 при первых экспериментах.

    Пользовательские поля

    Стандартных полей обычно не хватает: нужно передать источник заявки, UTM-метки, страницу, комментарий. В amoCRM это пользовательские поля, и обращаться к ним нужно по идентификатору, а не по названию.

    <?php
    
    'custom_fields_values' => [
        [
            'field_id' => 123456,   // ID поля из настроек amoCRM
            'values'   => [['value' => $data['utm_source']]],
        ],
    ],

    Идентификаторы полей отличаются в каждом аккаунте. Их получают запросом к /api/v4/leads/custom_fields и сохраняют в настройки — прописывать числа прямо в коде неудобно при переносе на другой аккаунт.

    Проверка дублей

    Если посетитель отправил форму трижды, в воронке появятся три сделки. Перед созданием стоит проверить, нет ли уже контакта с таким телефоном:

    GET /api/v4/contacts?query=79001234567

    При найденном контакте разумнее привязать новую сделку к нему или дописать примечание к существующей, чем плодить дубли. Менеджер увидит всю историю обращений в одной карточке.

    Надёжность интеграции

    Главное правило: отправка формы не должна зависеть от доступности amoCRM. Если сервис не отвечает, посетитель обязан увидеть «Спасибо за заявку», а не ошибку.

    Что для этого нужно:

    • Таймауты. Без них зависший запрос заблокирует отправку формы на десятки секунд.
    • Сохранение заявки у себя. Записывайте её в базу сайта или отправляйте письмом — тогда данные не потеряются при сбое CRM.
    • Логирование ошибок. Молчаливый сбой обнаружится через неделю, когда менеджеры заметят отсутствие заявок.
    • Повторная отправка. Неотправленные заявки можно складывать в очередь и досылать агентом — механика описана в статье Агенты в Битрикс.

    Ограничения API

    • частота запросов ограничена — массовые операции выполняйте пакетами;
    • за один запрос можно передать ограниченное число сущностей;
    • токен привязан к домену аккаунта — при смене поддомена интеграция отвалится;
    • идентификаторы полей и воронок различаются в разных аккаунтах.

    Частые ошибки

    • Не обновляется refresh_token. Интеграция работает несколько недель и внезапно перестаёт.
    • Объект вместо массива в теле запроса. API отвечает ошибкой 400.
    • Поля по названию вместо идентификатора. Значения не сохраняются.
    • Нет таймаутов. Недоступность CRM тормозит отправку формы.
    • Ключи в репозитории. client_secret — это доступ к базе клиентов компании.
    • Заявка нигде не дублируется. При сбое интеграции данные теряются безвозвратно.

    Итог

    Интеграция сайта на 1С-Битрикс с amoCRM делается либо готовым модулем из Маркетплейса, либо своим кодом через API v4. Ключевое отличие от связки с Битрикс24 — авторизация по OAuth с токенами, которые нужно своевременно обновлять.

    Три вещи определяют, будет ли интеграция работать в бою: корректное обновление refresh_token, обращение к пользовательским полям по идентификаторам и независимость формы от доступности CRM. Заявка должна сохраняться на стороне сайта в любом случае — тогда сбой в CRM означает отложенную отправку, а не потерянного клиента.

    Нужна помощь с Битрикс?

    Исправим ошибку, доработаем сайт, ускорим Битрикс или поможем разобраться с проблемой.

    Услуги
    Инструменты
    База знаний