Коротко

  • ТЗ должно начинаться с бизнес-процесса и чёткой границы первой версии, а не со списка API и полей.
  • Для каждой сущности нужно назначить источник истины, правила сопоставления и допустимое направление изменений.
  • Контракты событий обязаны описывать идентификаторы, порядок, повторы, идемпотентность и обработку недоступности систем.
  • Приёмка строится на сквозных сценариях, журнале обмена и заранее согласованных действиях при ошибках.
  • Поддержка интеграции требует владельцев, правил изменения контрактов и понятного процесса разбора инцидентов.

ТЗ — это не список соединяемых систем

Фраза «интегрировать сайт, CRM и телефонию» обозначает направление, но не задачу. Она не отвечает, где создаётся клиент, кто назначает ответственного, можно ли менять телефон после квалификации, что делать с повторной заявкой и какая система сообщает об успешной продаже. Если начать разработку с такого описания, каждая сторона дополнит пробелы собственными предположениями. Формально обмен заработает, но процесс останется непредсказуемым.

Полезное ТЗ связывает три уровня. Бизнес-уровень объясняет, какое действие компании должно стать быстрее или надёжнее. Процессный уровень показывает участников, состояния и исключения. Технический уровень фиксирует сущности, поля, события и правила обмена. Эти уровни нельзя заменить одной большой таблицей полей: одинаковый набор данных может обслуживать совершенно разные процессы.

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

Зафиксируйте границы и сквозные сценарии

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

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

  1. 01

    Назвать начало

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

  2. 02

    Проследить путь

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

  3. 03

    Зафиксировать результат

    Описать созданные или изменённые сущности, ответственного, уведомление и состояние исходной системы.

  4. 04

    Добавить исключения

    Проверить дубликат, неполные данные, отсутствие доступа, таймаут и повторную доставку.

Назначьте источник истины для каждой сущности

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

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

Сущность или полеИсточник истиныКто может менятьПравило конфликта
Контактные данныеCRM после квалификацииМенеджер и проверенный каналСохранить новое значение с источником и временем
Статус сделкиCRMОтветственная рольОтклонить недопустимый переход и записать причину
Факт оплатыПлатёжная или учётная системаТолько подтверждённое событиеНе заменять ручной отметкой без отдельного правила
Согласие на коммуникациюСистема, где получено согласиеПользователь или уполномоченный сотрудникХранить основание, канал и дату изменения

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

Принцип проектирования Agentix Labs

Опишите сопоставление полей и преобразования

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

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

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

Согласуйте контракты команд и событий

Интеграция может работать по запросу, расписанию или событиям. В любом варианте ТЗ фиксирует контракт: название операции, инициатора, адрес и метод вызова, схему запроса, схему ответа, коды ошибок, требования к авторизации и версию. Спецификация OpenAPI подходит для описания HTTP-интерфейсов, а AsyncAPI — для событийных каналов, но сам формат документа не заменяет бизнес-смысл полей и состояний.

Для события важно различать факт и команду. «Оплата подтверждена» сообщает о произошедшем и не требует от получателя изменить прошлое. «Создать сделку» просит выполнить действие и может быть отклонено. В ТЗ нужно указать, кто выпускает событие, кто подписывается, какой идентификатор обеспечивает трассировку, допускается ли изменение порядка и как долго сообщение считается актуальным.

Часть контрактаЧто зафиксироватьЗачем
ИдентификаторыeventId, correlationId и идентификатор сущностиСвязать повтор, журнал и исходную операцию
ВерсияВерсию схемы и правила совместимостиМенять контракт без одновременной остановки всех систем
РезультатУспех, временную и постоянную ошибкуВыбрать повтор, ручную обработку или отказ
ПорядокЗависимость от последовательности событийНе применить старое состояние поверх нового
СрокТаймаут запроса и допустимый возраст событияНе выполнять просроченную операцию без проверки

Заранее спроектируйте повторы и идемпотентность

Сеть и внешние API иногда отвечают медленно или становятся недоступны. Отсутствие ответа не всегда означает, что операция не выполнена: CRM могла создать сделку, но соединение оборвалось до возврата результата. Если просто повторить запрос, появится дубликат. Поэтому ТЗ должно описывать идемпотентность — способность безопасно обработать повтор одной логической операции без второго бизнес-эффекта.

Укажите идемпотентный ключ, срок его хранения и ответ на повтор. Ключ должен относиться к бизнес-операции, а не генерироваться заново при каждой сетевой попытке. Для временных ошибок задайте ограниченное число повторов с увеличивающимся интервалом. Для постоянных ошибок — например, недопустимого статуса или отсутствующего обязательного поля — автоматический повтор бесполезен: запись должна попасть в журнал и очередь ручного разбора.

  1. 01

    Классифицировать ошибку

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

  2. 02

    Повторить безопасно

    Использовать тот же идентификатор операции, ограничить попытки и увеличить паузу между ними.

  3. 03

    Проверить итог

    Если ответ потерян, запросить состояние по внешнему идентификатору до создания новой сущности.

  4. 04

    Передать человеку

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

Включите безопасность и доступ в основной контракт

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

Проверки выполняются на сервере для каждого объекта, а не только на уровне интерфейса или общего доступа к методу. Это особенно важно для систем с несколькими организациями. В подтверждённом кейсе Crypto Exchange CRM сервер определяет организацию из активного профиля сотрудника, проверяет принадлежность связанных записей и применяет ограничения к API, отчётам и закрытым файлам. Такой подход показывает, почему скрытая кнопка или клиентский фильтр не являются границей безопасности.

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

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

Подход, реализованный в Crypto Exchange CRM

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

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

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

ПроверкаОжидаемый результатПодтверждение
Новая заявкаСозданы нужные сущности и назначен маршрутКарточка CRM и запись журнала с одним correlationId
Повтор того же событияВторой бизнес-объект не созданОтвет повторной обработки и исходный идентификатор
Некорректное обязательное полеОперация отклонена без частичного измененияПонятная ошибка с названием поля
Временная недоступность CRMОперация повторена по правилам или передана в очередьИстория попыток без потери исходных данных
Недостаточные праваДанные не прочитаны и не измененыОтказ доступа без раскрытия закрытой информации

Опишите поддержку и изменение контрактов

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

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

  • Контакты владельцев процесса, систем и технической поддержки.
  • Классы инцидентов, время реакции и канал эскалации.
  • Срок хранения журналов и порядок выдачи доступа к ним.
  • Версионирование схем и минимальный период обратной совместимости.
  • Порядок изменения справочников, обязательных полей и правил маршрутизации.
  • План отключения интеграции или возврата к предыдущей версии.

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

Частые вопросы

Нужно ли описывать в ТЗ каждое поле CRM?

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

Кто должен готовить ТЗ на интеграцию CRM?

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

Чем webhook отличается от обычного API-запроса в ТЗ?

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

Как избежать дублей при интеграции CRM?

Использовать стабильный идентификатор бизнес-операции, хранить связь идентификаторов систем, определить правила поиска совпадений и обрабатывать повтор с тем же ключом без второго эффекта. Телефон или email могут участвовать в сопоставлении, но не всегда подходят как единственный идентификатор.

Какие критерии приёмки интеграции обязательны?

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

Что передать команде поддержки после запуска?

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

Источники

  1. OpenAPI Initiative: OpenAPI SpecificationПроверено 30 июля 2026 г.
  2. RFC 9110: HTTP SemanticsПроверено 30 июля 2026 г.
  3. OWASP API Security Top 10 — 2023Проверено 30 июля 2026 г.
  4. AsyncAPI Initiative: AsyncAPI SpecificationПроверено 30 июля 2026 г.
Материал подготовлен редакцией Agentix Labs с использованием AI для исследования, структуры и черновика. Финальный текст, факты и рекомендации проверяет Владислав.