Две раскрытые книги, светлая и синяя стеклянная, соединены металлической дугой.

К вопросам по статье

Опишите событие, которое запускает обучение

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

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

Назначьте источник каждого поля

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

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

Согласуйте обратные сценарии

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

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

Принимайте интеграцию по сценариям

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

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

Начните с права на обучение, а не с передачи контакта

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

Рассмотрим рабочий пример для проектирования: компания продаёт подготовительный курс и дополнительный модуль. Заказ оформляет родитель, а учиться будет ребёнок. Один платёж покрывает две программы, причём модуль начинается позже. Это пример требований, а не описание результатов конкретного клиента. Если интеграция использует только email плательщика и сумму оплаты, она уже потеряла получателя, состав покупки и отдельные сроки. Исправить это одним дополнительным webhook нельзя: сначала нужна модель заказа.

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

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

Разведите продажу, оплату, назначение и фактический доступ

Воронка продаж отвечает на вопрос, что происходит с коммерческим обращением. Платёжная система подтверждает состояние расчёта. LMS управляет учебным назначением и возможностью пользоваться материалами. Объединение этих состояний в один статус «Успешно» делает поддержку почти слепой: непонятно, деньги не пришли, запрос не отправился или человеку назначена другая роль.

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

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

Такая детализация не требует показывать все технические статусы менеджеру. В CRM можно оставить понятное поле «Готовность обучения» и ссылку на подробности. Но значение этого поля должно выводиться из подтверждённых шагов. Тогда поддержка сможет объяснить человеку, какой этап задержался, и не будет повторно списывать деньги или создавать новые аккаунты ради проверки.

Составьте контракт данных и назначьте владельца каждого поля

Контракт обмена — это не только пример JSON. Он объясняет, какое значение считается правильным и кто может его изменить. Для программы нужен устойчивый код, для заказа — идентификатор позиции, для человека — правило сопоставления, для доступа — начало и окончание периода. Формат даты должен включать понятную часовую зону либо явно согласованный способ её определения.

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

Поле контрактаИсточник истиныПроверка перед выдачейКто разрешает неоднозначность
Получатель обученияСогласованная позиция заказа или кадровое назначениеПолучатель отделён от плательщикаМенеджер либо координатор обучения
Код программыКаталог программ с таблицей соответствийКод существует, программа доступна для назначенияВладелец учебного продукта
Основание выдачиПодтверждённое событие выбранной системыОснование относится к этой позиции заказаОтветственный за коммерческий процесс
Начало и окончание доступаПравило продукта и согласованная дата стартаПериод корректен, часовая зона определенаАдминистратор учебного процесса
Связь CRM и LMSРеестр сопоставлений интеграцииЗапись относится к нужному человеку и организацииСотрудник с правом исправления связей
Учебный результатСогласованный показатель LMSПонятны смысл, дата обновления и полнотаРуководитель обучения

Рабочий сценарий

От подтверждённого основания к доступу в LMS

Одно учебное право связывает заказ, получателя, программу и период действия

01

Подтвердить основание

Отделить коммерческую стадию от оплаты или внутреннего назначения

02

Определить получателя

Связать человека с позицией заказа и проверить неоднозначные совпадения

03

Сохранить задание

Закрепить идентификатор операции, программу, срок и обработку повторов

04

Выполнить назначение

Найти учётную запись, выдать согласованное право и сохранить результат шага

05

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

Прочитать состояние и пройти согласованный сценарий под учебной ролью

06

Сверить результат

Сопоставить ожидаемые права с LMS и передать отклонения ответственному

Подтверждены получатель, программа, срок и пользовательский доступ?

Условие выполнено: Отметить готовность обучения и выполнить отдельный шаг уведомления

Условие не выполнено: Сохранить достигнутый этап, показать причину и продолжить после исправления

Ответственный
Координатор обучения и ответственный за интеграцию

Подтверждение
Связанный заказ, задание, назначение и протокол проверки учебной роли

Что измеряем
Возраст необработанных заданий и расхождения ожидаемых прав с LMS

Скачать схему процесса в SVG · Скачать рабочую таблицу CSV

При передаче изменений определите приоритеты. Если сотрудник исправил фамилию в LMS, должна ли следующая синхронизация вернуть старое значение из CRM? Можно выбрать одностороннее владение полем или управляемое согласование. Опасный вариант — двусторонняя запись без правил: она создаёт циклы обновления, а человек видит, как его исправление исчезает после очередного обмена.

Проверьте возможности LMS на выбранной версии и роли

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

В официальной документации Moodle отдельно объясняется, что зачисление на курс и назначение роли — разные понятия. Из этого следует практическая проверка: наличие связи пользователя с курсом само по себе не завершает приёмку пользовательского сценария. Конкретный набор разрешений и механизм зачисления нужно подтвердить для используемой установки. Это пояснение возможностей продукта, а не утверждение о стеке всех наших образовательных проектов. Источник: Moodle Developer Resources.

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

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

Повторные события и перестановка сообщений — разные проверки

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

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

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

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

Обработайте частичный успех без ручного пересоздания всего заказа

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

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

При возврате или отмене не всегда требуется механически отменять все предыдущие действия. Учётная запись может использоваться для других программ, а учебные результаты могут понадобиться для истории. Нужно определить конкретное изменение соответствующего права: сократить период, приостановить назначение или передать спорный случай ответственному. Подход к компенсации распределённых операций описан в Microsoft Azure Architecture Center; решение о составе компенсации остаётся частью нашего бизнес-процесса. Источник: Compensating Transaction.

Отдельно опишите возврат, перенос и повторную покупку

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

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

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

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

Сверяйте системы и измеряйте задержки по отдельным этапам

Журнал успешных HTTP-ответов не отвечает на вопрос, все ли оплаченные назначения доступны. Для этого нужна сверка двух множеств: какие права должны действовать по основаниям и какие назначения фактически найдены в LMS. Различия группируются по типам: нет назначения, другой получатель, неверная программа, несовпадающий срок или учебный доступ без ожидаемого основания. Сотрудник разбирает конкретную группу, а не просматривает весь поток сообщений.

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

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

Принимайте интеграцию на наборе воспроизводимых заказов

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

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

В кейсе заявок на обучение в Битрикс24 я сделал одну форму для курсов и мероприятий: данные сохраняются в CRM, а задача поступает в поток отдела обучения. Это подтверждённая работа с внутренними заявками. Она не доказывает подключение Moodle, оплату курсов или автоматическую выдачу доступа в LMS. Матрицы выше — мои рекомендации для проектирования такой интеграции; её состав проверяется отдельно.

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

Короткие ответы

Вопросы по теме

Какое событие должно выдавать доступ к обучению: сделка или оплата?

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

Почему нельзя связывать пользователя CRM и LMS только по имени?

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

Что должно произойти, если подтверждение оплаты пришло повторно?

Интеграция должна распознать повтор той же операции и вернуть существующий результат, а не создавать ещё одного пользователя или назначение. Новая покупка того же человека проверяется отдельно и не должна исчезать из-за совпадения контакта.

Оплата обработана, но LMS недоступна. Как не потерять назначение?

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

Нужно ли автоматически закрывать обучение при любом возврате или переносе?

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