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

🔢 Переменные

Сценарии работают с переменными — данными, которые передаются между блоками. В тексты, условия и поля блоков переменные подставляются синтаксисом {{...}}, вложенные поля — через точку: {{trigger.payload.order_id}}, {{chat.status}}.

Пробелы внутри скобок допустимы ({{ flow.name }} работает), внутри самого пути — нет. Имя переменной — латиница, цифры, подчёркивание и точка, начинается с буквы или подчёркивания, до 256 символов.

Источники переменных

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

ИсточникПрефиксКак живёт
Система{{system.*}}вычисляется в момент чтения, только чтение
Сценарий{{flow.*}}живёт в пределах одного запуска, пишется блоками
Пользователь{{user.*}}сохраняется для конкретного клиента и переживает запуски
Проект{{project.*}} (то же, что {{tenant.*}})общее для всего проекта значение
Триггер{{trigger.*}}данные события, которым запустился сценарий, только чтение

Отдельно стоят данные обращения и тикета — {{chat.*}} и {{ticket.*}}. Они не хранятся в запуске: сценарий подтягивает их из других сервисов по требованию, при первом обращении к переменной.

Системные переменные

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

ПеременнаяПримерЧто это
{{system.now}}2026-05-16T15:30:00ZТекущее время (UTC) в момент выполнения блока
{{system.today}}2026-05-16Сегодняшняя дата (UTC)
{{system.weekday}}SaturdayДень недели по-английски
{{system.utc_offset}}+00:00Смещение часов сервера от UTC
{{system.run_id}}UUIDИдентификатор этого запуска
{{system.flow_id}}UUIDИдентификатор сценария
{{system.flow_name}}Обработка возвратовНазвание сценария, может быть пустым
{{system.flow_type}}SUPPORTТип сценария
{{system.project_id}}UUIDИдентификатор проекта
{{system.project_name}}Acme BakeryНазвание проекта, может быть пустым

Переменные клиента

ПеременнаяЧто это
{{user.id}}UUID клиента — заполнен, если запуск идёт от имени клиента
{{user.first_name}}, {{user.last_name}}, {{user.username}}Имя, фамилия, ник
{{user.email}}, {{user.phone}}Контакты
{{user.locale}}, {{user.timezone}}Язык и часовой пояс
{{user.created_at}}Когда появилась запись о клиенте

Всё, что вы сами записали блоком «Переменная» с областью «Пользователь», тоже доступно как {{user.<имя>}}.

Пока не работает

Профильные поля (first_name, last_name, username, email, phone, locale, timezone, created_at) сейчас не заполняются и подставляются пустой строкой — интеграция с сервисом пользователей ещё не подключена. Реально заполнен только {{user.id}}. В панели переменных такие поля помечены бейджем «может быть пустым».

Переменные проекта

{{project.<ключ>}} — значения, записанные блоком «Переменная» с областью «Тенант». Они общие для всего проекта и живут между запусками. Префикс {{tenant.*}} — синоним, работает так же.

Обычно сюда кладут то, что не должно лежать в графе открытым текстом: ключ внешнего API, идентификатор кабинета, адрес эндпоинта. В блоке «HTTP запрос» такое значение подставляется в поле авторизации как {{project.api_token}}.

Секреты проекта и агент

Блоку «AI-агент» переменные {{project.*}} и {{tenant.*}} не выдаются намеренно — компилятор отклонит попытку добавить их в контекст агента. Но текст инструкции агента подставляется как обычный шаблон: если написать {{project.api_token}} прямо в инструкции, значение уедет в промпт модели. Не пишите секреты в инструкцию.

Данные обращения

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

ПеременнаяЧто это
{{chat.id}}UUID обращения
{{chat.channel}}Канал: vk, telegram, discord, website
{{chat.status}}Текущий статус
{{chat.priority}}Текущий приоритет
{{chat.line}}Линия поддержки; пусто, если не назначена
{{chat.assignee_id}}Ответственный; пусто, если не назначен
{{chat.platform_user_id}}ID клиента на платформе (например, Telegram)
{{chat.opened_at}}Когда обращение открыли
{{chat.tags}}Теги обращения (список)
{{chat.thread_id}}ID треда, если канал их поддерживает
Пока не работает

Читать эти поля пока нечем: система поддержки не отдаёт эндпоинт, из которого сценарий подтягивал бы состояние обращения. Поэтому любое обращение к {{chat.*}} в сценарии вернёт пустое значение — включая условия в блоке «Условие».

Что делать, пока это так: берите данные из события. Текст сообщения — {{trigger.text}}, нажатую кнопку — {{trigger.button}}, канал — {{trigger.channel}}, прошлый и новый статус — из полей события. Всё, что сценарий записал сам (например, ответ клиента из блока «Вопрос»), доступно как обычно через {{flow.*}}.

Вторая группа приходит вместе с событием и доступна только на своём событии:

ПеременнаяНа каком событии
{{chat.last_message}}«Сообщение от клиента»
{{chat.closed_at}}, {{chat.close_reason}}«Обращение закрыто»
{{chat.previous_status}}«Сменился статус обращения»
{{chat.previous_priority}}«Сменился приоритет»
{{chat.previous_assignee_id}}«Назначен оператор»
Событие «Назначен оператор» не приходит

Оно никогда не срабатывает, поэтому {{chat.previous_assignee_id}} в реальном запуске не встретится — см. Триггеры.

Данные тикета

Доступны в сценариях «Тикеты». Подтягиваются по запросу:

ПеременнаяЧто это
{{ticket.id}}UUID тикета
{{ticket.title}}Заголовок
{{ticket.description}}Описание; может быть пустым
{{ticket.status}}, {{ticket.priority}}Текущий статус и приоритет
{{ticket.assignee_id}}Исполнитель; пусто, если не назначен
{{ticket.author_id}}Кто создал тикет
{{ticket.category}}Категория; может быть пустой
{{ticket.tags}}Теги (список)
{{ticket.created_at}}, {{ticket.modified_at}}, {{ticket.modified_by}}Когда создан, когда и кем изменён

Событийные переменные:

ПеременнаяНа каком событии
{{ticket.previous_status}}«Сменился статус»
{{ticket.previous_priority}}«Сменился приоритет»
Исполнитель приезжает не тот

В событиях тикета поле исполнителя заполняется автором тикета, а не тем, на кого тикет назначен. Не стройте на нём маршрутизацию.

Данные триггера

Набор {{trigger.*}} зависит от того, чем запустился сценарий.

Триггер / событиеДоступные переменные
Любое событиеevent_type
«Сообщение от клиента», «Комментарий клиента»text, button, channel, attachments, location_lat, location_lng, contact_phone, contact_name
«Другие изменения» (тикет)changed_fields
По расписаниюfired_at, cron
Вебхукpayload.<ключ>, headers.<заголовок>
Биллингplan, subscription_id, invoice_id, amount, currency, days_left, ends_at, reason
Квотыperiod, current_usage, limit
Пользователиid, email, phone, name, source, tag, field, value, previous_value
«Упал флоу»run_id, flow_id, flow_name, flow_type, error, failed_block_id, failed_at
Берите текст из триггера

{{trigger.text}} — текст того сообщения, которым запуск начался. Ответ клиента на блок «Вопрос» лежит в {{flow.<имя>.text}}. Пока {{chat.last_message}} пуст, свежий текст в сценарии есть только в этих двух местах.

Области видимости

У переменных, которые вы создаёте блоками «Переменная», «Очистить переменную», «Изменить число» и «Переключить флаг», есть поле «Область»:

Значение в интерфейсеКак живёт
Сценарийтолько в текущем запуске, по завершении исчезает
Пользовательсохраняется для конкретного клиента между запусками, читается как {{user.<имя>}}
Тенантобщая на весь проект, читается как {{project.<имя>}}
Без клиента область «Пользователь» недоступна

Область «Пользователь» недоступна, если запуск идёт без клиента (например, по расписанию) — блок остановится с ошибкой. Используйте «Сценарий» или «Тенант».

Типы значений

Переменные бывают строкой, числом, логическим значением (да/нет), объектом (JSON), списком и датой/временем. Тип выводится из значения; в панели переменных он показан рядом с именем.

Входные переменные

Для триггеров «Ручной запуск» и «Webhook» в блоке «Старт» есть поле «Входные переменные»: «Доступны в шаблонах блоков как {{flow.<имя>}}». Если переменных нет — «Сценарий запускается без аргументов. Добавьте переменные если они нужны».

У каждой переменной задаются:

ПолеОбязательноОписание
ИмядаТолько snake_case и уникальное в рамках сценария
Типдаstring, number, boolean или json
ОбязательноенетЗначение придётся указать при запуске
Значение по умолчаниюнетПодставится, если значение не передали
ОписаниенетПояснение для того, кто запускает сценарий
Допустимые значения (enum)нетСписок разрешённых значений

Проверки, которые показывает редактор:

  • «Имя обязательно»;
  • «Только snake_case: lowercase, цифры, нижние подчёркивания»;
  • «Имя уже используется в этом сценарии»;
  • «Для обязательного поля default игнорируется — уберите одно из двух»;
  • «Значение по умолчанию не подходит по типу»;
  • «Значение по умолчанию должно быть из списка enum»;
  • «Добавьте хотя бы одно значение или выключите enum».

При ручном запуске значения проверяются ещё раз: «Обязательное поле», «Значение не подходит по типу», «Должно быть одним из: …».

Где посмотреть доступные переменные

В редакторе есть панель «Переменные» и шпаргалка «Доступные переменные» — список того, что реально доступно в этом сценарии с учётом его типа, триггера, события и того, какие блоки стоят выше по графу. Клик по переменной копирует её в буфер («Клик — скопировать в буфер»).

Бейджи в списке:

Что видноЧто означает
может быть пустымзначение бывает не заполнено
liveпересчитывается при каждом обращении
по запросуподтягивается из другого сервиса при первом обращении
приоритетная для этого блокаобычно именно её сюда и подставляют

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

Ограничения

ЧтоЛимит
Значение одной переменной64 КиБ
Все переменные одного запуска256 КиБ
Тело вебхука ({{trigger.payload}})64 КиБ
Размер графа сценария1 МиБ
Длина имени переменной256 символов

Блоки · Триггеры · Версии и запуски