amoCRM — распространённая альтернатива Битрикс24 для отделов продаж. Если компания уже работает в ней, сайт на 1С-Битрикс нужно связать именно с amoCRM: заявки с форм должны попадать в воронку автоматически, а не переноситься руками из почты.
В отличие от связки с Битрикс24, здесь нет штатной интеграции — потребуется либо готовое решение из Маркетплейса, либо собственный код. Разберём оба пути, устройство API и то, что чаще всего ломается при передаче заявок.
Готовый модуль или свой код
| Критерий | Модуль из Маркетплейса | Своя интеграция |
|---|---|---|
| Скорость запуска | Часы | Дни |
| Гибкость | В рамках настроек | Полная |
| Обновления | Поддерживает разработчик | На вас |
| Стоимость | Лицензия, обычно ежегодно | Время разработчика |
| Когда выбирать | Типовые задачи, нет разработчика | Нестандартная логика, много полей |
Практический ориентир: если задача — «передавать заявки с трёх форм в одну воронку», берите готовый модуль. Если нужна сложная логика распределения, обогащение данными из каталога или двусторонний обмен — пишите своё.
Авторизация в API
amoCRM использует OAuth 2.0. В отличие от вебхука Битрикс24, где достаточно одного секретного адреса, здесь придётся работать с токенами и их обновлением.
Порядок получения доступа:
- В личном кабинете amoCRM создайте интеграцию в разделе для разработчиков.
- Получите client_id, client_secret и код авторизации.
- Обменяйте код на пару токенов:
access_tokenиrefresh_token. - Сохраните оба токена и время истечения.
Ключевая особенность: 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 означает отложенную отправку, а не потерянного клиента.
