>_
automate_this
Г
Это демо
Потыкай, посмотри как устроено — а чтобы начать, заведи аккаунт: M0 бесплатно.

M0-14Webhook + лог уведомлений

тренажёрfree
Представь: у тебя интернет-магазин, и каждый новый оплаченный заказ должен одновременно прилететь тебе в Telegram (чтобы сразу собрать и отправить) и попасть в журнал заказов (чтобы потом сводить с бухгалтерией и считать выручку). Соберём один воркфлоу, который делает обе задачи параллельно — это паттерн fan-out, когда от одной ноды расходятся две независимые ветки. Рядом соберём второй маленький воркфлоу, который имитирует приход заказа, чтобы тестировать всё прямо в n8n.
#webhook#fan-out#telegram#data-table#http-request#api

Что собираем

Соберём основной воркфлоу из трёх нод и второй маленький воркфлоу для тестирования с триггером Webhook. Это адрес в интернете, на который можно отправить POST-запрос с любым JSON. Когда запрос приходит, воркфлоу запускается.

От ноды Webhook сразу расходятся две параллельные ветки:

  • первая отправляет уведомление в Telegram;
  • вторая сохраняет запись в Data table.

Тестировать основной воркфлоу будем через второй маленький воркфлоу.

В нём Manual Trigger запускает ноду HTTP Request, а она отправляет POST-запрос на адрес твоего вебхука с тестовым JSON.

Готовый основной воркфлоу: Webhook → Telegram Send Message и параллельная ветка Webhook → Data table (fan-out)
Итоговый основной воркфлоу
Готовый тестовый воркфлоу: Manual Trigger → HTTP Request
Итоговый тестовый воркфлоу

Шаги выполнения

1Получи токен у @BotFather

Создаём бота через @BotFather и получаем токен — токен нужен n8n, чтобы сообщения шли от имени именно твоего бота. Подробнее про @BotFather и токен — в шпаргалке ниже.

Этот шаг ты делаешь в Telegram-приложении, n8n пока даже не открывай.

📖@BotFather: как создать собственного бота в Telegramстатья · ~2 мин

@BotFather: как создать собственного бота в Telegram

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

Зачем это нужно

Чтобы любой workflow (в n8n, Make, на собственном бэкенде) мог слушать сообщения и отвечать от имени бота, ему нужен токен Bot API. Токен выдаётся при создании бота через @BotFather. Без токена ни одна интеграция с Telegram не заведётся: токен — это пара «логин-пароль» бота при общении с Telegram Bot API.

Как это работает

Открываешь Telegram, в поиске находишь аккаунт с username BotFather (галка подлинности рядом с именем — синяя), и пишешь ему как обычному собеседнику. Команды начинаются со слэша:

  • /newbot — создать нового бота. @BotFather спросит две вещи:
  • отображаемое имя (любое, может быть с пробелами и кириллицей) — то, что увидят пользователи в шапке чата;
  • username (только латиница, цифры, подчёркивание; обязательно заканчивается на _bot или bot) — постоянный идентификатор, по которому бот ищется и не меняется.
  • /mybots — список всех твоих ботов, доступ к настройкам (имя, описание, аватарка, команды, токен).
  • /revoke — отозвать старый токен и получить новый (если старый утёк).

После /newbot приходит сообщение с токеном — длинная строка вида 123456789:ABCdefGHI_jklMNO.... Это и есть тот самый Bot API token: его копируешь и сохраняешь в безопасное место (менеджер паролей, заметки с шифрованием) — но не в публичный репозиторий и не в чат.

Типичные ошибки

  • Потерять токен — @BotFather показывает токен один раз; чтобы получить его снова, нужно открыть /mybots → <твой бот> → API Token. Если не нашёл — можно сгенерировать новый через /revoke, но тогда старый перестанет работать во всех уже настроенных интеграциях.
  • Скинуть токен скриншотом / в открытый чат — токен даёт полный контроль над ботом. Любой, кто его увидит, может слать сообщения от имени бота и читать всё, что ему приходит. Если утёк — сразу /revoke.
  • Username без _bot на конце — @BotFather отклонит регистрацию; правило жёсткое, придётся подбирать ещё.
  • Перепутали username и отображаемое имя — отображаемое имя меняется в любой момент через /setname, а username меняется только пересозданием бота. Если задумывался серьёзный бот — username стоит выбрать осознанно.

Когда не подходит

Через @BotFather нельзя создать юзербот (бот, который ходит под обычным аккаунтом) — это уже не Bot API, а MTProto, и токен оттуда не подходит. Также @BotFather не нужен, если бот уже создан кем-то другим и тебе просто передали готовый токен — тогда сразу заводишь credential в нужном сервисе и работаешь с ним.

📖Telegram: как устроен мессенджер — клиенты, серверы, чаты и ботыОткрыть
1.1
Найди @BotFather в Telegram

В Telegram найди аккаунт @BotFather (синяя галка подлинности рядом с именем). Открой с ним чат.

1.2
Создай нового бота командой /newbot

Отправь команду /newbot. На вопрос про имя — впиши любое отображаемое имя (например, «AI-помощник Вася»). На вопрос про username — придумай уникальный идентификатор латиницей, обязательно заканчивающийся на _bot или bot (например, vasya_ai_helper_bot).

1.3
Сохрани токен в надёжное место

В ответ @BotFather пришлёт сообщение с токеном — длинная строка вида 123456789:ABCdefGHI_jklMNO.... Скопируй её и сохрани в надёжное место (менеджер паролей, личная заметка) — токен это полный доступ к боту, светить его нельзя.

🎯
Тренажёр модуля I-Telegram
Если впервые создаёшь Telegram-бота — пройди модуль про Telegram.
2Создай Data table под журнал уведомлений

Начнём с хранилища — куда будем складывать входящие уведомления. Data table это встроенная в n8n таблица: ей задают имя и колонки с типами, после чего любая нода на canvas может писать в неё новые строки.

🗄Data table в n8n: что это и когда использовать вместо базы данныхстатья · ~3 мин

Data table хранит данные внутри n8n

Data table — это встроенное хранилище, которое живёт прямо в n8n. Таблица не требует отдельного сервера или подключения к внешней базе. Она принадлежит проекту и доступна всем воркфлоу внутри него.

Каждая таблица состоит из колонок с именем и типом и строк с данными. Доступ к таблицам идёт через ноду Data table с ресурсом Row или Table.

Как это работает

Нода Data table находится в Sidebar через + Add node → Data table. В Parameters выбирают Resource (Row или Table) и Operation (Get, Insert, Update, Delete, Upsert).

Типы колонок ограничены четырьмя вариантами:

  • String
  • Number
  • Boolean
  • Date

Тип json отсутствует. Если нужно хранить сложные объекты, их записывают как String и разбирают позже в ноде Code.

Правило выбора
Data table или Postgres

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

Data table не поддерживает транзакции, JOIN между таблицами и индексы. Параллельные записи из разных триггеров могут перезаписывать друг друга или падать.

Типичные ошибки

  • Ожидают тип json в колонке → его нет → хранят JSON как String и парсят в Code при чтении.
  • Пишут счётчики и журналы из нескольких триггеров одновременно → конкурентная запись смешивается → переносят таблицу в Postgres.
  • Заводят Data table под тысячи строк и отчёты → отсутствие индексов и агрегаций тормозит → используют Postgres.
  • Рассчитывают на JOIN между таблицами → его нет → денормализуют данные в одну таблицу или переходят на Postgres.
2.1
Создай новую таблицу Data tables

Создай новую таблицу Data tables под названием m0-14-notifications

2.2
Добавь колонку message

В созданной таблице нажми Add Column → впиши имя message → выбери тип String.

Это поле, куда будет складываться текст уведомления, пришедший с POST-запросом. Тип String подходит, потому что уведомление это обычный текст без ограничений по длине.

2.3
Добавь колонку received_at

Снова нажми Add Column → впиши имя received_at → выбери тип Date.

Сюда будет складываться время прихода уведомления — момент, когда вебхук получил POST-запрос. Тип Date важен именно здесь: позже это даст сортировку по времени, фильтр «за последний час» и так далее.

Параметры Data table
ПараметрЗначение
Имя таблицыm0-14-notifications (или любое другое в kebab-case)
Колонка 1message — String
Колонка 2received_at — Date
Автоколонки n8nid, createdAt, updatedAt (создаются автоматически, руками не добавляются)
🗄Как создать DataTable в n8nстатья · ~1 мин

Как создать DataTable

  1. В личном кабинете n8n зайди в проект → раздел Data tables → кнопка Create data table.
  2. Введи имя таблицы — как назван в задаче (например, students или Заказы).
  3. Добавь колонки: имя + тип. Для каждой колонки тип выбирается из выпадающего списка (String, Number, Boolean, Date).
  4. Сохрани схему. Теперь можно Add row через UI или писать туда из воркфлоу через ноду Data table.
3Создай основной воркфлоу и настрой Webhook

Здесь и до конца шага 5 работаем в первом воркфлоу — назовём его Notify Hub. В разделе Workflows создай новый воркфлоу с этим именем и переходи на canvas.

Первая нода — Webhook. Она генерирует уникальный URL и ждёт входящий HTTP-запрос на этот адрес. Когда запрос приходит, воркфлоу запускается.

Нам нужен метод POST. В POST-запрос отправитель кладёт данные в тело запроса — например, JSON с полями уведомления. В адресную строку браузера POST не вписать: его шлют программно — через curl, Postman или вторую n8n-ноду HTTP Request. Вторым воркфлоу в шаге 6 как раз и займёмся.

Параметр Respond оставим в режиме Immediately: пусть Webhook отвечает отправителю сразу, не дожидаясь пока Telegram и Data table закончат свою работу. Уведомление это «пришло-ушло»: тому кто его прислал, не важно знать что мы потом с ним сделали.

📖Webhook в n8n: как нода ждёт входящий запросстатья · ~2 мин

Webhook в n8n: как нода ждёт входящий запрос

Webhook — это URL-адрес, по которому внешний сервис или браузер может запустить воркфлоу. Нода Webhook создаёт такой адрес автоматически — тебе остаётся только настроить метод и способ ответа.

Два URL: Test и Production

Нода Webhook всегда выдаёт два разных адреса:

  • Test URL — работает только когда ты нажал Execute workflow (нода ждёт один входящий запрос, потом останавливается). Используется при сборке и отладке.
  • Production URL — работает постоянно, пока воркфлоу опубликован и активен. Используется в боевом режиме.

<!-- TODO: добавить ::figure с панелью параметров Webhook — Test URL и Production URL — до публикации задачи -->

Режим ответа: Using 'Respond to Webhook' Node

По умолчанию Webhook отвечает на запрос сразу, как только принял его. Когда выбираешь Using 'Respond to Webhook' Node — ответ откладывается до момента, когда нода Respond to Webhook явно его отправит. Это нужно, чтобы сформировать кастомный JSON-ответ в конце цепочки.

Pin data — зачем фиксировать данные

После первого запроса к Test URL нода получает входящие данные (headers, query, body). Кнопка Pin data фиксирует эти данные: все последующие запуски шагов будут использовать именно их, без повторного открытия браузера. Это ускоряет отладку — не нужно каждый раз отправлять новый запрос.

📖Способы общения клиента и сервера: от GET до event-drivenОткрыть
3.1
Добавь ноду Webhook

На пустом canvas нажми + или иконку поиска нод. В поиске введи webhook → выбери Webhook (нода с пометкой Trigger).

📖Как добавить ноду в n8nстатья · ~2 мин

Добавление ноды на canvas

Чтобы продолжить цепочку, нужно вставить новую ноду после существующей или на пустой canvas. Для этого открывают панель выбора нод тремя способами: кнопка Open nodes panel в центре canvas, кнопка Add node на стрелке соединения и + на output-коннекторе любой ноды.

Панель называется What happens next?. В ней сразу видно категории и поле поиска.

Как это работает

  • Клик по Open nodes panel или Add node открывает список.
  • В поле Search nodes... вводят имя ноды или сервиса (например http, slack, schedule). Список фильтруется по мере ввода.
  • Навигация по категориям: AI, Action in an app, Data transformation, Flow, Core, Human review, Add another trigger.
  • Клик по названию ноды ставит её на canvas и сразу открывает панель Parameters.
  • На пустом canvas можно нажать клавишу Tab — откроется та же панель без клика мышью.

Первая нода любого воркфлоу должна быть триггером (Schedule Trigger, Webhook, Manual и подобные). Обычные ноды-действия в начало ставить нельзя.

Правило одной строкой
Первая нода — всегда триггер

Если первой стоит обычная нода-действие, воркфлоу не запустится. Начинай всегда с триггера.

Типичные ошибки

  • Поставил обычную ноду первой → воркфлоу не из чего стартовать → замени первую ноду на триггер из категории Core или через поиск.
  • Ищут ноду по русскому названию → список остаётся пустым → вводи английское имя сервиса в поле Search nodes....
  • Целятся мышью в мелкий + на стрелке → промахиваются → нажми Tab прямо на canvas.
  • Открывают категорию Add another trigger после уже существующей ноды → добавляют лишний триггер → для обычного шага используй поиск или категории Action in an app и Data transformation.
3.2
Переключи HTTP Method на POST

Открой ноду двойным кликом. В поле HTTP Method поменяй значение с GET на POST.

POST используют когда отправитель кладёт данные в тело запроса — например, JSON с полями уведомления. GET для этого не подходит: у него нет тела, есть только адрес и query-параметры.

3.3
Замени Path на 'm0-14-notify'

В поле Path стоит автоматически сгенерированный идентификатор. Замени его на m0-14-notify — короткий читаемый идентификатор, который потом легко найти в логах и в адресной строке.

3.4
Проверь параметр Respond

Найди параметр Respond. Убедись что стоит значение Immediately (по умолчанию так и есть).

Это значит: «получил запрос — сразу отвечаю отправителю, не дожидаясь когда Telegram и Data table закончат работу». Отправитель получит дефолтный ответ {"message": "Workflow was started"} практически мгновенно.

3.5
Проверь параметры ноды

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры Webhook
ПараметрЗначение
HTTP MethodPOST
Pathm0-14-notify
RespondImmediately

Нода настроена. Тестировать её через реальный POST-запрос мы будем в шаге 6, когда соберём воркфлоу-отправщик. А сейчас, чтобы настроить следующие ноды (Telegram Send Message и Data table) на реальных данных, нужно положить в Output вебхука тестовый JSON руками.

3.6
Отредактируй Output триггера через Edit Output

В панели Output справа от параметров нажми Edit Output. Откроется окно со старым (пустым) JSON.

Замени всё содержимое на:

[
  {
    "headers": { "content-type": "application/json" },
    "params": {},
    "query": {},
    "body": { "message": "Новый заказ #42 оплачен" }
  }
]

Нажми Save. На canvas нода Webhook получит фиолетовую обводку — это значит, что данные запинены. Теперь нижние ноды смогут видеть Output вебхука и тащить из него поля через drag-and-drop.

📖Edit Output: как поменять запинённые данные на летустатья · ~1 мин

Edit Output: как поменять запинённые данные на лету

Когда у ноды зафиксированы данные через Pin Data, в панели Output рядом с иконкой булавки появляется ещё одна кнопка — Edit Output (иконка карандаша). Она открывает запинённый JSON прямо в браузере на редактирование: можно поменять значения полей, не отправляя новый запрос во внешний сервис.

Зачем это нужно

Главный сценарий — тестировать одну и ту же цепочку нод на нескольких разных входах. Запинил один пример → отредактировал ему текст → запустил воркфлоу → отредактировал на другой текст → снова запустил. Особенно полезно при отладке роутеров (Switch, IF, Text Classifier) — каждая ветка требует своего набора входных данных, и звать внешний источник под каждый кейс долго.

Как редактировать

  1. У ноды с запинёнными данными в панели Output найди кнопку Edit Output (карандаш рядом с булавкой).
  2. JSON в панели станет редактируемым полем — впиши новые значения или поменяй существующие.
  3. Нажми Save (или клик за пределами поля). Новые данные останутся запинёнными до следующего редактирования или снятия пина.

Что важно

  • Не ломай структуру JSON случайно. Если случайно удалить нужное поле или сломать вложенность, следующие ноды получат не те данные и упадут с ошибкой cannot read properties of undefined. Для проверки веток меняй значения, а не ключи. Можно и заменить пример целиком готовыми данными с другим составом полей — тогда проверь, что следующие ноды читают поля, которые в нём есть.
  • Меняй только то, что должно поменяться. Для тестирования ветки роутера обычно достаточно подменить одно поле (например, message.text) — всё остальное оставить.
  • Edit Output не вызывает реальный источник. Это локальное редактирование пина в браузере, никакого запроса в Telegram / API / другую систему n8n не делает.
  • Чтобы вернуться к настоящим данным от триггера — сними пин и поймай новый event через Execute workflow.
📖JSON: формат данных, синтаксис и типыОткрыть
Основной воркфлоу после шага 3: одна нода Webhook на canvas с фиолетовой обводкой (данные запинены)
Основной воркфлоу после шага 3 — Webhook настроен, тестовый Output запинен
4Подключи Telegram Send Message (Основной воркфлоу)

Вторая нода основного воркфлоу — Telegram Send Message. Она пришлёт тебе уведомление от бота в Telegram-чат с текстом из поля body.message.

4.1
Добавь ноду Telegram Send Message

На canvas нажми + справа от ноды Webhook. В поиске нод введи telegram → выбери action-ноду Telegram → выбери Send a text message.

4.2
Добавь credential в Telegram Send Message

Открой ноду двойным кликом. В поле Credential to connect with нажми Create New Credential и вставь туда токен, который получил у @BotFather в шаге 1. Сохрани.

🔑Как добавить credential в n8nстатья · ~1 мин

Универсальный процесс добавления credential

Credential в n8n — это сохранённая «учётка» для подключения к сервису (API-ключ, OAuth-токен, логин/пароль и т.д.). Любая нода, которой нужна авторизация, выбирает credential из общего списка — поэтому добавлять его нужно один раз, а использовать можно из любого количества нод того же типа.

Пошагово

  1. В левом меню n8n открой раздел Credentials.
  1. Нажми кнопку Add credential (правый верхний угол).
  1. В поиске введи название нужного типа credential — например, OpenAI, Header Auth, Postgres, Google — и выбери его из списка.
  1. В шапке формы дай credential понятное имя — например, OpenAI школа или Postgres prod. По этому имени ты будешь выбирать его в нодах.
  1. Заполни поля формы. Какие именно — зависит от типа: для API-ключевых это обычно одно поле API Key, для Header Auth — Name и Value заголовка, для Postgres — host/port/database/user/password, для OAuth — запуск OAuth-flow по кнопке.
  1. Нажми Save. Готово — credential можно подключать к любой ноде, которая поддерживает этот тип.
Подсказка
Один credential — много нод

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

Кстати
Какие поля заполнять у конкретного типа

Этот гайд — про универсальный процесс. Какие поля и какие значения вводить у конкретного credential (OpenAI API, Header Auth, Postgres и т.д.) — смотри в inline-статье на этот тип, она будет рядом со ссылкой на текущую.

4.3
Заполни поле Chat ID

В поле Chat ID впиши свой собственный Chat ID — числовой идентификатор твоего личного чата с ботом в Telegram.

📖Как узнать свой Telegram chat IDстатья · ~1 мин

Как узнать свой Telegram chat ID

chat_id — числовой идентификатор чата в Telegram. Bot API принимает его как целое число, потому что именно так хранится связь в базе Telegram и потому что username может измениться, а число — нет.

Для личных чатов твой chat_id совпадает с user_id и всегда положительный. Группы и каналы имеют отрицательный chat_id (для супергрупп начинается с -100).

Как это работает

API Telegram описывает chat_id как Integer. Значение может занимать больше 32 бит, поэтому для хранения в базе данных нужен 64-битный тип.

Получить свой chat_id можно двумя способами:

  • Отправь /start боту @userinfobot — в ответе придёт твой Id.
  • Открой Saved Messages в Telegram Web, в адресе после символа # будет число — это и есть chat_id.

В n8n это число вставляют в поле Chat ID ноды Telegram при отправке сообщения.

Числовой идентификатор надёжнее @username: API быстрее его обрабатывает и не зависит от смены имени пользователя. Для публичных чатов API ещё принимает строку с @username, но для личных контактов требуется именно число.

Важно
chat_id — это не username

API ждёт целое число. Если передать @username в поле, предназначенное для приватного чата, вернётся ошибка chat not found.

Типичные ошибки

  • Подставили @username вместо числа → Bot API вернёт Bad Request: chat not found → используй только полученное числовое значение.
  • Скопировали чужой пример с числовым ID → сообщения уйдут другому человеку → всегда получай chat_id одним из двух способов для своего аккаунта.
  • Перепутали личный chat_id и ID группы → ID группы отрицательный, личный — положительный → проверяй знак числа перед вставкой.
  • Сохранили chat_id в 32-битное поле базы данных → у части пользователей ID больше 2³¹ → используй 64-битный integer или double.
4.4
Заполни поле Text

В панели Input слева раскрой Webhook → раскрой объект body → перетащи поле message в поле Text.

В поле появится выражение {{ $json.body.message }}.

Это текст уведомления, который прислал отправитель в теле POST-запроса. Telegram Send Message стоит сразу после Webhook, поэтому достаточно $json — это и есть выход ноды Webhook, имя ноды прописывать не нужно.

📖Что такое expression в n8n и как она читает значения из других нодстатья · ~2 мин

Что такое expression

В n8n expression — это маленький кусочек кода в фигурных скобках, который динамически подставляет значение в поле ноды. Записывается так:

{{ <выражение> }}

В поле интерфейса = перед выражением писать не нужно: поле в режиме Expression уже трактует содержимое как выражение, а знак = n8n сам добавляет в файле воркфлоу (JSON) как маркер. Если напечатать = самому, он попадёт в результат текстом (например, сообщение начнётся с «=🚨»). Если поле осталось в режиме Fixed, {{ ... }} запишется как обычный текст.

Внутри {{ }} пишется JavaScript-выражение. Самое частое — чтение значения из другой ноды.

Зачем нужны expressions

Каждое поле в параметрах ноды может быть либо фиксированным значением (например, URL https://api.example.com), либо expression'ом — формулой, которая считается на лету в момент исполнения ноды. Expressions нужны, когда значение зависит от данных, пришедших из предыдущей ноды.

К примеру
Где это встречается

К примеру, ты сделал ноду «прочитать строку из таблицы конфига», а следующая нода — HTTP Request к внешнему API. В URL этой HTTP-ноды можно подставить значение из конфига: {{ $('Get Config').item.json.api_url }} — n8n при каждом исполнении возьмёт актуальный URL из таблицы, а не зашитый в ноду.

Как читать значения из других нод

Базовая формула: {{ $('<имя_ноды>').item.json.<поле> }}

Разбор по частям:

  • $('<имя_ноды>') — обращение к ноде по имени (то, что написано на холсте под нодой). Имя — в одинарных кавычках, точно как на холсте.
  • .item — текущий элемент, который обрабатывается. У большинства нод элементов несколько (массив), item берёт тот, что соответствует текущей итерации.
  • .json — содержимое поля json элемента (там лежат все данные, которые нода вернула).
  • .<поле> — конкретное поле внутри json. Если поле вложенное — пишется через точку: .config.embedding_model.

Пошагово — как вставить expression в поле

  1. Наведи курсор на поле и переключи Fixed → Expression в правом верхнем углу поля (или просто начни вводить {{ — поле само перейдёт в режим expression).
  2. В появившемся окне (expression builder) — слева список нод воркфлоу, можно кликать по полям и они вставятся в формулу.
  3. Справа — preview: видно, какое значение получится прямо сейчас. Если красным — формула или путь к полю некорректные.
  4. Закрой окно, поле остаётся в режиме expression (синий фон + иконка fx).
Типичная ошибка
Поле в режиме `Fixed` вместо `Expression`

Если вставил {{ ... }} в поле, которое осталось в режиме Fixed, n8n запишет текст {{ ... }} как есть, и нода уйдёт делать HTTP-запрос на URL вроде {{ $('...').item.json.api_url }} буквально. Симптом — ошибка Invalid URL или 404 на странную строку. Лечение: переключи поле в Expression. И наоборот, = в начале вручную не печатай — он попадёт в результат.

Типичные ошибки

  • Имя ноды не совпадает. В формуле $('Get Config') имя должно точно совпадать с подписью ноды на холсте. Если переименовал ноду — старые expressions, ссылающиеся на неё, сломаются.
  • Путь к полю не существует. .item.json.embedding_dimensions упадёт с undefined, если у элемента такого поля нет. Проверка — посмотри preview в expression builder, он сразу показывает значение или ошибку.
  • Поле осталось в режиме Fixed. Самая частая ошибка — описана в callout выше.
  • Кавычки внутри {{ }}. Внутри expression строки оборачиваются одинарными кавычками: {{ 'Hello ' + $json.name }}; двойные тоже работают. Поля с кириллицей и пробелами читаются как $json["Имя"].

Когда expression не нужен

Иногда поле должно быть фиксированным. Например, метод HTTP-запроса (GET / POST) или имя коллекции, которое одинаково для всего воркфлоу — нет смысла читать его динамически. Простое правило: если значение меняется от итерации к итерации или зависит от пришедших данных — нужен expression; если значение постоянное — оставляй фиксированным.

⚡Как передать данные из одной ноды в другую через drag-and-dropстатья · ~2 мин

Перетаскивание полей из Input panel

Когда нужно подставить значение из предыдущей ноды в параметр текущей, не пиши выражение вручную. Открой ноду двойным кликом. Слева откроется Input panel с деревом полей предыдущей ноды. Справа — node parameters.

Раскрой нужное поле в Input panel и перетащи его мышкой в parameter's field. n8n сам сформирует выражение и переключит поле из режима Fixed в Expression.

Как это работает

Input panel показывает данные из OUTPUT предыдущей ноды. Данные приходят в виде дерева: каждое поле можно раскрыть до примитива.

После drop в parameter's field появляется выражение в двойных фигурных скобках. n8n поддерживает два формата:

  • $json.<field> — когда данные идут напрямую из предыдущей ноды по главной ветке;
  • $('<NodeName>').item.json.<field> — когда нужно явно указать имя ноды-источника.

n8n сам определяет нужный item через item linking. Ручной поиск соответствия не требуется.

Поле автоматически окрашивается и переключается в режим Expression. Альтернатива — открыть expressions editor и написать то же выражение вручную. Результат идентичен.

Вложенные поля раскрываются через точку: $json.body.city.

Правило одной строкой
Перетаскивай только до примитива

Если перетащить объект-обёртку, в поле попадёт [object Object]. Всегда раскрывай дерево до конечного значения.

Типичные ошибки

  • Перетащил объект-обёртку вместо примитива → в поле уходит [object Object] → раскрой дерево до листа.
  • Дропнул в соседнее поле параметра (Text вместо Chat ID) → нода работает не на тех данных → визуально проверь куда легло выражение.
  • Переименовал ноду уже после drag-and-drop → expression $('старое имя') сломался → верни старое имя или перепиши выражение вручную.
  • Впечатал статичное значение через drag вместо обычного текста → лишнее выражение там где значение не меняется → для констант просто впечатывай текст.
  • Тащишь из ноды через ветку которая не выполнялась → expression вернёт undefined → проверь что нужная ветка реально дошла до текущей ноды.
4.5
Выключи Append n8n Attribution

Прокрути вниз до раздела Additional Fields. Нажми Add Field → выбери Append n8n Attribution → выключи переключатель (должен стать серым).

⚙Append n8n Attribution: подпись в конце автоматических сообщенийстатья · ~2 мин

Append n8n Attribution: подпись в конце автоматических сообщений

Параметр Append n8n Attribution находится в ноде Telegram. По умолчанию он добавляет в конец каждого отправленного сообщения строку «This message was sent automatically with n8n».

Параметр спрятан: он появляется только после раскрытия Additional Fields. Значение по умолчанию — On, поэтому подпись появляется автоматически, если ничего не менять.

Зачем это нужно

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

Как это работает

Параметр — простой переключатель внутри Additional Fields.

  • On (включён) — в конец текста дописывается фраза «This message was sent automatically with n8n».
  • Off (выключен, серый) — фраза не добавляется.

Чтобы добраться до переключателя, открой Parameters → Additional Fields → Add Field → выбери Append n8n Attribution.

Коротко
Когда выключать

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

Типичные ошибки

  • Параметр не виден на основном экране → ищут его в Parameters → нужно раскрыть Additional Fields через Add Field.
  • Оставили On для реальных пользователей → получатели видят упоминание n8n → переключи в Off, чтобы переключатель стал серым.
  • Перепутали с Parse Mode → правят соседний пункт → Parse Mode отвечает за форматирование, а Append n8n Attribution — только за подпись.
  • Выключили, но не проверили → подпись осталась → убедись, что переключатель серый.
4.7
Запусти Execute step и проверь результат

В ноде нажми кнопку Execute step в правом верхнем углу. Нода выполнится на запиненных данных от Webhook. На canvas получит зелёную обводку с галочкой, а в Telegram придёт сообщение Новый заказ #42 оплачен от твоего бота.

📖Кнопка «Execute step»: запуск одной ноды без всего воркфлоустатья · ~2 мин

Запустить одну ноду, не дёргая весь workflow

Execute step — это кнопка внутри панели ноды (открывается двойным кликом по ноде). По смыслу — младший брат большой кнопки Execute workflow внизу холста: та запускает весь воркфлоу с начала, эта — только текущую ноду. Удобно, когда настраиваешь параметры и хочешь сразу видеть, что отдаёт нода, не перезапуская всю цепочку.

Как это работает

Когда ты жмёшь Execute step, n8n берёт уже существующие данные на входе ноды (output предыдущей ноды из последнего прогона) и прогоняет через эту ноду. Сама нода выполняется реально: HTTP-запрос уходит, запись в базу пишется, письмо отправляется. Это не «сухой прогон», а полноценное выполнение — только одного шага.

  • key: Execute workflow

value: Запускает весь воркфлоу от триггера. Нужен полный прогон с самого начала. Каждый раз заново дёргает все API.

  • key: Execute step

value: Запускает только эту ноду. Берёт вход из последнего output предыдущей ноды. Идеально для подбора параметров и отладки.

  • key: Когда работает

value: Только если на входе ноды есть данные с прошлого прогона. Если ни разу не запускал предыдущие — кнопка либо ничего не вернёт, либо упадёт «No input data».

Типичный сценарий: запустил весь воркфлоу один раз (Execute workflow), увидел что нода HTTP Request отдаёт не то, поправил поле URL, нажал Execute step — увидел новый результат за секунду. Предыдущие ноды повторно не выполнялись.

У триггеров кнопка называется иначе
Смысл тот же — запустить один шаг и получить тестовое событие

У некоторых триггерных нод n8n кнопка Execute step подписана по-другому, потому что у триггера нет «входа» — он сам должен сходить за событием. Например, у RSS Trigger она называется Fetch Test Event: клик подтянет последние записи из ленты и положит их на выход ноды как тестовый input для остального воркфлоу. Работает идентично Execute step обычной ноды — точно так же используется для отладки и подбора параметров без полного прогона.

Важно про побочные эффекты
Каждый Execute step — это реальный вызов

Нода с записью в базу или отправкой сообщения каждое нажатие Execute step делает реально: 5 нажатий = 5 записей / 5 писем. Для отладки таких нод используй тестовые данные или подменяй credentials.

Типичные ошибки

  • Жать Execute step на ноде, у которой ещё не было входных данных → «No input data», нода не запустится. Сначала прогони весь воркфлоу через Execute workflow или хотя бы триггер вручную, чтобы у каждой ноды появился output.
  • Использовать Execute step для проверки изменений в предыдущих нодах → текущая нода работает со старым output, изменения не подхватятся. Если поправил предыдущую ноду — перезапусти её, а потом уже текущую.
  • Тестировать ноду с побочным эффектом (запись в БД, отправка письма) на проде → каждый клик создаёт реальную запись. Использовать тестовый credential или временно подменять параметры на безопасные.
Параметры Telegram Send Message
ПараметрЗначение
Credentialтвой Telegram-бот из шага 1
ResourceMessage
OperationSend a text message
Chat IDтвой личный Chat ID
Text={{ $json.body.message }}
Additional Fields → Append n8n Attributionoff
Воркфлоу после шага 4: Webhook → Telegram Send Message, обе ноды с зелёными галочками
Воркфлоу после шага 4
5Подключи Data table параллельно с Telegram (Основной воркфлоу)

Третья нода — Data table в режиме Insert Row. И вот ключевой момент задачи: эту ноду нужно подключить не к Telegram, а напрямую к Webhook — параллельно с уже существующей веткой Telegram.

Так Webhook получит два независимых выхода. Когда придёт POST-запрос, n8n выполнит обе ветки — и отправку в Telegram, и запись в Data table; по очереди, сверху вниз по холсту. Это и есть fan-out — один вход, несколько параллельных выходов.

📖Fan-out: одна нода — несколько ветокстатья · ~2 мин

Одна нода — несколько независимых веток

Fan-out — это способ соединения, при котором от одной ноды-источника отходят сразу несколько исходящих стрелок. Каждая стрелка ведёт в свою отдельную ветку, и каждая ветка получает данные источника.

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

Как это работает

Чтобы построить fan-out, на холсте нажми + справа от ноды-источника и выбери следующую ноду. Повтори действие для каждой новой ветки. Важно: плюс нужно нажимать именно на источнике, а не на уже подключённой ноде-получателе.

Каждая ветка получает копию одних и тех же данных. Если источник — Schedule Trigger или Webhook, все подключённые ветки увидят одинаковый json.

Ветки выполняются по очереди: сначала целиком верхняя по холсту, потом следующая под ней. Порядок задаёт положение веток на холсте — передвинул ноду выше или ниже, поменялся порядок. Ошибка в ветке останавливает всё выполнение: ветки, до которых очередь не дошла, не запустятся вовсе (n8n 2.20.7).

Fan-out отличается от линейной цепочки A → B → C: ветки не передают данные друг другу, каждая берёт их у источника. Он также отличается от нод IF и Switch: там данные распределяются по условию, а при fan-out копия уходит во все ветки без разбора.

Типичные применения: отправка уведомления в Telegram и запись в Data table из одних и тех же данных, запросы через HTTP Request к разным сервисам, чтение нескольких таблиц Data table.

Правило одной строкой
Много выходов из одной ноды

Fan-out — это много выходов из одной ноды. Все ветки получают одинаковые данные и выполняются по очереди сверху вниз.

Типичные ошибки

  • Подключил вторую ветку не к источнику, а к первой ноде-получателю → получилась последовательная цепочка, сбой первой остановит вторую → жми + именно на источнике.
  • Ждёшь что вторая ветка получит «половину» данных → на самом деле обе ветки получают одинаковый вход → если нужно разделить — это IF или Switch, не fan-out.
  • Ветка, которая должна отработать первой, стоит на холсте ниже другой → она ждёт, пока целиком пройдёт верхняя (а если там страница формы или ошибка — не запустится) → поставь её выше.
  • Ждёшь, что при ошибке в одной ветке остальные доработают → выполнение останавливается целиком → у ноды, которая может упасть, включи Settings → On Error = Continue или вынеси рискованную ветку вниз.
  • Перепутал fan-out с merge: думаешь что несколько входов в одну ноду = fan-out → fan-out это много выходов из одной ноды, обратное — fan-in / merge.
5.1
Добавь ноду Data table

На canvas нажми + справа от ноды Webhook (не от Telegram Send Message). Появится новая исходящая стрелка от Webhook — это и есть второе ответвление.

В поиске нод введи data table → выбери Data table → в открывшемся подменю выбери Insert Row.

5.2
Выбери таблицу m0-14-notifications

Открой ноду двойным кликом. В поле Data table оставь режим From list и выбери из выпадающего списка таблицу m0-14-notifications, которую создал в шаге 2.

После выбора в нижней части параметров появится секция Values to insert с двумя строками — по одной на каждую колонку таблицы (message и received_at).

5.3
Замапь колонку message

В секции Values to insert найди строку message. В панели Input слева раскрой Webhook → раскрой объект body → перетащи поле message в значение колонки message.

В поле появится выражение {{ $json.body.message }}.

Это тот же текст, что и в Telegram-сообщении — он берётся из тела POST-запроса. Data table подключён напрямую к Webhook, поэтому $json это и есть выход вебхука.

5.4
Замапь колонку received_at через $now

В строке received_at впиши выражение вручную (без drag-and-drop). Кликни в поле значения и впиши:

{{ $now }}

$now это встроенная переменная n8n — текущий момент времени в формате, который колонка Date принимает без дополнительной конвертации. Каждое выполнение ноды берёт свой собственный $now — то есть для каждой записи в таблице будет своё реальное время прихода уведомления.

📖$now — текущий момент времени в выражениях n8nстатья · ~2 мин

$now — готовый объект текущего момента

$now — встроенная переменная n8n, доступная в любом Expression-поле. Это не функция и не строка, а уже готовый объект Luxon DateTime — момент времени в часовом поясе воркфлоу (Settings → Timezone); если он не задан — в поясе инстанса n8n. Пересчитывается на каждой итерации каждого запуска.

Если просто подставить {{ $now }} в строку — Luxon сам приведёт объект к ISO-строке вида 2026-05-28T14:35:12.345Z (в конце — часовой пояс инстанса: Z для UTC, +02:00 для Берлина летом). Но настоящая польза — в методах, которые можно вызывать прямо в выражении.

Базовые методы

Базовые методы $now
МетодЧто делает
$now.toISO()строка ISO 8601. Самый частый формат для API и БД.
$now.toFormat("yyyy-MM-dd HH:mm")произвольный формат. Токены Luxon: yyyy, MM, dd, HH, mm, ss, EEE (день недели коротко).
$now.toMillis()Unix timestamp в миллисекундах (число).
$now.toUnixInteger()Unix timestamp в секундах (число).
$now.plus({days: 7}) / $now.minus({hours: 3})арифметика по календарю. Юниты: years, months, weeks, days, hours, minutes, seconds.
$now.startOf('day') / $now.endOf('month')округление к началу/концу периода. Юниты те же.
$now.toUTC() / $now.setZone('Europe/Berlin')перевод в другой часовой пояс.
$now.year / $now.month / $now.day / $now.hour / $now.weekdayдоступ к отдельным компонентам. weekday: 1 — понедельник, 7 — воскресенье.

Родственная переменная

$today — то же самое, что $now.startOf('day'): текущая дата с обнулёнными часами/минутами/секундами. Удобно, когда нужна «дата без времени» (например, для группировки записей по дню).

Где встречается чаще всего
Типичные кейсы для `$now`

В URL HTTP-запроса: ?from={{ $now.minus({days: 1}).toISO() }}. В Set / Edit Fields — записать момент обработки в Data table. В If/Filter — сравнить дату из входных данных с «не старше 7 дней» ($now.minus({days: 7})). В HTTP-заголовке: Date: {{ $now.toFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'") }}.

Часовой пояс
`$now` возвращает момент в часовом поясе воркфлоу, не в UTC

Пояс воркфлоу задаётся в Settings → Timezone; если он не задан, берётся пояс инстанса. Если сравниваешь $now с датой, которую API отдал в UTC, — будет ошибка на N часов. Перед сравнением приводи обе стороны к одному поясу: $now.toUTC() либо вызывай setZone(...) на дате из входа.

Типичные ошибки

  • Пишут $now() со скобками → $now это уже готовый объект, а не функция, скобки лишние.
  • Складывают как число: $now + 86400000 → не работает; календарную арифметику делает $now.plus({days: 1}).
  • Передают $now напрямую в БД, где поле ждёт bigint timestamp → улетит ISO-строка вместо числа; явно вызови .toMillis() или .toUnixInteger().
  • Сравнивают $now с пустым полем даты из входа → выражение упадёт; перед сравнением поставь проверку is not empty.
  • Используют is equal to для «сегодня» → совпадение только до миллисекунды; для «в течение этого дня» делай диапазон через $now.startOf('day') и $now.endOf('day').
5.5
Проверь параметры ноды

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры Data table (Insert Row)
ПараметрЗначение
ResourceRow
OperationInsert
Data tableFrom list + m0-14-notifications
Mapping Column ModeMap Each Column Manually
Values to insert → message{{ $json.body.message }}
Values to insert → received_at{{ $now }}

Нода настроена. Теперь её нужно протестировать — на запиненных данных от Webhook.

5.6
Запусти Execute step и проверь результат

В ноде нажми кнопку Execute step в правом верхнем углу. Нода выполнится на запиненных данных от Webhook. На canvas получит зелёную обводку с галочкой, а в Output появится JSON с добавленной строкой — поля message, received_at плюс автополя id, createdAt, updatedAt.

Воркфлоу после шага 5: Webhook с двумя исходящими ветками — Telegram Send Message сверху и Data table снизу, все три ноды с зелёными галочками
Готовый основной воркфлоу после шага 5 — fan-out паттерн из трёх нод
6Собери тестовый воркфлоу-отправщик

Основной воркфлоу собран на запиненных данных. Теперь нужен реальный POST-запрос извне, чтобы убедиться что Webhook действительно принимает данные через сеть.

Для этого соберём второй воркфлоу — назовём его Notify Tester. В нём всего две ноды: Manual Trigger (запуск по нажатию кнопки) и HTTP Request (нода, которая шлёт HTTP-запрос на любой адрес). Она пошлёт POST на Test URL твоего вебхука с тестовым JSON.

Создай новый воркфлоу Notify Tester в разделе Workflows и держи его в соседней вкладке браузера — основной Notify Hub оставь открытым в первой. Тест в следующем шаге работает попеременно в обеих, удобно когда переключение в один клик.

6.1
Добавь Manual Trigger

На пустом canvas нового воркфлоу нажми + → в поиске нод введи manual → выбери Manual Trigger (нода с пометкой Trigger).

Эта нода без параметров — она просто запускает воркфлоу когда ты нажимаешь кнопку Execute workflow внизу canvas.

6.2
Добавь ноду HTTP Request

Справа от Manual Trigger нажми + → в поиске нод введи http request → выбери HTTP Request.

6.3
Переключи Method на POST

Открой ноду HTTP Request двойным кликом. В поле Method поменяй значение с GET на POST.

6.4
Скопируй Test URL из основного воркфлоу

Переключись на вкладку с Notify Hub. Открой ноду Webhook двойным кликом. Сверху есть два URL — Test URL и Production URL. Скопируй Test URL (иконка копирования рядом).

Test URL выглядит примерно так: https://n8n.school.automate-this.com/webhook-test/m0-14-notify.

6.5
Вставь Test URL в поле URL ноды HTTP Request

Вернись на вкладку с Notify Tester. В поле URL вставь скопированный Test URL.

6.6
Включи Send Body

Прокрути ниже до переключателя Send Body. Включи его (станет зелёным).

Появится секция настройки тела запроса.

6.7
Проверь Body Content Type = JSON

В появившемся поле Body Content Type оставь значение JSON (стоит по умолчанию).

📖POST с JSON-телом в HTTP Requestстатья · ~2 мин

POST отправляет данные в теле запроса

Методы POST, PUT и PATCH передают данные в теле HTTP-запроса. В отличие от GET, где информация идёт только в URL, здесь тело содержит сам JSON-объект.

В ноде HTTP Request за включение тела отвечает переключатель Send Body. Без него запрос уйдёт пустым, даже если выбран метод POST.

Для REST-API обычно требуется Body Content Type = JSON. Тогда n8n автоматически добавляет заголовок Content-Type: application/json.

Как это работает

Путь к настройкам: Workflow → нода HTTP Request → раздел параметров над Send Body.

  • Send Body — включает блок тела запроса.
  • Body Content Type = JSON — выбираешь формат, который понимает целевой API.
  • Specify Body — два режима:
  • Using JSON — пишешь готовый JSON-объект в текстовом редакторе.
  • Using Fields Below — заполняешь таблицу Body Parameters с колонками Name и Value, n8n собирает объект сам.

В обоих режимах работают выражения {{ }}. Заголовок Content-Type n8n проставляет автоматически, его не нужно добавлять через Send Headers.

Правило одной строкой
Включи Send Body и выбери JSON

Без Send Body данные не уйдут. При Body Content Type = JSON n8n сам добавляет правильный заголовок и формирует тело.

Типичные ошибки

  • Выбрал метод POST, но оставил Send Body выключенным → сервер получает пустое тело и возвращает ошибку → включи Send Body.
  • Вставил в Using JSON строку с одинарными кавычками или лишней запятой → сервер отвечает 400 Bad Request → проверь валидность JSON.
  • Добавил заголовок Content-Type вручную через Send Headers → n8n уже проставил его автоматически, дубликат ломает запрос → удали дублирующий заголовок.
  • В Using JSON обернул объект ещё одними кавычками → сервер видит строку, а не объект → убери внешние кавычки.
  • Пытаешься передать вложенный объект через Using Fields Below → таблица плоская, вложенность не поддерживается → переключись на Using JSON.
6.8
Переключи Specify Body на Using JSON

В поле Specify Body поменяй значение с Using Fields Below на Using JSON.

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

6.9
Вставь JSON-тело запроса

В появившемся поле JSON вставь:

{
  "message": "Новый заказ #43 оплачен"
}

Текст другой, чем был в запиненном Output из шага 3 (Новый заказ #42 оплачен) — так в Telegram и в таблице будет видно что это новый запрос, не повтор запиненного.

6.10
Проверь параметры ноды

Проверь, чтобы параметры ноды соответствовали таблице ниже.

Параметры HTTP Request
ПараметрЗначение
MethodPOST
URLтвой Test URL https://n8n.school.automate-this.com/webhook-test/m0-14-notify
Send Bodyon
Body Content TypeJSON
Specify BodyUsing JSON
JSON{ "message": "Новый заказ #43 оплачен" }
Тестовый воркфлоу Notify Tester после шага 6: Manual Trigger → HTTP Request
Готовый тестовый воркфлоу после шага 6
7Протестируй end-to-end через Test URL

Оба воркфлоу собраны. Финальный тест работает попеременно в обеих вкладках: сначала в основном Notify Hub включаем приём (Listen for test event), потом в тестовом Notify Tester нажимаем Execute workflow.

После — открываем по очереди обе ноды Webhook и HTTP Request, проверяем что вернул каждый, и убеждаемся что обе ветки fan-out отработали.

7.1
Запусти основной воркфлоу

Распинь данные в триггере.

Переключись на вкладку с воркфлоу Notify Hub → нажми Execute workflow.

7.2
Нажми Execute workflow в тестовом воркфлоу

Переключись на вкладку с Notify Tester → внизу canvas нажми кнопку Execute workflow.

Manual Trigger отработает, передаст данные в HTTP Request, та отправит POST-запрос на Test URL основного воркфлоу.

📖Кнопка «Execute workflow»: ручной запуск для тестированиястатья · ~2 мин

Кнопка ручного запуска для теста

В редакторе workflow внизу canvas есть большая оранжевая кнопка «Execute workflow». Это основной инструмент тестирования: один клик — и весь workflow прогоняется от триггера до конца, прямо в редакторе. На production это никак не влияет — даже если воркфлоу опубликован (Publish), кнопка запускает отдельный тестовый прогон.

Как это работает

  1. Нажимаешь Execute workflow внизу canvas.
  1. n8n запускает workflow от триггера. Ноды по очереди подсвечиваются: серая → жёлтая (выполняется) → зелёная (готово) или красная (ошибка). Внизу каждой ноды появляется счётчик пришедших на вход элементов.
  1. Клик по любой ноде после прогона — видишь её input и output. Это и есть отладка: где данные пропали или пришли не в том виде.
Запуск с середины
Кнопка ▶ на самой ноде

У каждой ноды на canvas есть своя маленькая кнопка ▶ (появляется при наведении). Она запускает только эту ноду на данных, которые лежат в её input от предыдущего прогона. Удобно, когда правишь одну ноду и не хочешь гонять весь workflow заново.

Особый случай: workflow с Chat Trigger

Если в workflow стоит триггер Chat Trigger (встроенный в n8n чат), правила для тестирования другие — Execute workflow появляется не сразу.

  • Когда у Chat Trigger ещё нет запиненных данных — внизу canvas вместо Execute workflow стоит кнопка Open chat. Клик открывает встроенный чат-виджет n8n: ты пишешь сообщение, оно идёт в триггер, workflow выполняется от события «новое сообщение в чате». Это и есть основной путь тестирования Chat Trigger.
  • Когда данные Chat Trigger запинены (через Pin data в Output триггера) — кнопка Open chat сменяется на привычную Execute workflow. n8n больше не ждёт нового сообщения в чате, а гоняет workflow на запиненных данных. Удобно для отладки downstream-нод без необходимости каждый раз писать в чат.

Логика та же что у обычных триггеров — если есть закреплённый тестовый вход, n8n показывает Execute workflow для запуска на нём; если нет — показывает способ получить реальное событие (для Chat Trigger это Open chat, для Webhook — Test URL и т.д.).

Типичные ошибки

  • Нажал кнопку, ничего не происходит → в воркфлоу нет триггера. Добавь триггер (для ручных тестов подойдёт Manual Trigger); если триггеров несколько, запусти нужный кнопкой ▶ на самой ноде.
  • Нода красная, дальше ничего не выполнилось → клик по ноде → вкладка с ошибкой. Прогон останавливается на первой упавшей ноде.
  • На ноде «0 items» и она не выполнилась → предыдущая нода вернула пустой массив. Это не ошибка, это «нечего обрабатывать». Смотри output предыдущей ноды.
7.3
Проверь результат в тестовом воркфлоу

В тестовом Notify Tester открой ноду HTTP Request.

В Output должен появиться ответ от Webhook {"message": "Workflow was started"} со статусом 200.

Это значит запрос дошёл и вебхук успел ответить по правилу Respond = Immediately.

7.4
Проверь результат в основном воркфлоу

Переключись на вкладку с воркфлоу Notify Hub.

Открой ноду Webhook двойным кликом. В Output теперь лежит JSON принятого запроса.

Внутри объекта body есть поле message со значением Новый заказ #43 оплачен — это содержимое POST-запроса, которое прислала нода HTTP Request.

Ноды Telegram Send Message и Data table на canvas тоже загорелись зелёной обводкой.

Это значит, что fan-out отработал: обе ветки получили данные и выполнились.

7.5
Проверь Telegram и таблицу

Открой Telegram-чат с твоим ботом — там новое сообщение Новый заказ #42 оплачен.

Зайди в Data tables → открой таблицу m0-14-notifications. Внутри две строки: старая от теста через запиненный Output (Новый заказ #42 оплачен, шаг 5) и новая от настоящего POST (Новый заказ #43 оплачен, этот шаг).

Если оба факта есть — fan-out работает на живой связи, обе ветки гоняют реальные данные.

Все, воркфлоу собран. Можешь потестировать его, а потом выполнить Stretch (задачу со звездочкой)

🚀Stretch

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

Сделай так, чтобы в Data table сохранялись только уведомления, начинающиеся со слова СРОЧНО. Telegram при этом должен присылать все сообщения — и срочные, и обычные. Подумай в какое место ветки fan-out поставить условие.

Тест-кейсы

ВходОжидаем
В основном воркфлоу Notify Hub открой ноду Webhook и нажми Listen for test event. Переключись на вкладку с тестовым Notify Tester и нажми Execute workflow.В Output ноды HTTP Request лежит ответ {"message": "Workflow was started"} со статусом 200. В Output ноды Webhook основного воркфлоу — JSON принятого запроса с body.message = Сервер упал! (запиненный JSON шага 3 заменился реальными данными). В Telegram приходит сообщение от бота с текстом Сервер упал!. В таблице m0-14-notifications появляется новая строка с этим текстом и свежим received_at.
В тестовом воркфлоу поменяй текст в JSON-теле на пустую строку — {"message": ""} — и повтори связку Listen for test event → Execute workflow.Telegram присылает пустое сообщение (или ошибку API про пустой text — зависит от поведения Telegram), а в Data table попадает строка с пустым полем message. Это нормальное поведение паттерна fan-out — обе ветки отрабатывают на тех данных, что прислал отправитель, без валидации.
В тестовом воркфлоу выключи переключатель Send Body, повтори связку Listen for test event → Execute workflow.В Telegram приходит пустое сообщение (или ошибка API), в Data table попадает строка с пустым message. Поле body.message стало undefined, потому что HTTP Request не отправил тело — Webhook получил запрос без body. Главный вывод: при работе с POST нужно явно следить за Body Content Type и наличием Content-Type заголовка.
Помощь
Застрял где-то по ходу? Покажи в учебном чате скрин обоих воркфлоу (основной и тестовый) и текст ошибки из ноды — разберёмся.
Написать в чат
Собрал воркфлоу? Сдай на ревью
Это демо — задачу можно прочитать целиком. Свой n8n, сдача на ревью и разбор открываются в аккаунте. Заведи аккаунт — модуль M0 бесплатно.

Можно аналитические cookie?

Аналитические cookie ставим только с твоего согласия: они помогают понять, что работает. Откажешься — аналитика обойдётся без них. Подробности — в политике обработки персональных данных.