Всем привет, это снова Никита. 1-2 месяца назад я опубликовал свой первый пост-знакомство, где рассказал, что в 19 лет решил не идти в найм, взял академ и строю свои продукты с помощью ИИ. Реакция была... бурной. Мне предрекли судьбу «старухи у разбитого корыта» и справедливо заметили, что «визионер» без хард-скиллов - это просто мечтатель.
Я прочитал каждый комментарий. Спасибо вам за критику, она была нужна. Но, как я и обещал в комментариях, лучшим ответом на скепсис будет не спор, а готовый продукт. Я не слился. Я продолжаю работать.
Сегодня я хочу убрать лирику и показать «мясо». Я расскажу, как именно устроен мой бот SkillDay, который я собрал на no-code платформе n8n, используя Supabase в качестве бэкенда и OpenAI как генератор контента.
Архитектура: Как это работает под капотом.
Мой стек выглядит так:
Логика и оркестрация: n8n (railway hosted).
База данных: Supabase (PostgreSQL).
AI-мозги: OpenAI (GPT-4o-mini для скорости и цены).
Платежи: ЮKassa (API).
Генерация документов: Gotenberg (для дипломов).

Почему n8n? Потому что я не знаю JavaScript на уровне сеньора, но понимаю алгоритмы и логику построения систем. N8n позволяет мне визуализировать потоки данных, а код для кастомных JS-нод мне помогает писать и оптимизировать тот самый ChatGPT, за который меня ругали.
Что умеет бот и как это реализовано
Динамическая генерация курсов
Пользователь пишет любую тему (например, «Python для анализа данных» или «Психология переговоров»). Бот не берет готовый курс, он создает его на лету.
Как это работает в n8n:
- Сначала ИИ-агент (ai_generate_outline) создает структуру курса (модули и уроки), адаптируясь под выбранный пользователем режим (Фундамент, Практика или Хардкор).
- Полученный JSON валидируется и пишется в таблицы topic_modules и module_lessons в Supabase.
- Когда пользователь запрашивает урок, срабатывает цепочка генерации карточки (ai_generate_card), которая выдает теорию и практическое задание без «воды».Система проверки знаний и открытые вопросы
Я не хотел делать банальные тесты «выбери вариант А». Я внедрил проверку открытых ответов.
Реализация:
- Пользователь получает вопрос от AI.
- Пишет развернутый ответ текстом.
- Специальный агент ai_evaluate_answer сравнивает ответ студента с контекстом урока.
- Если ответ верный - зачет. Если нет - AI дает наводящую подсказку (не прямой ответ!) и просит попробовать снова.
- Вся история попыток и оценок летит в таблицу user_state, чтобы сохранять контекст диалога.SRS (Spaced Repetition System) - Интервальные повторения
Чтобы знания не вылетали из головы, я реализовал механику, похожую на Anki.
Логика:
- Если пользователь проваливает тест по старой карточке, система понижает его «уровень памяти» и уменьшает интервал до следующего повторения.
- Если сдает успешно - интервал растет (1, 3, 7, 14, 30 дней).
- Каждое утро cron-триггер в n8n дергает RPC-функцию в Supabase, находит пользователей, у которых подошел срок повторения, и шлет им уведомление.Биллинг и подписки
Это была самая сложная часть. Я не просто прикрутил «донаты», а сделал полноценный SaaS-биллинг.
Реализация через ЮKassa:
- Есть тарифы: Trial, Basic, Extended, Mega и Lifetime.
- При оплате создается запись в таблице payments и обновляется subscriptions.
- Реализованы рекуррентные платежи (автосписание). Каждый день cron проверяет истекающие подписки. Если автопродление включено - n8n инициирует платеж через сохраненный токен карты. Если денег нет - шлет уведомление и отключает продление.
- Вся логика скидок (например, скидка за прохождение курсов) считается динамически в JS-нодах перед формированием ссылки на оплату.Геймификация и PDF-дипломы
Когда пользователь завершает тему, бот генерирует красивый PDF-сертификат.
Как это сделано:
Node prep_user_diploma_html собирает HTML-шаблон, подставляя имя, тему, уровень и дату.
Этот HTML отправляется в контейнер Gotenberg (через HTTP Request), который возвращает бинарный PDF-файл.
Файл переименовывается и отправляется пользователю в чат.
Админка внутри Telegram
Я не стал пилить отдельный веб-интерфейс для администрирования. У меня (как у админа) есть свое скрытое меню прямо в боте.
Через него я вижу:
- MRR и Churn rate (отток).
- Конверсию из триала в оплату.
- Количество активных пользователей.
- Могу управлять глобальными скидками и делать рассылки по сегментам.
- Все метрики считаются через тяжелые SQL-запросы, завернутые в RPC-функции Supabase (например, compute_admin_metrics), чтобы не нагружать n8n вычислениями.
Ответ на критику: «Код пишет AI, ты ничего не понимаешь»
Да, большую часть JS-кода внутри нод (парсинг JSON, работа с датами, форматирование строк) написал сначала GPT-5, потом в процессе Gemini 3 Pro. Но архитектуру, связи между таблицами, логику переходов (Switch-ноды), обработку ошибок и защиту от абуза (например, проверку на повторный триал) проектировал я.
AI - это мой экскаватор. Я могу копать лопатой (учить синтаксис годами), а могу научиться управлять экскаватором и вырыть котлован за неделю. Я понимаю, что происходит в каждой ноде. Если бот падает, я иду в логи n8n, вижу ошибку и правлю её - иногда сам, иногда с помощью того же AI.
Что дальше?
Сейчас бот работает, принимает оплату и обучает. Есть, скорее всего баги, также есть места, которые можно оптимизировать (например, уменьшить количество запросов к БД, внедрив кэширование).
Если вам интересно поковырять такого бота или есть идеи, как улучшить архитектуру - буду рад пообщаться в комментариях.
И да, я все еще считаю, что лучший способ научиться плавать - это прыгнуть в воду, а не читать учебник по гидродинамике на суше.
P.S. Если интересно потыкать MVP и посмотреть, как работает логика, которую я описал выше — бот тут: @skilldaybot. Буду рад фидбеку по багам.