Telegram-бот для автодилера — свободный запрос клиента превращается в квалифицированный лид в AmoCRM
Гибридный бот на aiogram — AI-классификация свободного текста и пошаговый FSM-опрос по 5 услугам, с отказоустойчивой доставкой лида в AmoCRM (дедуп, retry-очередь, автообновление токена).
Задача
Клиент автодилера пишет в Telegram в любое время и ждёт мгновенной реакции — а менеджеры отвечают не круглосуточно. При ручной обработке теряется часть обращений и контекст: пока до заявки дойдут руки, клиент успевает уйти к конкуренту, а для конверсии критичны именно первые минуты. Нужен круглосуточный приём, который сам собирает структурированную заявку и передаёт менеджеру готовый лид с полным контекстом, а не «человек написал, перезвоните».
Типичный заказчик: автосалоны, площадки trade-in и автоподбора, сервисы технической и юридической проверки авто — везде, где вход идёт через мессенджер, а на выходе нужен чистый лид в CRM.
Решение
Бот совмещает два входа в один поток: строгий пошаговый опрос и свободный текст, разобранный ИИ. Оба сходятся в единой процедуре доставки лида в AmoCRM.
Пошаговый сбор заявки (FSM). Главное меню из шести кнопок ведёт в пять веток услуг — продажа, покупка, подбор, проверка авто, юридическая помощь. Все ветки работают на одном параметризуемом движке диалога (base_dialog со StepConfig), а не на пяти копиях кода: шаг описывается конфигом (текст, тип ввода, клавиатура, обязательность), поэтому ветки единообразны и дешёвы в поддержке. Внутри — навигация «назад / в начало / пропустить», валидация телефона (phonenumbers, международный формат) с кнопкой «Поделиться контактом», загрузка фото, и экран подтверждения с пошаговым редактированием отдельных полей перед отправкой.
Свободный текст → ИИ-маршрутизация. Если клиент вместо меню просто пишет «хочу продать камри 2019 недорого», сообщение уходит в OpenAI: модель классифицирует намерение (intent) и извлекает сущности (марка, модель, год, бюджет) строго в JSON. Ключевое решение — smart fallback между моделями: основной запрос идёт в дешёвую gpt-4o-mini, и только если она возвращает низкую уверенность (confidence < 0.65), невалидный JSON или пустой intent — автоматически делается один повторный запрос в gpt-4o, результат которого финальный. Так масса типовых запросов обрабатывается дёшево, а точность добирается только на сомнительных. Распознанное намерение бот предлагает подтвердить переходом в нужную ветку, а извлечённые сущности предзаполняют форму — клиент не вводит повторно то, что уже написал словами.
Отказоустойчивая доставка в CRM. Собранная заявка уходит через lead_processor в AmoCRM (REST v4): поиск контакта по телефону (дедуп — повторное обращение обновляет существующий контакт, а не плодит дубль), создание/обновление контакта → сделка → примечание со всеми ответами. Авторизация — OAuth с автообновлением токена (одноразовый refresh обновляется при 401 или близком истечении), поэтому бот работает 24/7 без ручного вмешательства. Ошибки CRM обрабатываются по типу: 401 → обновить токен и повторить, 429/5xx/timeout → retry с экспоненциальным backoff. Если попытки исчерпаны, лид не теряется: он падает в очередь failed_leads в PostgreSQL, откуда фоновый воркер повторяет отправку каждые 5 минут, а администратор получает алерт в Telegram.
Инфраструктура. Redis хранит состояние диалога (FSM) с TTL 30 минут — клиент не «застревает» в опросе. PostgreSQL держит пользователей, лиды, токены AmoCRM и лог AI-запросов (модель, confidence, факт fallback, latency — для аналитики и отладки). Всё поднимается одним docker compose (бот + PostgreSQL + Redis, автоперезапуск, health-check на :8080/health), есть mock-режим AmoCRM для разработки без реального аккаунта, throttling-middleware против спама и тесты (unit, integration на моках, e2e-прогон веток) с чек-листом edge-кейсов.



Стек
Python 3.12 · aiogram 3.x (long polling) · PostgreSQL 16 · Redis 7 (FSM, TTL 30 мин) · OpenAI gpt-4o-mini + gpt-4o (smart fallback) · AmoCRM REST API v4 · Docker Compose · aiohttp · SQLAlchemy + Alembic · phonenumbers
Результат
Показатели, заложенные в ТЗ как целевые для приёмки:
- Первый ответ клиенту — < 5 секунд, 24/7.
- Готовый лид в AmoCRM — за ≤ 3 секунды после завершения диалога, со всеми полями.
- Конверсия «старт → завершённый опрос» — ≥ 60%.
- Дубли контактов — 0% (дедуп по телефону).
- Доступность — 99.5%+ с автоперезапуском; при сбое CRM лид не теряется (очередь + retry).
Отраслевой ориентир для такого сценария в автобизнесе: круглосуточный приём с ИИ-маршрутизацией снимает с менеджеров до 70–80% типовых первичных обращений и убирает потерю ночных и «пиковых» заявок — менеджер подключается уже к структурированному лиду с маркой, бюджетом и контактом, а не к пустому «здравствуйте».