⚡ Триггеры
Триггер определяет, когда запускается сценарий. Он задаётся в стартовом блоке «Старт», в поле «Тип триггера»: «Событие», «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-группа — сценарий никогда не сматчится. Добавьте хотя бы одно условие». Пустая 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_VIOLATION | payload больше 64 КиБ |
429 RATE_LIMIT_EXCEEDED | Больше 600 вызовов в минуту на проект (см. заголовок Retry-After) |
→ См. также Входящие вебхуки.
Ручной запуск
Сценарий с триггером «Ручной запуск» стартует из чата, из тикета, из другого сценария или через API.
Из чата и из тикета (право — «Администратор»). В поле ввода сообщения есть кнопка «Запустить сценарий». По ней открывается список сценариев:
- Поле «Поиск по сценариям» ищет по названию и описанию.
- В чате сверху — секция «Рекомендовано AI» (сценарии, которые ИИ подобрал по контексту переписки), ниже — «Все сценарии». В тикете подбора нет — только «Все сценарии».
- После выбора сценария открывается окно «Запуск сценария» с его названием, описанием и разделом «Переменные». Если у сценария объявлены входные переменные, для каждой показывается своё поле, значения по умолчанию уже подставлены. Если объявлен пустой список — «Сценарий не требует входных переменных. Нажмите «Запустить»». Если входные переменные не объявлены вовсе, значения можно добавить парами ключ/значение кнопкой «Добавить переменную»: «Если сценарий ожидает переменные — добавьте их парами ключ/значение.
{{flow.<ключ>}}в блоках вернёт значение». Один ключ дважды указать нельзя — «Один и тот же ключ указан несколько раз». - Кнопка «Запустить». Значения проверяются: «Обязательное поле», «Значение не подходит по типу», «Должно быть одним из: …». Если всё в порядке, появляется уведомление «Сценарий запущен», при сбое — «Не удалось запустить сценарий».
В списке показываются только опубликованные сценарии с триггером «Ручной запуск» и подходящим типом: из чата — «Поддержка», из тикета — «Тикеты».
После запуска в чате появляется системная запись «Сценарий „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 |
→ Блоки · Переменные · Версии и запуски