Было одно сообщество ВКонтакте и два независимых бота. Один старый — по подбору автозапчастей, второй — мой, под лимитированную акцию. Трафик льется с одного Webhook, и сразу началась полная каша.
Юзер жмет кнопку старта в моем боте, а ему в ответ летит сообщение от бота с запчастями. Или человек сидит глубоко в воронке подбора, случайно пишет триггерное слово, и мой бот выдергивает его на себя. Юзеры путались и отваливались.
Но главный косяк случился с лимитами. У моей акции было ограничение — 10 призовых мест. Я, недолго думая, воткнул проверку лимита в самое начало воркфлоу. Как только 10 мест заполнились, бот начал слать отбивку «Места заняты» ВООБЩЕ ВСЕМ. Человек просто пишет боту с запчастями спросить цену на колодки, а ему прилетает заглушка от моего акционного бота. Успело уйти около 20 таких бредовых сообщений, пока я не спалил эту дичь и не тормознул систему.
Инженерное решение
Вместо костылей собрал нормальную стейт-машину на n8n и Postgres. Логика строится на двойной фильтрации: сначала грубо отсекаем чужое регулярками на входе, затем сверяем статус юзера по базе и пускаем данные только в нужную ветку.

Логика работы
Вышибала на входе (Static Routing).Сразу после приема вебхука стоит узел IF. Если текст сообщения попадает под регулярку
^(подбор|каталог|статус|инфо)$— это триггеры чужого бота. Мы просто обрываем выполнение. Зачем дергать нашу БД, если это не наш клиент?Проверка контекста (Postgres).Если сообщение прошло первичный фильтр, делаем запрос в базу по ID юзера. Вытаскиваем его текущий
state. Бот не имеет права ничего делать, пока не поймет, на каком шаге воронки стоит юзер.Жесткая маршрутизация (Switch).

Это ядро изоляции. Ветка внутри Switch сработает ТОЛЬКО при совпадении двух факторов: статуса из базы и формата данных. Ждем от юзера телефон (
awaiting_sbp_phone)? Свитч пропустит только регулярку с цифрами. Ждем фото чека (wait_receipt)? Свитч проверит наличиеfile_url. Шаг влево, шаг вправо — данные летят в пустоту, бот молчит.Изоляция лимитов. Ту самую косячную проверку на 10 мест я выпилил из корня воркфлоу. Перенес ее строго внутрь ветки «Старт» после узла Switch. Теперь проверка лимитов запускается только тогда, когда юзер целенаправленно нажал «Начать» именно в моем боте.
Результат
Боты полностью разведены по углам и не ломают друг другу логику. Конфликтов за юзера больше нет, воронки не пересекаются. Костыль с лимитами пофикшен — акция корректно стопается только для целевого трафика, не затрагивая покупателей запчастей.
Я профессионально занимаюсь проектированием отказоустойчивых архитектур на n8n. Если ваш бот «устал» или вы ищете способ сделать интеграцию надежной — пишите мне в Telegram. Разберем вашу архитектуру и пофиксим баги.
