Интеграция сайта с CRM нужна не для того, чтобы после отправки формы «где-то появилась ещё одна запись».
Нормальная связка должна сохранить контекст обращения: кто оставил заявку, с какой страницы пришёл, что хотел заказать, из какой рекламы попал на сайт, существовал ли этот человек в CRM раньше и что с обращением произошло дальше.
Если просто отправлять имя и телефон, интеграция формально будет работать. Но менеджер всё равно потеряет часть информации, появятся дубли, UTM-метки пропадут, а через несколько месяцев никто не сможет уверенно сказать, откуда взялся конкретный клиент.
Разберём, как связать сайт и CRM так, чтобы интеграция действительно помогала работе, а не просто переносила данные из одной формы в другую.
Что значит интегрировать сайт с CRM
Самый простой сценарий выглядит так:
форма на сайте → CRM
Пользователь отправил заявку, и в CRM появился лид или сделка.
Но в реальном проекте цепочка обычно длиннее:
сайт → проверка данных → поиск существующего клиента → контакт → лид/сделка → источник → ответственный → уведомление → дальнейший статус
А если на сайте есть корзина или личный кабинет:
заказ → клиент → товары → сумма → CRM → изменение статуса → сайт
То есть интеграция — это не один HTTP-запрос. Это набор правил, по которым две системы должны одинаково понимать одного клиента и одну бизнес-операцию.
Что обычно передают с сайта в CRM
Набор полей зависит от проекта, но чаще всего нужны четыре группы данных.
Контактные данные
Базовый набор:
- имя;
- телефон;
- email;
- компания;
- комментарий.
Но даже здесь нужно заранее определить правила.
Например, телефон:
+7 999 123-45-67
и:
89991234567
для человека выглядят как один номер, а для наивной проверки могут оказаться двумя разными значениями.
Если перед созданием контакта не нормализовать данные и не проверить существующие записи, CRM быстро заполнится дублями.
Данные заявки или заказа
Например:
- тип услуги;
- товар;
- количество;
- сумма;
- номер заказа;
- выбранный тариф;
- сообщение пользователя;
- прикреплённый файл;
- способ связи.
У контакта и заявки разные роли.
Контакт отвечает на вопрос «кто это?».
Лид, сделка или заказ — «что этот человек сейчас хочет?».
Если один клиент оставил три заявки, обычно не нужно создавать три одинаковых контакта. А вот три обращения вполне могут быть отдельными сделками.
Источник обращения
Очень полезно передавать не только поле вроде:
Источник: сайт
но и конкретный контекст:
- URL страницы;
- referrer;
- UTM source;
- UTM medium;
- UTM campaign;
- UTM content;
- UTM term;
- рекламный идентификатор, если он используется;
- первая или последняя точка входа — в зависимости от принятой модели аналитики.
Иначе через месяц все записи в CRM будут выглядеть одинаково:
Источник: сайт
Хотя один клиент пришёл из поиска, другой — из рекламы, третий — из рассылки, четвёртый — со страницы конкретной услуги.
Технический контекст
Иногда стоит сохранять и служебные данные:
- ID заявки на сайте;
- ID заказа;
- timestamp;
- ID пользователя;
- URL формы;
- версия формы;
- внешний идентификатор интеграции.
Пользователю эти поля не нужны. Зато при сбое по ним можно восстановить цепочку и понять, какая запись в CRM относится к какой операции на сайте.
Сначала определите, что должно происходить после заявки
Это один из самых полезных вопросов до написания кода.
Допустим, пользователь заполнил форму:
Имя: Алексей
Телефон: +7…
Интересует настройка сайта
Что должна сделать CRM?
Вариантов много:
- создать новый контакт;
- найти существующий контакт по телефону;
- создать лид;
- создать сделку в конкретной воронке;
- связать сделку с найденным контактом;
- назначить менеджера;
- поставить задачу;
- сохранить UTM;
- отправить уведомление;
- вернуть идентификатор CRM обратно сайту.
Если эти правила не определить заранее, интеграция обычно превращается в:
«Отправим всё, что есть, а потом разберёмся».
Потом и приходится разбираться с сотнями дублей.
Контакт, лид и сделка — не одно и то же
У разных CRM терминология немного отличается, но принцип похож.
Например, в Bitrix24 лид используется как один из объектов CRM, а для новых разработок официальная REST-документация рекомендует универсальные методы crm.item.* вместо старых crm.lead.* и crm.deal.*, развитие которых для основных операций прекращено.
В amoCRM через API отдельно работают с контактами и сделками; между сущностями можно создавать связи.
Для архитектуры интеграции важнее не название объекта, а смысл.
Например:
Иван Петров
↓
контакт
↓
┌──────┴──────┐
↓ ↓
Заявка №1 Заявка №2Если каждый раз создавать и нового Ивана Петрова, и новую заявку, база быстро станет бесполезной.
Как подключить CRM к сайту
Есть четыре распространённых варианта.
Готовая интеграция CMS или формы
Самый простой путь.
Например, модуль интернет-магазина или форма уже умеет отправлять данные в нужную CRM.
Плюсы очевидны:
- быстро;
- меньше собственного кода;
- стандартные сценарии уже реализованы.
Но обязательно проверьте, что именно передаёт модуль.
Иногда интеграция умеет создать лид, но:
- не передаёт UTM;
- всегда создаёт новый контакт;
- не умеет выбрать воронку;
- теряет товары заказа;
- неправильно сопоставляет пользовательские поля.
То есть надпись «есть интеграция с CRM» ещё не означает, что она подходит вашему процессу.
Коннектор или сервис автоматизации
Между сайтом и CRM можно поставить промежуточный сервис.
Схема:
сайт → коннектор → CRM
Это удобно, когда требуется несложная автоматизация без собственной серверной интеграции.
Например:
новая заявка → создать сделку → отправить сообщение → записать строку в таблицу
Но появляется дополнительное звено.
Если что-то перестало передаваться, нужно понимать:
- сайт не отправил;
- коннектор не получил;
- сценарий в коннекторе упал;
- CRM отклонила запрос.
Чем длиннее цепочка, тем важнее журналирование.
Webhook
Webhook часто используют для простого события:
произошло действие — отправить данные на другой URL.
Например:
форма отправлена → POST → integration.example.ru
Дальше ваш сервер сам решает, что делать с данными.
В обратную сторону CRM тоже может использовать webhooks. Например, amoCRM поддерживает подписку на события через API, а webhook может быть подписан сразу на несколько событий.
Webhook используют там, где одна система должна сообщить другой о произошедшем событии:
- создана заявка;
- изменился статус;
- создан заказ;
- сделка перешла на этап;
- клиент изменил данные.
Но webhook — это не полноценная замена API.
Webhook сообщает:
«что-то произошло».
API позволяет спросить или изменить:
«что сейчас находится в системе?»
Прямая интеграция через API
Она нужна, когда бизнес-логика сложнее простого переноса формы.
Например, нужно:
- найти контакт по телефону;
- если его нет — создать;
- проверить активные сделки;
- создать новую сделку;
- заполнить пользовательские поля;
- привязать контакт;
- добавить товары;
- назначить ответственного;
- сохранить полученные ID на сайте.
Такой сценарий уже удобнее контролировать собственным кодом.
Webhook и API обычно работают вместе
Это важное различие.
Представим двустороннюю интеграцию.
Сайт создаёт заказ:
сайт → API CRM → сделкаМенеджер потом переводит сделку в статус «Выполнено».
CRM сообщает сайту:
CRM → webhook → сайтСайт получает событие и обновляет внутренний заказ.
Получается нормальная двусторонняя схема:
API
сайт ───────→ CRM
↑ │
└─────────────┘
webhookПытаться сделать всю синхронизацию только webhooks или только периодическими API-запросами обычно сложнее.
Самая неприятная проблема — дубли
Допустим, человек дважды отправил форму.
Или первый запрос прошёл, но браузер не получил ответ и повторил отправку.
Или ваш сервер получил timeout от CRM и решил повторить запрос, хотя CRM уже успела создать запись.
Результат:
Иван Петров
Иван Петров
Иван Петрови три одинаковые сделки.
Поэтому до создания новой сущности нужно определить правила дедупликации.
Например:
Контакт:
нормализованный телефон → email → внешний ID
Заявка:
website_request_id
Заказ:
order_id
У CRM-записи также полезно сохранять внешний идентификатор сайта, а на сайте — ID объекта CRM.
Получается двусторонняя связь:
site order 1527
↕
CRM deal 83421Тогда повторный запрос можно распознать.
Почему одного поиска по телефону иногда недостаточно
Телефон хорошо подходит для большинства лидов, но не всегда.
Один человек может:
- использовать несколько номеров;
- оставить рабочий и личный email;
- оформить заказ от разных компаний.
И наоборот, один номер иногда используют несколько сотрудников компании.
Поэтому правило дедупликации должно соответствовать реальной модели бизнеса.
Для интернет-магазина это может быть:
customer_id
Для B2B:
ИНН компании + контакт
Для авторизованного сервиса:
user_id
Для простой формы:
телефон/email
Не существует одного универсального ключа для всех сайтов.
Как не потерять UTM-метки
Одна из наиболее обидных ошибок выглядит так:
- пользователь пришёл по рекламе;
- сайт прекрасно записал UTM;
- пользователь отправил заявку;
- в CRM приехали только имя и телефон.
После этого маркетинг видит заявку, но уже не знает источник.
Поэтому UTM лучше рассматривать как часть данных заявки, а не как декоративную информацию для аналитики.
Например:
utm_source = yandex
utm_medium = cpc
utm_campaign = wordpress_repair
utm_content = ad_2
utm_term = wordpress_errorНужно заранее решить и другую вещь:
какую UTM передавать — первую или последнюю?
Пользователь может впервые прийти из поиска, а через два дня вернуться из ретаргетинга.
Если это имеет значение для бизнеса, стоит сохранять обе модели отдельно:
- first touch;
- last touch.
Поля сайта и CRM нужно сопоставить заранее
Допустим, сайт отправляет:
service = wordpress
budget = 10000
message = "После обновления ошибка 500"В CRM уже есть поля:
UF_SERVICE_TYPE
UF_BUDGET
COMMENTSНужно явно определить mapping:
service → UF_SERVICE_TYPE
budget → UF_BUDGET
message → COMMENTSИначе код превращается в набор случайных соответствий.
Особенно неприятны select-поля.
Например, сайт передаёт:
wordpressа CRM ожидает внутренний идентификатор:
137После изменения справочника интеграция может продолжить отправлять запросы без явной ошибки, но значение перестанет записываться туда, куда ожидалось.
Не отправляйте данные напрямую из браузера в CRM
Иногда хочется сделать:
fetch("https://crm.example/api/...")прямо из формы сайта.
Обычно это плохая идея.
Для доступа к CRM требуются ключи или токены, а секреты нельзя безопасно хранить в клиентском JavaScript.
Правильнее:
браузер
↓
backend сайта
↓
CRM APIBackend:
- проверяет данные;
- сам хранит токены;
- записывает логи;
- контролирует повторы;
- обрабатывает ошибки CRM.
Что делать, если CRM временно недоступна
Очень плохой сценарий:
пользователь отправил форму
→ CRM API вернул 500
→ заявка потеряласьИнтеграция не должна считать CRM единственным местом, где существует заявка.
Надёжная схема — сначала сохранить обращение на стороне сайта и только после этого синхронизировать его с CRM.
форма
↓
заявка сохранена
↓
попытка отправить в CRMЕсли CRM недоступна:
status = crm_pendingЗатем выполнить повтор.
После успеха:
status = crm_synced
crm_id = 83421Так временный сбой внешней системы не превращается в потерянного клиента.
Повторы должны быть безопасными
Если API-запрос завершился timeout, неизвестно, что произошло.
Возможны два варианта:
- CRM запрос не получила;
- CRM получила и обработала его, но ответ не дошёл обратно.
Если просто ещё раз создать сделку, можно получить дубль.
Поэтому операция должна иметь собственный внешний ID.
Например:
website_request_id = 01J9...Перед созданием или при повторной обработке интеграция должна понимать:
этот запрос уже синхронизировался или нет?
Это особенно важно для очередей, background jobs и автоматических retry.
Нужно ли синхронизировать CRM обратно с сайтом
Не всегда.
Если сайт только собирает заявки, достаточно:
сайт → CRMНо для интернет-магазина или личного кабинета может потребоваться обратное направление.
Например:
CRM: сделка → "В работе"
↓
сайт: заказ → "Обрабатывается"Или:
CRM: договор подписан
↓
сайт: открыть доступТогда нужно определить источник истины.
Кто отвечает за статус?
CRM?
Сайт?
ERP?
Если позволить всем системам свободно менять один и тот же статус, легко получить цикл:
CRM изменила сайт
→ сайт изменил CRM
→ CRM снова отправила webhook
→ ...Поэтому заранее задаётся направление каждой операции.
Логи интеграции нужны до первой проблемы
Пока всё работает, логирование кажется лишним.
Потом приходит менеджер:
«Вчера в 14:32 была заявка, но в CRM её нет».
Без логов остаётся только гадать.
Минимальный диагностический журнал должен содержать:
- время;
- внутренний ID заявки;
- CRM operation;
- HTTP status;
- CRM entity ID;
- результат;
- текст технической ошибки.
Например:
2026-09-13 14:32:11
request_id=9184
operation=create_deal
status=201
crm_id=58341или:
operation=create_deal
status=429
retry=scheduledНо нельзя бездумно писать в лог всё тело запросов.
Там могут находиться:
- телефоны;
- email;
- персональные данные;
- API-токены.
Лог должен помогать диагностике, а не становиться ещё одной утечкой данных.
Ограничения API тоже нужно учитывать
При проектировании интеграции нужно учитывать ограничения API: частоту запросов, права доступа, доступные методы и изменения версий API.
Кроме того, API со временем меняются.
Например, Bitrix24 сейчас рекомендует использовать для новых интеграций универсальные методы crm.item.* для основных операций с лидами и сделками, оставляя старые методы в основном для существующих интеграций.
Поэтому интеграцию, написанную несколько лет назад, иногда приходится обновлять даже при отсутствии изменений на самом сайте.
Как тестировать интеграцию сайта с CRM
Проверка «заполнили форму — запись появилась» недостаточна.
Интеграцию нужно проверять не только на успешном сценарии, но и на повторах, сбоях и пограничных ситуациях. Минимальный набор проверок выглядит так.
1. Новый клиент
Контакта нет.
Ожидаем:
создан контакт → создана заявка/сделка → связь установлена
2. Существующий клиент
Телефон уже есть в CRM.
Ожидаем:
существующий контакт найден → новый дубль не создан → создано новое обращение
3. Повторная отправка одной формы
Например, двойной клик.
Ожидаем отсутствие случайных дублей.
4. CRM вернула ошибку
Заявка не должна исчезнуть.
5. CRM долго отвечает
Пользователь не должен ждать 30 секунд на странице только потому, что внешняя система зависла.
6. UTM присутствуют
Проверяем не только контактные поля, но и источник.
7. UTM отсутствуют
Интеграция должна нормально работать и без них.
8. Необязательное поле пустое
CRM не должна отклонять всю заявку из-за одного отсутствующего значения.
9. CRM изменила структуру поля
Особенно важно для списков, стадий и пользовательских полей.
10. Повторная обработка webhook
Одно событие не должно дважды выполнять действие на сайте.
11. Неверный webhook
Неизвестное или некорректное событие не должно приводить к изменению данных.
12. Истёк или отозван токен
Ошибка должна быть видна в мониторинге или логах, а не молча терять заявки.
Если форма отправляется, а в CRM ничего нет
Диагностику удобнее вести по цепочке.
Шаг 1. Создалась ли заявка на сайте
Если нет, CRM пока вообще ни при чём.
Проблема находится в форме или backend сайта.
Шаг 2. Сайт пытался отправить запрос
Смотрим application logs.
Если попытки нет — проблема в коде интеграции.
Шаг 3. Как ответила CRM
Например:
200/201 — запрос принят;
400 — неверные данные;
401/403 — авторизация или права;
429 — ограничение запросов;
5xx — ошибка внешнего сервиса.Конкретные коды и формат ошибок нужно сверять с документацией используемой CRM.
Шаг 4. Создалась ли сущность
Иногда запрос формально успешен, но запись появилась не там:
- другая воронка;
- другой ответственный;
- неправильный этап;
- тестовый аккаунт;
- неправильный портал.
Шаг 5. Не сломалась ли следующая операция
Например:
контакт создан
→ создание сделки упалоТогда в CRM контакт есть, а ожидаемой сделки нет.
Это уже не «CRM не работает», а частично выполненная транзакция интеграции.
Частые ошибки при интеграции сайта и CRM
Создавать новый контакт на каждую заявку.
База быстро заполняется дублями.
Передавать только имя и телефон.
Теряются источник, страница и смысл обращения.
Доверять данным формы без серверной проверки.
В CRM попадает мусор или неожиданные значения.
Хранить CRM-токен в JavaScript.
Секреты должны оставаться на сервере.
Считать webhook гарантированной однократной доставкой.
Обработчик должен спокойно переносить повторы.
Не сохранять собственный ID заявки в CRM.
Потом трудно сопоставлять две системы.
Не сохранять CRM ID на сайте.
Возникает та же проблема в обратную сторону.
Не продумывать ситуацию, когда CRM недоступна.
Временный сбой превращается в потерянный лид.
Считать первую успешную заявку окончанием разработки.
Самые неприятные ошибки появляются на повторах, дублях и сбоях.
Интеграция должна переживать ошибки
Успешная интеграция — это не та, которая один раз передала тестовую форму.
Она должна нормально работать, когда:
- клиент уже существует;
- форму отправили дважды;
- CRM отвечает медленно;
- API временно недоступен;
- webhook пришёл повторно;
- часть полей отсутствует;
- изменился токен;
- менеджер поменял статус;
- один человек оставил несколько заявок.
Именно в этих ситуациях становится видно, была ли интеграция спроектирована как система или просто как один HTTP-запрос.
Нормальная схема выглядит примерно так:
форма / заказ
↓
backend сайта
↓
сохранение заявки
↓
поиск клиента
↓
CRM API
↓
contact + lead/deal
↓
crm_id сохраняется на сайте
↓
webhook / изменение статусаКогда каждый переход можно проверить отдельно, интеграция становится гораздо проще и в поддержке.
Частые вопросы
Можно ли подключить CRM к любому сайту?
В большинстве случаев — да, если у сайта есть возможность выполнить серверный запрос или передать данные во внешний сервис, а у CRM есть подходящий API, webhook или готовая интеграция.
Для полностью статического сайта иногда используют промежуточный backend или сервис автоматизации.
Что лучше: готовый модуль или API?
Если стандартный модуль покрывает нужный сценарий — обычно стоит начать с него.
API нужен, когда появляются нестандартные правила: поиск существующих клиентов, особая воронка, несколько систем, собственные статусы или двусторонняя синхронизация.
Нужно ли создавать контакт и сделку одновременно?
Не обязательно.
Это зависит от модели CRM и бизнес-процесса. Но важно разделять сущность клиента и сущность конкретного обращения, чтобы повторные заявки одного человека не создавали множество одинаковых контактов.
Как передавать UTM-метки в CRM?
Сайт должен сохранить UTM до отправки формы, а backend — передать их в соответствующие поля CRM вместе с заявкой.
Какие именно поля использовать, определяется структурой конкретной CRM.
Почему в CRM появляются дубли?
Чаще всего интеграция создаёт новую запись без предварительного поиска или не имеет собственного идентификатора операции.
Причиной также могут быть двойная отправка формы, retry после timeout или повторная обработка одного события.
Нужна интеграция сайта с CRM?
Если нужно подключить CRM к сайту, передавать формы или заказы, сохранить UTM, убрать дубли или восстановить уже сломавшуюся интеграцию, задачу можно передать WebFixer24.
Разберём существующий процесс, определим структуру данных, подключим API или webhook и проверим не только успешную заявку, но и повторные и аварийные сценарии.
Без аккаунтов и регистраций: вы нам проблему — мы вам решение.