2026 · Дизайн + інженерія
Deutsch mit Seele
CRM школи всередині Telegram — заявки, листування, розсилки й аналітика в одному Mini App

Контекст
Приватна школа німецької мови, яку веде одна викладачка. Раніше все жило в її особистих чатах: запити, тести рівня, заявки на пробне заняття, питання про ціни — розкидані по листуванню, без жодної можливості побачити, хто досі чекає на відповідь. Продукт — клієнтський бот чотирма мовами і повноекранний Telegram Mini App до нього: CRM лідів із папками, статусами й тегами, повна історія листування з відповідями від імені бота, нотатки, відкладені та регулярні розсилки, редактор усіх текстів бота й дашборд воронки. Дизайн, фронтенд, бекенд, база та передача власниці — з одних рук.
Завдання
Зробити робочу бізнес-систему для людини без технічного бекграунду, яка керує нею винятково з телефона. Кожен екран мусить жити на 320 пікселях усередині інтерфейсу самого Telegram. Власниця має змінювати будь-яке слово бота — чотирма мовами, без розробника й без деплою. Розсилка має дійти до всієї аудиторії, не впершись ані в ліміти Telegram, ані в обмеження часу serverless-функції. А сам бот має відчуватися особистим: тест рівня, що приймає відповіді текстом, голосом чи відео, підбадьорює, поки чекає, і заявки, які приходять структурованими лідами, а не розсипом повідомлень.
Реалізовано
Next.js 16 + React 19 + TypeScript на Vercel, grammY для обох ботів, Postgres на Neon з Drizzle ORM і міграціями, Zod на кожній межі, дизайн-токени Tailwind v4, TanStack Query в панелі. Приймання вебхуків ідемпотентне — Telegram ретраїть при таймауті, тому таблиця дедуплікації не дає відповісти лідові двічі. Розсилка йде через чергу Upstash QStash пачками з паузами під пропускну здатність Telegram, за знімком отримувачів на момент запуску, щоб той, хто написав посеред розсилки, не отримав випадкового повідомлення; регулярні запуски — cron-правила з чесним застереженням про перехід на зимовий час. Медіа не торкається власного сховища: файли проходять через приватний Telegram-канал, бо file_id належить тому боту, який його завантажив — те саме обмеження, через яке кружечок доходить квадратним відео, якщо не перезалити його правильним методом. Тексти бота живуть у базі за шістдесятисекундним кешем із вшитим у код запасним варіантом: правка доходить до бота протягом хвилини, а зламана база не залишає бота німим. Панель — повноекранний Mini App: перевірка підпису initData, ролі власника й адміністратора, безпечні зони, світла й темна теми з сімома акцентами, запис голосових і вкладення від імені бота.
Клієнтська частина, чотирма мовами. Пройдіться меню так, як це зробила б учениця — тексти справжні, власниця редагує їх із панелі.