NextBot ↔ Chatwoot: Технический план интеграции
Версия: 1.0
Дата: 2026-02-13
Автор: CTO / System Architect
Статус: На согласовании
1. Постановка задачи
1.1 Текущая ситуация
| Компонент | Состояние |
|---|---|
| NextBot | Подключён к Telegram-боту. Обрабатывает ВСЮ логику: ИИ-агент «Александр», 10 функций (create_order, get_rates, calculate_deal и др.), база знаний, сценарии, память |
| Chatwoot | Развёрнут на сервере через Docker (self-hosted, open-source). Не подключён к потоку данных |
| Telegram Bot Token | Один токен = одно активное соединение. Невозможно подключить к двум сервисам одновременно |
| n8n | Развёрнут, используется для автоматизации воркфлоу |
1.2 Целевое состояние
Единая система, в которой:
- NextBot остаётся «мозгом» — вся ИИ-логика, функции и память работают без изменений
- Chatwoot становится «глазами и руками» — оператор видит все диалоги в реальном времени, может вмешаться
- Оператор пишет сообщение в Chatwoot → клиент получает в Telegram → NextBot знает об этом
- Ни одно сообщение не теряется — ни от клиента, ни от ИИ, ни от оператора
- Все функции NextBot продолжают работать при вмешательстве оператора
2. Архитектура решения
2.1 Ограничение Telegram Bot API
[!CAUTION] Telegram Bot Token даёт ОДНО соединение. Один токен не может быть подключён к NextBot и к Chatwoot одновременно. Если подключить токен к Chatwoot — NextBot потеряет связь с ботом и перестанет работать.
Следствие: Chatwoot НЕ подключается как Telegram-канал. Вместо этого создаётся API-канал (API Inbox), куда данные попадают программно.
2.2 Общая схема потоков данных
┌────────────────────────────────────────────┐
│ TELEGRAM BOT │
│ (Token подключён ТОЛЬКО │
│ к NextBot) │
└──────────┬────────────────────▲─────────────┘
│ │
Входящее │ │ Исходящее
сообщение │ │ (от ИИ)
│ │
┌──────────▼────────────────────┤─────────────┐
│ NEXTBOT CLOUD │
│ ┌─────────┐ ┌──────────┐ ┌────────┐ │
│ │ИИ-Агент │ │Сценарии │ │Функции │ │
│ │Александр│ │ │ │(10 шт) │ │
│ └─────────┘ └──────────┘ └────────┘ │
│ │
│ Сценарий «sync_to_chatwoot» ──────────┐ │
│ (триггер: каждое сообщение) │ │
│ │ │
│ Webhook → Chatwoot Sync │ │
└────────────────────────────────┬───────┘────┘
│
Webhook POST
(dialog_id, text, sender, type)
│
┌────────────────────────────────▼────────────┐
│ n8n (ОРКЕСТРАТОР) │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Workflow 1: NextBot → Chatwoot Sync│ │
│ │ 1. Получить Webhook из NextBot │ │
│ │ 2. Найти/создать Contact │ │
│ │ 3. Найти/создать Conversation │ │
│ │ 4. Отправить Message │ │
│ └────────────────────────────────────┘ │
│ │
│ ┌────────────────────────────────────┐ │
│ │ Workflow 2: Chatwoot → NextBot Sync│ │
│ │ 1. Получить Webhook из Chatwoot │ │
│ │ 2. Фильтр: sender.type === "user" │ │
│ │ 3. Отправить в Telegram (Bot API) │ │
│ │ 4. Webhook в NextBot (message) │ │
│ └────────────────────────────────────┘ │
└──────────────────┬─────────────────────────┘
│
Chatwoot API
│
┌──────────────────▼─────────────────────────┐
│ CHATWOOT (Docker) │
│ │
│ ┌──────────────┐ ┌────────────────────┐ │
│ │ API Inbox │ │ Operator Dashboard │ │
│ │ "NextBot TG" │ │ (Web UI) │ │
│ └──────────────┘ └────────────────────┘ │
│ │
│ Webhook → n8n (message_created) │
└────────────────────────────────────────────┘
2.3 Ключевые принципы
| Принцип | Реализация |
|---|---|
| Telegram Token = только NextBot | Chatwoot получает данные через API, НЕ через прямое подключение к TG |
| NextBot = источник истины | Вся логика ИИ, память и функций остаётся в NextBot |
| n8n = оркестратор | Маршрутизация между NextBot и Chatwoot через два воркфлоу |
| Chatwoot = визуализация + оператор | Только для просмотра и ручного вмешательства |
| Идемпотентность | Каждое сообщение имеет уникальный message_id для предотвращения дублирования |
3. Детальная спецификация компонентов
3.1 Chatwoot: Создание API Inbox
API Inbox — это «виртуальный канал» в Chatwoot, куда мы программно отправляем сообщения. Он не привязан ни к какому мессенджеру напрямую.
Шаги настройки:
- Войти в Chatwoot →
Settings→Inboxes→Add Inbox - Выбрать тип: API
- Указать название:
NextBot Telegram - Сохранить → записать
inbox_id - Настроить
callback_webhook_urlдля отправки событий в n8n
Результат: В Chatwoot появится канал, куда мы сможем отправлять сообщения и диалоги программно.
# Создание API Inbox через API (альтернатива UI)
curl -X POST "${CHATWOOT_BASE_URL}/api/v1/accounts/${ACCOUNT_ID}/inboxes" \
-H "api_access_token: ${TOKEN}" \
-H "Content-Type: application/json" \
-d '{
"name": "NextBot Telegram",
"channel": {
"type": "api",
"webhook_url": "https://<n8n-host>/webhook/chatwoot-inbound"
}
}'
[!NOTE]
callback_webhook_urlна инбоксе отличается от глобального вебхука Chatwoot. Глобальный webhook вSettings → Integrations → Webhooksлучше подходит, так как позволяет фильтровать по событиям.
3.2 Chatwoot: Настройка Webhook (исходящий)
Вебхук Chatwoot будет отправлять события о действиях оператора в n8n.
Настройка:
Settings→Integrations→Webhooks→Add New Webhook- URL:
https://<n8n-host>/webhook/chatwoot-operator-message - Подписаться на события:
message_created
Payload message_created от Chatwoot:
{
"event": "message_created",
"id": "456",
"content": "Текст сообщения оператора",
"message_type": "outgoing",
"private": false,
"sender": {
"id": "1",
"name": "Operator Serg",
"email": "serg@eastpay.com",
"type": "user"
},
"conversation": {
"id": 42,
"additional_attributes": {}
},
"account": {
"id": "1",
"name": "EastPay"
}
}
[!IMPORTANT] Ключевой фильтр:
sender.type === "user"— означает, что сообщение написал оператор (человек). Еслиsender.type === "contact"— это сообщение клиента (которое мы же и продублировали), его нужно ИГНОРИРОВАТЬ, чтобы не создать петлю.
3.3 NextBot: Сценарий «Sync to Chatwoot»
Для передачи сообщений из NextBot в Chatwoot используем встроенные Сценарии с действием «Отправить вебхук» или Custom API.
Вариант A: Сценарий с действием «Отправить вебхук»
| Параметр | Значение |
|---|---|
| Триггер | «Новое сообщение» (любое — клиент, агент, менеджер) |
| Условия | Канал = Telegram (чтобы не дублировать тестовый чат) |
| Действие | Отправить вебхук → URL n8n |
URL вебхука: https://<n8n-host>/webhook/nextbot-message-sync
Данные в вебхуке NextBot:
NextBot при действии «Отправить вебхук» передаёт стандартные поля:
dialog_id— ID диалогаmessage_text— текст сообщенияmessage_type—input(клиент) /output(агент) /operator(менеджер)- Системные данные:
{{user_name}},{{user_phone}},{{user_id}}
Вариант B: Два отдельных сценария (рекомендуемый)
Более точный контроль — создаём два сценария:
Сценарий 1: «CW Sync — Входящее от клиента»
| Параметр | Значение |
|---|---|
| Триггер | Новое сообщение клиента |
| Условие | Канал = Telegram |
| Действие 1 | Отправить вебхук → n8n |
Payload вебхука:
{
"event": "client_message",
"dialog_id": "{{dialog_id}}",
"text": "{{message_text}}",
"user_name": "{{user_name}}",
"user_phone": "{{user_phone}}",
"user_id": "{{user_external_id}}",
"timestamp": "{{current_datetime}}"
}
Сценарий 2: «CW Sync — Исходящее от агента»
| Параметр | Значение |
|---|---|
| Триггер | Новое сообщение агента |
| Условие | Канал = Telegram |
| Действие 1 | Отправить вебхук → n8n |
Payload вебхука:
{
"event": "agent_message",
"dialog_id": "{{dialog_id}}",
"text": "{{message_text}}",
"timestamp": "{{current_datetime}}"
}
[!TIP] Два отдельных сценария позволяют точно маркировать тип сообщения (
incoming/outgoing) при создании в Chatwoot и избежать ошибок маппинга.
3.4 n8n: Workflow 1 — NextBot → Chatwoot Sync
Воркфлоу принимает вебхук от NextBot и синхронизирует сообщение в Chatwoot.
Пошаговая логика нод:
[Webhook Trigger]
│
▼
[Switch: event type]
├── "client_message" → incoming flow
└── "agent_message" → outgoing flow
│
▼
[HTTP Request: Поиск контакта в Chatwoot]
GET /api/v1/accounts/{id}/contacts/search?q={{user_id}}
│
├── Контакт найден → contact_id
└── Контакт НЕ найден
│
▼
[HTTP Request: Создать контакт]
POST /api/v1/accounts/{id}/contacts
Body: {
"inbox_id": API_INBOX_ID,
"name": "{{user_name}}",
"phone_number": "{{user_phone}}",
"identifier": "tg_{{user_id}}"
}
→ contact_id
│
▼
[HTTP Request: Поиск существующей Conversation]
GET /api/v1/accounts/{id}/contacts/{{contact_id}}/conversations
│
├── Открытая conversation найдена → conversation_id
└── НЕ найдена
│
▼
[HTTP Request: Создать Conversation]
POST /api/v1/accounts/{id}/conversations
Body: {
"inbox_id": API_INBOX_ID,
"contact_id": {{contact_id}},
"status": "open"
}
→ conversation_id
│
▼
[HTTP Request: Отправить сообщение]
POST /api/v1/accounts/{id}/conversations/{{conversation_id}}/messages
Body: {
"content": "{{text}}",
"message_type": "incoming" / "outgoing",
"private": false
}
Маппинг типов сообщений
| NextBot Event | Chatwoot message_type |
Описание |
|---|---|---|
client_message |
incoming |
Сообщение от клиента |
agent_message |
outgoing |
Ответ ИИ-агента |
Дополнительно: Private Notes для функций
Можно добавить третий сценарий в NextBot с триггером «Выполнение функции», который будет отправлять в Chatwoot private note с информацией о вызванной функции:
{
"content": "🤖 Функция: create_order\nПараметры: from=USD, to=CNY, amount=5000\nРезультат: Order #EP-2456 создан",
"message_type": "outgoing",
"private": true
}
Это позволит оператору видеть, какие действия ИИ совершал «за кулисами».
3.5 n8n: Workflow 2 — Chatwoot → NextBot + Telegram Sync
Воркфлоу обрабатывает сообщения оператора из Chatwoot и доставляет их клиенту + информирует NextBot.
Пошаговая логика нод:
[Webhook Trigger: Chatwoot message_created]
│
▼
[IF: sender.type === "user" AND private === false]
│
├── FALSE → STOP (это incoming от клиента или private note — игнорируем)
│
└── TRUE (сообщение оператора для клиента)
│
▼
[Get Mapping: conversation_id → telegram_chat_id]
(из хранилища n8n или из custom_attributes контакта Chatwoot)
│
▼
[HTTP Request: Отправка в Telegram]
POST https://api.telegram.org/bot<TOKEN>/sendMessage
Body: {
"chat_id": "{{telegram_chat_id}}",
"text": "{{content}}"
}
│
▼
[HTTP Request: Webhook в NextBot]
POST https://app.nextbot.ru/api/webhooks/v1/{agent_hash}/{url_token}
Body: {
"dialog_id": {{nextbot_dialog_id}},
"text": "{{content}}",
"message_type": "output"
}
[!WARNING] Предотвращение петли (feedback loop): Когда оператор пишет в Chatwoot → n8n отправляет в Telegram и NextBot → NextBot получает сообщение → Сценарий «CW Sync» пытается снова отправить в Chatwoot → ПЕТЛЯ.
Решение: В сценарии NextBot «CW Sync — Исходящее от агента» добавить условие: НЕ срабатывать, если
message_type === "output"(сообщение оператора, вброшенное через webhok). Альтернативно, в n8n при отправке в NextBot использоватьmessage_type: "notification", который NextBot сохранит в контексте, но НЕ отправит клиенту и НЕ вызовет сценарий нового сообщения.
3.6 Маппинг IDs: NextBot dialog_id ↔ Chatwoot conversation_id ↔ Telegram chat_id
Центральная проблема интеграции — маппинг идентификаторов между тремя системами.
Стратегия хранения
| Вариант | Где хранить | Плюсы | Минусы |
|---|---|---|---|
A. Chatwoot custom_attributes |
В контакте Chatwoot | Данные рядом с контактом | Нет быстрого reverse-lookup |
| B. n8n Static Data | В данных воркфлоу | Просто | Не персистентный |
| C. Supabase таблица | PostgreSQL EastPay | Надёжно, быстро, двусторонний lookup | Нужна миграция |
| D. Метаданные NextBot | В dialog metadata | Данные рядом с диалогом | Нельзя query извне |
Рекомендация: Вариант C (Supabase) — создать таблицу маппинга:
CREATE TABLE public.channel_mapping (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
telegram_chat_id BIGINT NOT NULL UNIQUE,
nextbot_dialog_id BIGINT NOT NULL UNIQUE,
chatwoot_contact_id INTEGER,
chatwoot_conversation_id INTEGER,
user_name TEXT,
user_phone TEXT,
created_at TIMESTAMPTZ DEFAULT now(),
updated_at TIMESTAMPTZ DEFAULT now()
);
-- Индексы для быстрого поиска в любую сторону
CREATE INDEX idx_mapping_tg_chat ON public.channel_mapping(telegram_chat_id);
CREATE INDEX idx_mapping_nb_dialog ON public.channel_mapping(nextbot_dialog_id);
CREATE INDEX idx_mapping_cw_conv ON public.channel_mapping(chatwoot_conversation_id);
Как заполняется:
- Первое сообщение от нового клиента → NextBot Webhook в n8n содержит
dialog_idиuser_id(telegram_chat_id) - n8n создаёт контакт и conversation в Chatwoot → получает
contact_idиconversation_id - n8n записывает все 4 ID в таблицу
channel_mapping - При последующих сообщениях — n8n ищет маппинг по
dialog_id(NextBot→Chatwoot) илиconversation_id(Chatwoot→NextBot)
[!NOTE] Альтернативно, если Supabase кажется излишним для этой задачи, можно использовать Chatwoot
identifierполе контакта (tg_{{user_id}}) для поиска контакта и через него получать conversation. Аnextbot_dialog_idхранить вcustom_attributesконтакта. Это упрощает архитектуру, но делает reverse-lookup (Chatwoot→NextBot) сложнее.
4. Управление состоянием оператора (Handoff)
4.1 Когда оператор вмешивается
| Событие | Действие NextBot | Действие Chatwoot |
|---|---|---|
| Оператор отправил сообщение в Chatwoot | n8n шлёт webhook в NextBot → ИИ «засыпает» автоматически (контроль вмешательства) | Conversation.status остаётся open |
| Оператор нажал «Resolve» в Chatwoot | n8n шлёт webhook «conversation_status_changed» → NextBot: снять паузу | Conversation.status = resolved |
| Оператор молчит 30 мин | NextBot автоматически «просыпается» (авто-возобновление) | — |
4.2 Настройка NextBot: Контроль вмешательства
В настройках агента «Александр» необходимо сконфигурировать:
| Параметр | Значение | Обоснование |
|---|---|---|
| Автоматическое засыпание | ✅ Включено | ИИ замолкает, когда оператор пишет |
| Игнор первого сообщения менеджера | ❌ Отключено | Любое сообщение оператора должно «усыплять» бота |
| Авто-возобновление | ✅ 30 минут | Если оператор бросил диалог, ИИ подхватит |
| Исключения | Системные уведомления (n8n bot ID) | Чтобы вебхуки от n8n не «усыпляли» бота |
[!IMPORTANT] Критический момент: Когда n8n отправляет сообщение оператора в NextBot через webhook, нужно использовать
message_type: "output". Это сообщение NextBot засчитает как «сообщение менеджера», и ИИ автоматически «заснёт». Это именно то поведение, которое нам нужно — оператор взял диалог на себя.
4.3 Возврат к ИИ
Три сценария возврата:
- Автоматический — таймер 30 мин (настроено в NextBot)
- Ручной из Chatwoot — оператор нажимает «Resolve» → Chatwoot webhook
conversation_status_changed→ n8n → NextBot API снять паузу - Ручной из NextBot — в интерфейсе диалогов NextBot нажать «Снять паузу»
5. Предотвращение петель и дублирования
5.1 Карта потенциальных петель
| Петля | Описание | Решение |
|---|---|---|
| Echo Loop | Оператор пишет в CW → n8n → TG → NextBot → сценарий → n8n → CW → CW webhook → n8n → ... | Использовать message_type: "notification" в NextBot webhook (не триггерит сценарии) |
| Self-echo | n8n создаёт сообщение в CW → CW webhook message_created → n8n пытается обработать |
Фильтр в n8n: игнорировать sender.type !== "user" |
| Duplicate sync | Два сценария NextBot срабатывают на одно сообщение | Уникальный message_id в n8n, проверка идемпотентности |
5.2 Реализация защиты
В n8n Workflow 2 (Chatwoot → NextBot):
// Нода "IF" — фильтр петли
const senderType = $json.sender?.type;
const isPrivate = $json.private;
const messageType = $json.message_type; // 0=incoming, 1=outgoing
// Обрабатываем ТОЛЬКО если:
// 1. Отправитель — оператор (user), НЕ контакт
// 2. Сообщение НЕ private (не internal note)
// 3. message_type — outgoing (1)
return senderType === "user" && !isPrivate && messageType === 1;
В NextBot (message_type для webhook):
При отправке сообщения оператора в NextBot через webhook, использовать:
message_type: "output"— если нужно, чтобы ИИ «заснул» (оператор взял диалог)message_type: "notification"— если нужно просто добавить контекст (системное сообщение)
message_type |
Видно клиенту | Триггерит сценарии | ИИ «засыпает» | Попадает в контекст |
|---|---|---|---|---|
input |
❌ | ✅ | ❌ | ✅ |
forwarded_output |
✅ | ✅ | ❌ | ✅ |
output |
❌ (только контекст) | ✅ | ✅ | ✅ |
notification |
❌ | ❌ | ❌ | ✅ |
Рекомендация: Использовать notification для вброса сообщения оператора в контекст NextBot, чтобы ИИ знал, что именно написал оператор, но при этом не вызывались сценарии и не создавалась петля. А засыпание ИИ обеспечить отдельно через output message_type.
Оптимальная комбинация:
- n8n → Telegram API: отправить текст оператора клиенту (обязательно, т.к. API Inbox Chatwoot не подключён к TG)
- n8n → NextBot Webhook:
message_type: "output"— ИИ заснёт и увидит текст в контексте
6. Порядок реализации (Step-by-step)
Фаза 1: Подготовка Chatwoot (30 мин)
| # | Действие | Результат |
|---|---|---|
| 1.1 | Создать API Inbox «NextBot Telegram» в Chatwoot UI | inbox_id |
| 1.2 | Записать inbox_id, проверить что api_access_token работает |
Подтверждение доступа |
| 1.3 | Настроить Webhook в Chatwoot: URL → n8n, событие → message_created |
Webhook активен |
Фаза 2: Создание таблицы маппинга в Supabase (15 мин)
| # | Действие | Результат |
|---|---|---|
| 2.1 | Выполнить SQL-миграцию channel_mapping |
Таблица создана |
| 2.2 | Добавить RLS-политики (или отключить для сервисного ключа) | Безопасность |
Фаза 3: n8n Workflow 1 — NextBot → Chatwoot (2-3 часа)
| # | Действие | Результат |
|---|---|---|
| 3.1 | Создать Webhook Trigger ноду | Эндпоинт для NextBot |
| 3.2 | Нода Switch по event типу |
Маршрутизация |
| 3.3 | HTTP Request: поиск контакта в Chatwoot по identifier |
contact_id или null |
| 3.4 | IF: контакт не найден → HTTP Request: создать контакт | contact_id |
| 3.5 | HTTP Request: получить conversations контакта | conversation_id или null |
| 3.6 | IF: conversation не найдена → HTTP Request: создать conversation | conversation_id |
| 3.7 | HTTP Request: создать сообщение | Message created |
| 3.8 | HTTP Request: записать/обновить маппинг в Supabase | Mapping saved |
| 3.9 | Тестирование: отправить тестовое сообщение в TG-бота | Сообщение появляется в Chatwoot |
Фаза 4: Настройка NextBot сценариев (30 мин)
| # | Действие | Результат |
|---|---|---|
| 4.1 | Создать сценарий «CW Sync — Входящее от клиента» | Webhook на n8n при каждом сообщении клиента |
| 4.2 | Создать сценарий «CW Sync — Исходящее от агента» | Webhook на n8n при каждом ответе ИИ |
| 4.3 | (Опционально) Сценарий «CW Sync — Функция выполнена» | Private notes в Chatwoot |
| 4.4 | Проверить фильтры: только Telegram, не тестовый чат | Нет лишних триггеров |
Фаза 5: Настройка NextBot — Контроль оператора (15 мин)
| # | Действие | Результат |
|---|---|---|
| 5.1 | Включить «Автоматическое засыпание» при сообщении менеджера | ИИ засыпает при вмешательстве |
| 5.2 | Установить авто-возобновление: 30 минут | ИИ просыпается автоматически |
| 5.3 | Добавить исключения для системных контактов | n8n не «усыпляет» бота |
Фаза 6: n8n Workflow 2 — Chatwoot → NextBot + TG (2-3 часа)
| # | Действие | Результат |
|---|---|---|
| 6.1 | Создать Webhook Trigger для Chatwoot webhook | Эндпоинт для Chatwoot |
| 6.2 | IF: фильтр sender.type === "user" && !private |
Только сообщения оператора |
| 6.3 | HTTP Request: получить маппинг из Supabase по conversation_id |
telegram_chat_id, nextbot_dialog_id |
| 6.4 | HTTP Request: отправить в Telegram Bot API | Клиент получает сообщение |
| 6.5 | HTTP Request: webhook в NextBot (message_type: "output") |
ИИ засыпает, контекст обновлён |
| 6.6 | Тестирование: оператор пишет в Chatwoot | Клиент получает в TG, ИИ молчит |
Фаза 7: Тестирование и отладка (1-2 часа)
| # | Тест | Ожидаемый результат |
|---|---|---|
| 7.1 | Клиент пишет в TG-бот | Сообщение появляется в Chatwoot как incoming |
| 7.2 | ИИ отвечает | Ответ появляется в Chatwoot как outgoing |
| 7.3 | ИИ вызывает функцию create_order |
(Опц.) Private note в Chatwoot |
| 7.4 | Оператор пишет в Chatwoot | Клиент получает в TG, ИИ «засыпает» |
| 7.5 | Оператор молчит 30 мин | ИИ «просыпается» |
| 7.6 | Оператор нажимает «Resolve» | Conversation закрыта, ИИ можно разбудить |
| 7.7 | Новый клиент пишет впервые | Контакт + Conversation созданы автоматически |
| 7.8 | Тот же клиент пишет повторно | Сообщение в существующую Conversation |
7. Требуемые данные и доступы
| Параметр | Откуда получить | Пример |
|---|---|---|
CHATWOOT_BASE_URL |
URL Docker-инстанса | https://chat.eastpay.com |
CHATWOOT_ACCOUNT_ID |
URL в браузере: /app/accounts/{ID}/... |
1 |
CHATWOOT_API_TOKEN |
Chatwoot → Profile → Access Token | abc123... |
CHATWOOT_INBOX_ID |
Создать API Inbox (п. 3.1) | 5 |
NEXTBOT_AGENT_HASH |
NextBot → Настройки → Webhooks | a1b2c3d4... |
NEXTBOT_URL_TOKEN |
NextBot → Настройки → Webhooks | e5f6g7h8... |
TELEGRAM_BOT_TOKEN |
@BotFather | 123456:ABC-DEF... |
SUPABASE_URL |
Проект Supabase | https://cvzsgjksswowqgfxvrsb.supabase.co |
SUPABASE_SERVICE_KEY |
Supabase → Settings → API → service_role |
eyJ... |
N8N_WEBHOOK_BASE |
URL n8n-инстанса | https://n8n.eastpay.com |
8. Риски и митигация
| Риск | Вероятность | Импакт | Митигация |
|---|---|---|---|
| Петля сообщений | Высокая (если не фильтровать) | Критический | Строгая фильтрация по sender.type + message_type в NextBot webhook |
| Задержка синхронизации | Средняя | Низкий | Вебхуки работают near-realtime (<1 сек); допустимая задержка |
| Потеря маппинга | Низкая | Средний | Supabase — надёжное хранилище; бэкапы |
| NextBot не передаёт все поля в webhook | Средняя | Средний | Тестировать payload детально; использовать ?debug=true |
| Chatwoot API rate limits | Низкая | Низкий | Self-hosted → нет лимитов (контролируем сервером) |
| n8n downtime | Низкая | Средний | Мониторинг n8n; retry-логика в workflow |
9. Расширения на будущее
| Функция | Описание | Приоритет |
|---|---|---|
| CSAT-опросы | После Resolve отправлять оценку качества | P2 |
| Labels/Tags | Автоматическая маркировка conversations по типу обращения | P2 |
| Dashboard App | Custom dashboard в Chatwoot для отображения данных EastPay | P3 |
| WhatsApp канал | Добавить второй канал (WhatsApp → NextBot → Chatwoot) | P1 |
| Автоматические Assign | Назначение оператора на основе нагрузки | P3 |
| Аналитика | Выгрузка метрик из Chatwoot для анализа SLA | P2 |
10. Résumé архитектуры
Клиент (Telegram)
│
▼
NextBot Cloud ──── [ИИ «Александр», функции, KB, сценарии]
│ │
│ Сценарии «CW Sync»
│ (webhook на каждое сообщение)
│ │
│ ▼
│ n8n Workflow 1
│ (NextBot → Chatwoot)
│ │
│ ▼
│ Chatwoot (API Inbox)
│ │
│ Оператор видит всё,
│ может ответить
│ │
│ Chatwoot Webhook
│ (message_created)
│ │
│ ▼
│ n8n Workflow 2
│ (Chatwoot → TG + NextBot)
│ │
├───────────────────────┤
│ │
Telegram Bot API NextBot Webhook
(sendMessage) (message_type: "output")
│ │
▼ ▼
Клиент получает ИИ «засыпает»,
сообщение оператора контекст обновлён
Итого: Система работает как единое целое. NextBot — мозг. Chatwoot — интерфейс оператора. n8n — нервная система, передающая сигналы между компонентами. Telegram Bot Token остаётся привязан только к NextBot, а Chatwoot получает данные через API.