Перейти к основному содержимому

⚡ Триггеры

Триггер определяет, когда запускается сценарий. Он задаётся в стартовом блоке «Старт», в поле «Тип триггера»: «Событие», «Webhook», «Ручной запуск», «По расписанию». Набор доступных событий зависит от типа сценария; триггеры «По расписанию», «Webhook» и «Ручной запуск» доступны сценариям любого типа.

Событие​

Сценарий запускается, когда в проекте что-то произошло. В блоке «Старт» задаются:

ПолеЧто делает
СобытиеТип события, на которое запускается сценарий
КаналыЗапускать сценарий только для выбранных каналов проекта
Дополнительные условияДерево условий по полям события
Событие должно подходить типу сценария

Если выбрать событие, не относящееся к типу сценария, редактор покажет: «Это событие не относится к выбранному типу флоу — флоу не запустится. Выберите подходящее событие». Событие тикета не запустит сценарий «Поддержка», и наоборот — такие пары сервис отсекает.

События поддержки​

Сценарии типа «Поддержка». В правой колонке — техническое имя события: под ним оно приходит в сервис сценариев.

СобытиеКогда срабатываетИмя события
Сообщение от клиентапришло входящее сообщение или клиент нажал кнопкуsupport.message, support.message.created
Обращение созданосоздано новое обращениеsupport.created
Сменился статус обращенияизменился статусsupport.status.changed
Сменился приоритетизменился приоритетsupport.priority.changed
Перевод на другую линиюизменилась линия поддержкиsupport.line.changed
Обращение закрытообращение переведено в «Решён» или «Отменён»support.closed
«Назначен оператор» не срабатывает

«Назначен оператор» (support.assigned) в списке есть, но опубликовать сценарий на нём нельзя: у обращения нет ответственного (назначить обращение можно только на группу), событие никто не отправляет, и сервис отклонит публикацию.

Несколько сообщений подряд — одно событие

Сообщение клиента попадает в сценарий примерно через секунду после отправки. Если к этому моменту клиент успел прислать ещё сообщения (например, пока сценарий отвечал на предыдущее), они приходят одним событием: {{trigger.text}} содержит их тексты через перевод строки (до 11 сообщений подряд), а сценарий запускается или продолжается один раз.

События тикетов​

Сценарии типа «Тикеты».

СобытиеКогда срабатываетИмя события
Тикет создансоздан тикет, в том числе из чатаticket.created
Комментарий клиентаклиент написал по тикетуticket.message
Сменился статусизменился статус тикетаticket.status.changed
Сменился приоритетизменился приоритетticket.priority.changed
Три события не приходят

В списке событий редактора есть ещё «Сменился исполнитель» (ticket.assigned), «Другие изменения» (ticket.updated) и «Тикет закрыт» (ticket.closed), но система тикетов их не отправляет, поэтому сервис не даст опубликовать сценарий на таком событии. Смена исполнителя и смена типа тикета вообще не порождают событий. Закрытие тикета ловите событием «Сменился статус» и проверяйте новый статус (условие «Статус» = closed или resolved, либо {{ticket.status}} в блоке «Условие»).

Запуск сценария оператором из чата или тикета — это не событие, а ручной запуск: в списке событий его нет.

Глобальные события​

Сценарии типа «Глобальный». В селекте события сгруппированы:

  • Биллинг / Квоты — «Подписка оформлена», «Подписка отменена», «Платёж прошёл», «Платёж не прошёл», «Заканчивается триал», «Превышен AI-лимит», «Превышен HTTP-лимит».
  • Пользователи — «Новый пользователь», «Добавлен тег», «Снят тег», «Изменилось CRM-поле», «Пользователь отписался».
  • Система — «Упал флоу (для алертинга)».

Кроме готового списка в это поле можно вписать свой topic — подсказка в поле: «Свой topic, например my.custom.event». Тогда сценарий будет стартовать по событию с этим именем.

Большинство подсказок пока не приходят

События групп «Биллинг / Квоты» и «Пользователи» ни один сервис Fixorix сейчас не отправляет — сценарий на них не запустится, в том числе на «Превышен AI-лимит». Работает «Упал флоу (для алертинга)» — подпишитесь на него, чтобы узнавать и о превышении лимита обращений к ИИ. Как свой topic можно указать имя любого события поддержки или тикетов (например, support.message, ticket.status.changed) — глобальный сценарий запустится на нём параллельно со сценариями «Поддержки» и «Тикетов».

«Упал флоу (для алертинга)». Когда любой запуск сценария проекта завершается ошибкой, Fixorix сам отправляет это событие. В сценарии доступны {{trigger.failed_run_id}}, {{trigger.flow_id}}, {{trigger.flow_type}}, {{trigger.block_id}} и {{trigger.error_type}} — подробнее в разделе Переменные. Текста ошибки и названия сценария в событии нет — их смотрите в трассе запуска. Если упадёт сам сценарий, запущенный этим событием (или сценарий, в который он передал разговор), повторного события не будет — петли не возникнет. Готовый пример — шаблон «Прогон упал — сказать дежурному».

Смена группы обращения. В списке событий «Поддержки» её нет, но глобальный сценарий можно подписать на свой topic support.group.changed и читать {{chat.group_id}} и {{chat.previous_group_id}} — например, чтобы уведомить команду об эскалации.

Каналы​

Поле «Каналы» — это мультиселект конкретных каналов проекта: ботов и виджетов, которые заведены на странице «Каналы». Это не выбор платформы: если у проекта два Telegram-бота, можно запускать сценарий только для одного из них. Подсказка поля: «Пустой список ничего не ограничивает — сценарий пойдёт по всем каналам».

Когда каналов у проекта ещё нет, поле показывает подсказку: «У проекта пока нет каналов — добавьте бота или виджет на странице „Каналы“».

Каналы работают только на событиях поддержки

Отбор по каналам работает только на событиях поддержки (сценарии «Поддержка» и глобальные сценарии на support.*). В событиях тикетов канала нет: сценарий «Тикеты» с выбранными каналами или условием «Канал» не запустится никогда — в сценариях тикетов оставляйте поле пустым.

Дополнительные условия​

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

Условия собираются в дерево из групп «ВСЕ из (AND)», «ЛЮБОЕ из (OR)» и «НЕ (NOT)»; клик по заголовку группы переключает AND ↔ OR. Максимальная глубина вложенности — 5, дальше редактор пишет: «Достигнута максимальная глубина дерева (5). Глубже добавить не получится».

Операторов восемь: равно, не равно, содержит, входит в, не входит в, присутствует, больше, меньше. Для «входит в» и «не входит в» значения перечисляются через запятую, для «присутствует» значение не требуется.

В выпадающем списке только эти восемь операторов. Если в старом сценарии осталось условие с «начинается с», «≥», «≤» или «отсутствует», редактор пометит его значком ⚠ и подскажет замену: «начинается с» → «содержит», «≥»/«≤» → «больше»/«меньше» со сдвинутой границей, «отсутствует» → «присутствует» внутри группы «НЕ». С таким условием сценарий не опубликуется.

Поля в выпадающем списке разбиты на две группы:

ГруппаПоля
Метаданные события«Тип события», «ID проекта», «ID пользователя»
Поля события (payload)для «Поддержки»: «Канал», «Статус», «Приоритет», «ID чата», «Линия (0 — без линии)», «ID группы», «Текст сообщения», «Payload кнопки», «Прошлый статус», «Прошлый приоритет», «Прошлая линия», «Кем создано», «Кем закрыто»; для «Тикетов»: «Статус», «Приоритет», «ID тикета»; для «Глобального» — оба набора

Поля «Вложения», «Широта», «Долгота», «Телефон контакта», «Имя контакта» и «Прошлый ответственный» в списке для «Поддержки» есть, но в событиях сейчас не приходят. У «Тикетов» то же с полями «Канал» и «Изменённые поля».

Значения приходят в нижнем регистре: канал — telegram, vk, discord, website, client_widget; приоритет — low, medium, high, critical.

Не все поля работают до старта

Условие проверяется по «сырому» событию, до того как сценарий начал работу. Читаются только «Тип события», «ID проекта», «ID пользователя» и поля события (payload). Данные клиента, проекта, обращения и тикета до старта недоступны. Условия по данным, которых в событии нет, — теги, ответственный и время открытия/закрытия обращения, заголовок, описание, категория и теги тикета — бэкенд отклоняет при публикации: иначе сценарий молча никогда бы не сработал. Линия и группа обращения («Линия (0 — без линии)», «ID группы») в событии есть — по ним фильтровать можно. Исполнителя тикета проверяйте блоком «Условие» по {{ticket.assignee_id}}.

Под недопустимым полем редактор пишет: «Это поле недоступно до старта — публикация вернёт ошибку…». Если такие условия остались в старом сценарии, появляется предупреждение «Найдены недопустимые условия фильтра запуска» с кнопками «Перенести в CONDITION» и «Удалить условия». Перенос кладёт проверку в блок «Условие» после старта — там уже доступны {{chat.*}} и {{ticket.*}}. Учтите: условия из OR-групп при переносе становятся «И».

Пустая OR-группа

«Пустая OR-группа — сценарий никогда не сматчится. Добавьте хотя бы одно условие». Пустая AND-группа, наоборот, ничего не ограничивает.

Если ограничений нет​

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

Если снять последний канал или последнее условие, редактор спросит «Убрать последнее условие запуска?» — подтвердите кнопкой «Убрать условия» или оставьте хотя бы один канал или условие.

Какой сценарий сработает, если подходит несколько​

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

Тип сценарияЧто происходит
Поддержка, Тикетызапускается ровно один сценарий — с наибольшим приоритетом, а при равном приоритете созданный раньше
Глобальныйзапускаются все подходящие сценарии сразу

Приоритет в интерфейсе не задаётся и не отображается. Сценарии, созданные кнопкой «Создать», из шаблона или дублированием, получают приоритет 0. «Создать через ИИ» может выставить приоритет сам — посмотреть или изменить его нельзя. При нескольких подходящих сценариях «Поддержка» или «Тикеты» запускается сценарий с большим приоритетом, а при равном — созданный раньше (в списке «Сценарии» по умолчанию он выше). Чтобы работал нужный сценарий, держите на событии один опубликованный сценарий или разведите их дополнительными условиями.

Пока у обращения (тикета) есть запуск «Поддержки» («Тикетов»), который ждёт ответа клиента, новые события этого обращения другие сценарии того же типа не запускают: сообщение клиента продолжает ждущий запуск, а смена статуса, приоритета и прочие события просто не приводят к новому запуску. Глобальные сценарии при этом запускаются как обычно.

Кроме того, на одно обращение или тикет одновременно идёт только один запуск: новый вытесняет предыдущий — см. Версии и запуски.

Расписание​

Сценарий запускается по времени. Расписание задаётся конструктором, а не сырым cron: в поле «Расписание» выбирается частота — «Каждую минуту», «Каждые N минут», «Каждый час», «Каждый день», «Каждую неделю», «Каждый месяц», «Своё выражение». В зависимости от частоты появляются поля «Во время», «По дням» и «Число месяца», а под ними — человекочитаемое превью вида «По пн, ср в 09:00».

Режим «Своё выражение» принимает cron-строку из шести полей: секунды, минуты, часы, день месяца, месяц, день недели. Пример из подсказки: 0 0 9 * * MON-FRI — будни в 9:00.

Поле «Часовой пояс» — поиск по списку IANA с группой «Часто используемые», по умолчанию «UTC (по умолчанию)». Часовой пояс влияет на интерпретацию расписания.

В сценарии доступны {{trigger.fired_at}} (момент срабатывания) и {{trigger.cron}} (выражение, которое сработало).

Запуск идёт без клиента

У сценария по расписанию нет ни клиента, ни обращения, поэтому переменные {{user.*}}, {{chat.*}} и {{ticket.*}} в нём пусты, а блоки, которые записывают переменную с областью «Пользователь», остановятся с ошибкой.

Вебхук​

Внешняя система запускает сценарий HTTP-запросом по API-ключу проекта. Подсказка в редакторе: «URL вебхука для этого flow будет доступен после публикации» — готовой ссылки интерфейс не показывает, адрес собирается из ID сценария (он есть в адресе страницы редактора):

POST https://api.fixorix.ru/v1/flow/triggers/{flowId}/webhook
Authorization: Bearer <API-ключ>

Ключу нужно право FLOWS_WRITE — см. Сценарии в API и Права API-ключей. Сценарий должен быть опубликован, а в блоке «Старт» у него должен стоять триггер «Webhook».

В теле запроса передаются:

ПолеОбязательноОписание
payloadнетПроизвольный JSON — в сценарии доступен как {{trigger.payload.<ключ>}}
headersнетЗаголовки объектом «имя → значение» — {{trigger.headers.<заголовок>}}
userIdнетОт чьего имени идёт запуск
scopeIdнетUUID объекта (обращение, тикет), к которому относится запуск

Если в блоке «Старт» объявлены входные переменные, payload проверяется по ним до запуска, а значения попадают в сценарий как {{flow.<имя>}}.

Ограничения и правила безопасности:

  • вебхук вызывается только с API-ключом проекта — открытым URL он не является;
  • из поля headers сервер убирает Authorization, Cookie, Set-Cookie, Proxy-Authorization и X-Api-Key до того, как их увидит сценарий; имена остальных приводятся к нижнему регистру;
  • тело payload — не больше 64 КиБ;
  • на проект — не больше 600 вебхуков в минуту.

Ответы:

КодЧто означает
202Запуск создан; в теле — данные запуска (id, state и др.)
400 TRIGGER_TYPE_MISMATCHУ сценария не триггер «Webhook»
400 INPUT_VALIDATION_FAILEDТело не прошло проверку входных переменных (список в details.violations)
404Сценарий не найден
409Сценарий не опубликован
422 GUARDRAIL_VIOLATIONpayload больше 64 КиБ
429 RATE_LIMIT_EXCEEDEDБольше 600 вызовов в минуту на проект (см. заголовок Retry-After)

→ См. также Входящие вебхуки.

Ручной запуск​

Сценарий с триггером «Ручной запуск» стартует из чата, из тикета, из другого сценария или через API.

Из чата и из тикета (право — «Администратор»). В поле ввода сообщения есть кнопка «Запустить сценарий». По ней открывается список сценариев:

  1. Поле «Поиск по сценариям» ищет по названию и описанию.
  2. В чате сверху — секция «Рекомендовано AI» (сценарии, которые ИИ подобрал по контексту переписки), ниже — «Все сценарии». В тикете подбора нет — только «Все сценарии».
  3. После выбора сценария открывается окно «Запуск сценария» с его названием, описанием и разделом «Переменные». Если у сценария объявлены входные переменные, для каждой показывается своё поле, значения по умолчанию уже подставлены. Если объявлен пустой список — «Сценарий не требует входных переменных. Нажмите «Запустить»». Если входные переменные не объявлены вовсе, значения можно добавить парами ключ/значение кнопкой «Добавить переменную»: «Если сценарий ожидает переменные — добавьте их парами ключ/значение. {{flow.<ключ>}} в блоках вернёт значение». Один ключ дважды указать нельзя — «Один и тот же ключ указан несколько раз».
  4. Кнопка «Запустить». Значения проверяются: «Обязательное поле», «Значение не подходит по типу», «Должно быть одним из: …». Если всё в порядке, появляется уведомление «Сценарий запущен», при сбое — «Не удалось запустить сценарий».

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

После запуска в чате появляется системная запись «Сценарий „X“ запущен оператором», а поле ввода блокируется на время выполнения.

Из другого сценария. Сценарий с ручным запуском можно вызвать блоком «Перевести в сценарий»: в поле «Сценарий» выбираются опубликованные сценарии проекта с ручным запуском, в «Аргументы» — значения их входных переменных. Текущий запуск на этом заканчивается, разговор продолжает выбранный сценарий. Передач подряд — не больше 5. Если цель не опубликована, не с ручным запуском или аргументы не подходят, блок уходит в выход «Ошибка».

Через API — методом POST /v1/flow/executions/start, см. Сценарии в API.

Входные переменные объявляются в стартовом блоке в поле «Входные переменные» — правила именования и типы описаны в разделе Переменные. Их можно объявить только для триггеров «Ручной запуск» и «Webhook». Если сменить триггер на «Событие» или «По расписанию», объявленные входные переменные останутся в сценарии и не дадут его опубликовать — удалите их до смены триггера.

Переменные триггера​

У каждого триггера свой набор данных в {{trigger.*}}: для входящего сообщения это {{trigger.text}}, {{trigger.channel}}, {{trigger.button}}, для расписания — {{trigger.fired_at}}, для вебхука — {{trigger.payload.*}}. Полные таблицы — в разделе Переменные.

Ограничения​

ЧтоЛимит
Глубина дерева дополнительных условий5 уровней
Тело вебхука (payload)64 КиБ
Вебхуков в минуту на проект600
Прямых запусков через API (/v1/flow/executions/start) в минуту60 на клиента (без клиента — на проект); на запуск из чата и тикета лимит не действует
Передач подряд блоком «Перевести в сценарий»5

Кто что может​

ДействиеМинимальная роль
Смотреть настройки запускаПо умолчанию
Менять тип триггера, событие, условия и расписаниеРедактор
Публиковать сценарий, чтобы триггер заработалАдминистратор
Запускать вручную из чата или тикетаАдминистратор
Вызывать вебхук-триггерAPI-ключ проекта с правом FLOWS_WRITE

→ Блоки · Переменные · Версии и запуски