Разработка бота: интеграции, базы данных, платежи и безопасность
В прошлых статьях вы выбрали нишу и ценность, затем спроектировали сценарии и определились с платформой и стеком. Теперь ваша задача — превратить сценарий в продаваемый продукт: надёжный, повторяемый во внедрении, с интеграциями, хранением данных, оплатой и базовой безопасностью.
Ключевая мысль: бот, который продаётся, почти всегда состоит из двух частей:
Канал общения (Telegram/VK/WhatsApp/веб)
Серверное ядро (логика, база данных, интеграции, платежи)Архитектура продаваемого бота
Если вы хотите продавать бота нескольким клиентам, не делайте проект “всё в одном файле”. Разделите систему на слои, чтобы менять каналы и интеграции без переписывания ядра.
!Схема показывает, что каналы и интеграции меняются, а ядро остаётся
Минимальный набор компонентов
Webhook-обработчик: принимает события платформы (сообщения, нажатия кнопок).
Сценарный движок: понимает состояние пользователя и следующий шаг.
Слой данных: хранит пользователей, заявки, статусы, настройки клиентов.
Слой интеграций: отправляет данные в CRM/таблицы/календарь.
Платежный модуль: создаёт платежи, принимает подтверждения, выдаёт доступ.
Логирование и мониторинг: чтобы находить ошибки до того, как их увидит клиент.Webhook, polling и почему для продаж чаще нужен webhook
У большинства платформ есть два режима получения событий:
Webhook: платформа сама отправляет события на ваш сервер.
Polling: ваш сервер постоянно “спрашивает”, не пришло ли что-то новое.Для продукта, который вы продаёте, webhook обычно лучше:
меньше задержки
проще масштабировать
понятнее эксплуатацияДокументация Telegram по webhook: Telegram Bot API: setWebhook
База данных: что хранить и зачем
Если бот приносит измеримую ценность (заявка, запись, оплата, статус), вам почти всегда нужна база данных. Даже если MVP начинался с таблицы, продаваемый продукт обычно упирается в надёжность, поиск, аналитику и историю.
Один из самых практичных вариантов для старта и роста — PostgreSQL: PostgreSQL
Основные сущности данных
| Сущность | Что это | Зачем нужна бизнесу | Типичные поля |
|---|---|---|---|
| Пользователь | человек в мессенджере | повторные обращения, история | platform, platform_user_id, name, phone |
| Сессия сценария | текущее состояние диалога | чтобы сценарий не “ломался” | state, context_json, updated_at |
| Заявка/лид | результат сценария | продажи, обработка менеджером | status, source, comment, contact |
| Запись/бронь | слот времени/услуга | расписание и снижение неявок | service_id, time, confirmed |
| Платёж | факт оплаты/статус | доступ, чек, возвраты | provider, amount, status, external_id |
| Клиент (tenant) | компания-покупатель вашего бота | продажа как SaaS или “внедрение” | name, settings_json, tariff |
Почему важно сразу думать про multi-tenant
Multi-tenant означает, что один и тот же код обслуживает несколько клиентов (компаний), но данные и настройки разделены.
Это критично для продаж, потому что:
вы можете продавать “тот же продукт” следующему клиенту быстрее
у каждого клиента свои токены, чаты менеджеров, интеграции и тексты
вы снижаете стоимость внедренияПрактический минимум: добавляйте tenant_id к ключевым таблицам (пользователи, заявки, платежи, настройки), даже если у вас пока первый клиент.
Состояния сценария и хранение контекста
В сценарной статье мы говорили о состояниях и переходах. В реализации это означает:
вы храните state (например, choose_service, enter_phone, confirm)
вы храните context (выбранная услуга, дата, промежуточные ответы)Частая практичная схема:
state как строка
context как JSON (например, service_id, date, time, lead_id)Важно: храните только то, что нужно для ценности и поддержки, не превращайте context в “свалку всего”.
Идемпотентность: защита от дублей
Иногда платформы или интеграции присылают событие повторно (сеть, ретраи, таймауты). Если вы на каждое событие создаёте новую заявку, клиент получит хаос.
Идемпотентность — это свойство обработки, при котором повтор одного и того же события не создаёт новый результат.
Практика:
сохраняйте event_id платформы (если есть)
делайте уникальные ограничения в базе (например, “один платеж по external_id”)
для интеграций используйте ключ идемпотентности (если провайдер поддерживает)Интеграции: как сделать так, чтобы бот реально экономил время или приносил деньги
Интеграции — это то, за что бизнес чаще всего готов платить, потому что именно они превращают “чат” в “процесс”.
Типовые интеграции продаваемых ботов:
CRM (лиды, сделки, задачи менеджеру)
Google Sheets или аналоги (быстрый учёт)
календарь/расписание (запись, бронирования)
email/SMS (уведомления, если канал недоступен)Паттерн “событие → очередь → воркер”
Если вы вызываете внешнюю CRM прямо внутри обработки сообщения, вы рискуете:
замедлить ответ пользователю
упасть из-за таймаута
потерять событие при кратком сбоеБолее надёжная схема:
Принять событие от платформы
Быстро ответить пользователю
Поставить задачу интеграции в очередь
Отдельный воркер делает запросы в CRM с ретраямиДаже если вы не внедряете полноценную очередь в MVP, вы можете имитировать её фоновой задачей, но архитектурно держать разделение “диалог” и “интеграция”.
Ретраи, лимиты и журнал ошибок
У интеграций почти всегда бывают:
лимиты запросов
временные ошибки
изменения APIПоэтому вам нужен минимум:
повтор запросов при временных ошибках
ограничение частоты
журнал интеграционных ошибок с привязкой к lead_id или payment_idЭто влияет на продажи напрямую: клиенту важнее “чтобы не терялось”, чем “чтобы было умно”.
Хранение токенов и секретов
Токены CRM, ключи платежей и секреты webhook нельзя хранить в коде.
Базовое правило:
храните секреты в переменных окружения или защищённом хранилище
доступ к прод-секретам только у тех, кто реально обслуживает систему
регулярно меняйте токены при смене подрядчиков/сотрудниковПлатежи: как встроить оплату в сценарий
Оплата — это не “кнопка”, а процесс со статусами. Если вы продаёте подписку или платный доступ, платежный модуль должен быть устойчивым к прерываниям и повторам.
Два подхода к оплате
Оплата внутри платформы: когда канал поддерживает встроенную оплату.
Внешняя страница оплаты: бот даёт ссылку, а подтверждение приходит на backend.Для Telegram есть встроенная модель платежей: Telegram Bot API: Payments
Для многих проектов проще стартовать с внешней оплаты, потому что:
меньше зависимость от конкретного канала
проще переиспользовать в вебе
легче поддерживать несколько способов оплатыСтатусы платежа, которые нужно учитывать
Минимальный жизненный цикл:
created (создали платеж)
pending (пользователь перешёл к оплате)
paid (подтверждено провайдером)
failed (ошибка/отмена)
refunded (возврат)Пользователь может “исчезнуть” на этапе pending. Поэтому сценарий должен уметь:
напомнить об оплате
безопасно повторить ссылку
проверить статус по запросу пользователя!Схема показывает, что решение об успехе делает backend по подтверждению провайдера
Главный принцип безопасности платежей
Не доверяйте сообщению “пользователь сказал, что оплатил”. Доверяйте только подтверждению от провайдера (webhook) или проверке статуса по API.
Подписка: что добавить к данным
Если вы продаёте подписку, вам нужен минимум:
дата начала и окончания доступа
тариф
признак автопродления (если есть)
привязка платежей к подпискеДаже если автосписания нет, вам важно уметь ответить клиенту на вопрос: “кто оплатил, когда и что получил”.
Безопасность: базовый уровень, без которого продукт сложно продавать
Безопасность в контексте небольшого бота — это не “паранойя”, а набор практик, которые снижают риск:
утечки данных
подмены запросов
спама и злоупотреблений
финансовых потерьХороший ориентир по типовым рискам веб-приложений: OWASP Top 10
Модель угроз: что реально может пойти не так
Начните с простого списка угроз для вашего продукта:
кто-то подделает webhook и создаст фейковые заявки
утекут токены CRM или платежей
пользователь получит доступ без оплаты
база данных будет доступна из интернета без защиты
админ-панель взломают слабым паролемЗащита webhook
Минимальные меры:
используйте HTTPS
проверяйте секрет (подпись или секретный токен), если платформа/провайдер поддерживает
ограничивайте доступ по IP, когда это возможно
валидируйте входящие данные (тип, длина, формат)Валидация ввода и защита от инъекций
Пользовательский ввод в чатах непредсказуем.
Практики:
проверяйте длину строк (например, комментарий не 50 000 символов)
проверяйте формат телефона и email
используйте параметризованные запросы к БД (не склеивайте SQL строками)Доступы и роли
Если вы делаете админку для клиента (а для продажи это часто нужно), внедрите хотя бы простые роли:
админ клиента
оператор/менеджер
только просмотрИ обязательно разделяйте доступы по tenant_id.
Логи и персональные данные
Логи нужны, чтобы поддерживать продукт, но они могут стать источником утечек.
Правила:
не логируйте токены, пароли, секреты webhook
минимизируйте хранение персональных данных
если храните телефон и имя, понимайте, кто имеет доступ и зачем> В разных странах действуют разные требования к персональным данным. Встраивайте принцип минимизации: храните только то, что нужно для ценности и поддержки.
Резервные копии и план восстановления
Для продаваемого бота бэкап — это не опция.
Минимум:
регулярные бэкапы БД
проверка, что бэкап реально восстанавливается
хранение бэкапов отдельно от основного сервераПрактичный чек-лист готовности к продаже
Перед тем как показывать демо и брать деньги за внедрение, проверьте:
сценарий хранит состояния и не ломается при “неожиданных” сообщениях
данные ключевых сущностей сохраняются и доступны (пользователь, заявка, платеж)
интеграции не блокируют ответы пользователю и имеют повтор при ошибках
платежи подтверждаются только по webhook/API провайдера
секреты не в коде и не в логах
есть базовый мониторинг ошибок и понятный журнал событий
данные клиентов разделены (если вы планируете продавать нескольким компаниям)Итог
На этом этапе вы превращаете сценарий в инженерный продукт:
база данных делает результат воспроизводимым и измеримым
интеграции превращают бота в реальную экономию времени или рост выручки
платежи дают монетизацию, но требуют дисциплины статусов и подтверждений
безопасность снижает риски и повышает доверие, без которого продажи в B2B почти невозможны