Точка запуска
Действие сотрудника, событие системы, webhook, очередь или расписание.
Проектируем интеграцию не как набор отдельных запросов, а как управляемый обмен между системами: определяем владельца данных, точки запуска, идентификаторы объектов, правила повторов и результат, который должен увидеть сотрудник.
С чего начинаем
Один и тот же сервис может предоставлять десятки методов, но рабочему процессу обычно нужен небольшой согласованный набор.
Действие сотрудника, событие системы, webhook, очередь или расписание.
Для каждого значения фиксируем систему-владельца и не создаём двустороннее редактирование без правила конфликта.
Сохраняем внешние идентификаторы, чтобы обновлять тот же заказ, документ или клиента, а не искать его заново по названию.
После вызова сотрудник получает понятный итог: объект создан, статус обновлён, требуется исправление или повтор.
Контракт
Интеграция должна понимать, что уже создано, что можно обновить и какая операция безопасна для повторного вызова.
Архитектура
Технические детали зависят от конкретного сервиса, но набор архитектурных вопросов остаётся похожим.
Храним токены и ключи вне public-кода, учитываем срок действия и минимально необходимые права.
Не предполагаем, что один запрос вернёт все данные; объём и частоту запросов подстраиваем под ограничения сервиса.
Для операций создания используем внешний ключ, собственный журнал или поддерживаемый сервисом механизм защиты от дублей.
Различаем временную недоступность, ошибку авторизации, неверные данные и бизнес-отказ внешней системы.
Контракт интеграции фиксируем так, чтобы изменение внешней версии можно было локализовать в одном адаптере.
Надёжность
Некоторые сервисы принимают запрос в обработку и возвращают окончательный результат позже. Поэтому технический ответ и бизнес-статус храним отдельно.
После создания сохраняем внешний ID и проверяем дальнейшее состояние через webhook или API.
Критичные задания сначала фиксируем, затем выполняем внешний вызов и сохраняем число попыток.
Повторяем только операции, для которых это безопасно, с ограничением числа попыток и интервалом между ними.
Видим не только исключение в логе, но и зависшие задания, частые ошибки и результат конкретной операции.
API или webhook
Во многих проектах они работают вместе: API создаёт или читает объект, webhook возвращает изменение его состояния.
Наш сервис вызывает API.
Внешний ID относится к объекту CRM или ERP.
Внешняя система сообщает об изменении.
При необходимости запрашиваем актуальные данные через API.
Возвращаем сотруднику подтверждённый бизнес-статус.
Масштабирование
Общую бизнес-логику отделяем от адаптера конкретного поставщика, когда процесс предполагает несколько внешних систем одного типа.
Подход
CRM или внутренний сервис работает с единым набором бизнес-команд, а особенности авторизации, полей и ответов каждого API остаются внутри своего адаптера.
Вопросы
Наличие API — необходимое, но не достаточное условие. Проверяем, доступны ли именно нужные операции, данные, события, права и ограничения для вашего сценария.
Обычно нет. Для каждого значения лучше определить владельца и передавать только то, что нужно следующему этапу процесса.
Используем поддерживаемый API механизм идемпотентности либо собственную связь объектов и журнал выполненных операций.
Критичное задание не теряем: сохраняем ошибку, выполняем безопасный повтор по правилам и показываем итоговый статус сотруднику.
Когда внешний сервис может сам сообщить о результате или изменении. Это позволяет не опрашивать API постоянно и быстрее продолжать процесс.
Да. Если бизнес-процесс общий, целесообразно оставить единый интерфейс и вынести особенности каждого поставщика в отдельный адаптер.
Покажите один объект и его путь: что создаётся, какие данные передаются и какой результат должен вернуться. Этого достаточно, чтобы определить минимальный API-контракт.