← Все материалы

Как проектировать интеграции CRM, ERP и внешних API, чтобы система не рассыпалась

Практический разбор интеграционных проектов: источник истины, контракты данных, статусы, повторные запросы, ошибки, безопасность и порядок запуска.

Интеграция — это движение данных между владельцами

Сначала определите, какая система отвечает за каждый объект. Только потом выбирайте способ обмена.

01ИсточникСоздаёт и хранит актуальное состояние
02КонтрактПоля, идентификаторы, правила изменений
03ОбменAPI, события, расписание или очередь
04КонтрольПовторы, сверка, журнал и уведомление

Сложность растёт не от количества URL

Один endpoint может быть критичнее десятка простых вызовов, если через него проходят деньги или заказы.

01ДанныеРазные справочники, форматы и владельцы
02НадёжностьЗадержки, повторы, недоступность и порядок событий
03ОтветственностьКто исправляет расхождение и видит проблему

Начните с владельца данных

Для каждого объекта назначьте источник истины: клиент, договор, заказ, остаток, платёж или документ. Если два сервиса считают себя владельцами одного поля, система неизбежно начнёт показывать разные версии состояния.

Нарисуйте не список интеграций, а карту объектов и переходов. Такой артефакт полезен бизнесу, аналитикам и разработчикам: он показывает, где возникает действие и где хранится результат.

Контракт данных важнее названия API

Контракт фиксирует поля, обязательность, форматы дат, идентификаторы, допустимые статусы и правила удаления. Уточните, что произойдёт, если новое поле не пришло, значение изменилось или запись появилась дважды.

Документация провайдера редко описывает все бизнес-ограничения. Нужны sandbox, примеры реальных ответов и контакт ответственного человека с другой стороны.

Спроектируйте отказ до счастливого пути

Внешний сервис может не ответить, вернуть неполные данные или прислать событие позже другого события. Нужны таймаут, повторная попытка, ограничение частоты, журнал и понятный статус «требует проверки».

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

Не превращайте систему в цепочку прямых вызовов

Когда один запрос синхронно вызывает CRM, склад, оплату и доставку, любая задержка блокирует весь пользовательский путь. Критические действия лучше отделять от вторичных обновлений и явно фиксировать промежуточное состояние.

Это не означает, что каждому проекту нужна сложная шина сообщений. Сначала определите требования к скорости, порядку, повторяемости и восстановлению, а потом выбирайте API, события или очередь.

Безопасность — часть интеграционного контракта

Опишите, какие данные передаются, где находятся персональные сведения, как выдаются ключи, как отзывается доступ и какие действия попадают в аудит. Секреты нельзя хранить рядом с кодом или передавать в журналы.

Отдельно договоритесь о версиях API и обратной совместимости. Обновление внешнего сервиса не должно неожиданно ломать оформление заказа или выдачу документа.

Запускайте критический путь первым

В первой версии закройте один путь от начала до результата: например, заявка → CRM → уведомление менеджеру или заказ → оплата → резерв на складе. После этого добавляйте второстепенные обмены.

Приёмка должна проверять не только успешные ответы, но и недоступность, дубликаты, задержки и ручное восстановление. Такой сценарий даёт реальное понимание готовности системы.

Контракт описывает не только успешный JSON

Перед интеграцией зафиксируйте владельца каждого объекта, допустимые переходы состояния, идентификаторы и порядок событий. Документируйте обязательные поля, часовой пояс, точность денег, кодировку, лимиты и версию схемы. Такая детализация дешевле, чем поиск причины расхождения после запуска.

Для каждого endpoint подготовьте примеры таймаутов, частичных ответов, повторов и несовместимых изменений. Контракт должен быть проверяемым автотестами и понятным операционной команде, которая будет разбирать инцидент.

Синхронизация требует журнала операций

Долгие обмены нельзя строить как один блокирующий HTTP-запрос. Используйте очередь, статус операции, correlation ID и безопасный повтор шага. Идемпотентный ключ защищает от дублей, когда внешний сервис принял запись, но ответ потерялся.

Храните результат попытки и причину отказа отдельно от бизнес-объекта. Тогда можно повторить только неудавшийся шаг, не создавая второй заказ, платёж или документ.

Наблюдаемость — часть интеграционного дизайна

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

До запуска проведите тест с ограничением скорости, недоступным endpoint и изменённой схемой. Результатом должен быть не только зелёный тест, но и понятный план восстановления для команды.

Контракт должен описывать ошибки

Описание успешного ответа — только половина интеграции. Зафиксируйте коды, формат ошибок, обязательность полей, идемпотентность, лимиты и правила повторной отправки. Клиент и сервер должны одинаково понимать, можно ли безопасно повторить запрос.

Для каждого внешнего провайдера назначьте владельца контракта и способ проверить изменения. Версионность и тестовые окружения дешевле, чем срочное восстановление после несовместимого обновления API.

Синхронизация требует явной модели состояния

Интеграции часто работают асинхронно: заявка создана у нас, обработана у партнёра и только потом подтверждена. Храните внешний идентификатор, текущий статус, время последней попытки и причину ошибки. Это позволяет восстановить цепочку без ручного поиска по переписке.

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

Сначала ограничьте поверхность изменений

Не подключайте весь каталог возможностей провайдера. Выберите операции, которые нужны главному сценарию, и проведите их через тестовые данные, таймауты и повторные запросы. Остальные методы добавляйте только после подтверждения ценности.

Приёмка должна включать наблюдаемость: correlation ID, метрики задержки, журнал тела ошибки без секретов и понятный ручной сценарий восстановления. Так интеграция становится частью продукта, а не хрупким скриптом.

Контракт API нужно проверять как продуктовый интерфейс

Опишите для каждого метода обязательные поля, состояния, коды ошибок, идемпотентность и допустимую задержку. Клиенту важно понимать, можно ли безопасно повторить запрос, а поддержке — найти операцию по идентификатору.

Версия контракта должна меняться предсказуемо. Обратная совместимость и период перехода дешевле срочной синхронной правки нескольких систем в день релиза.

Интеграция готова только после отказоустойчивого сценария

Проверьте таймаут, повтор, частичный успех и восстановление после недоступности партнёра. Очередь без дедупликации создаёт повторные заказы, а бесконечные ретраи превращают временную ошибку в постоянную нагрузку.

Зафиксируйте владельца исключений и способ ручного восстановления. Это должно быть видно в интерфейсе оператора, а не только в логах разработчика.