Было одно сообщество ВКонтакте и два независимых бота. Один старый — по подбору автозапчастей, второй — мой, под лимитированную акцию. Трафик льется с одного 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. Разберем вашу архитектуру и пофиксим баги.
ссылка на оригинал статьи https://habr.com/ru/articles/1037274/