Роботи / Агенти і боти

Бот запису для соло-майстрів: клієнт пише вночі, бот уже записав його на завтра

Що було

Соло-майстер працює руками і не тримає телефон. Клієнти пишуть увечері й уночі одне й те саме: скільки коштує, чи є субота, де ви. Записи живуть у блокноті або в голові, звідси двоє клієнтів на одну годину і забуті візити. Адміністратора одному майстру наймати невигідно, а найближчий конкурент коштує $79-219 на місяць.

Що зробили

Зробили сервіс, де майстер сам створює бота в @BotFather за інструкцією з картинками і вставляє токен. Один процес на сервері тримає всіх ботів майстрів одразу. Клієнт обирає послугу, день і годину кнопками, бачить лише вільний час, отримує нагадування за день. У майстра кабінет: записи, послуги, розсилка клієнтам, реферальне посилання, оплата карткою або криптою. Шість мов. Через добу прибрали AI-відповіді на вільний текст: модель могла назвати ціну, якої у майстра нема.

Що отримав клієнт

Бот працює: на момент перевірки служба відпрацювала 2 місяці 20 днів без жодного перезапуску. 49 перевірок у тестах, кожна спершу падала на старому коді. У базі 5 майстрів, один з них тестовий, 9 записів. Оплат нуль за всю історію, три майстри користуються після закінчення пробного місяця безкоштовно. Чому майстри не ведуть запис через бота, ми не зʼясовували.

ЗамовникВласний продукт за підпискою для соло-майстрів: барбери, манікюр, косметологи, фотографи, репетитори
Моя рольІдея, продукт, код, тексти шістьма мовами, картинки-інструкція, лендінг, сервер
СтатусПрацює, платних майстрів поки нуль
Результат2 міс 20 дн служба працювала без жодного перезапуску на момент перевірки · Відкрити
Відхилено: перша версія, де на вільні питання клієнтів відповідала модель. Вона могла назвати ціну або годину, яких у майстра нема. Реконструкція, не скриншот
Відхилено: перша версія, де на вільні питання клієнтів відповідала модель. Вона могла назвати ціну або годину, яких у майстра нема. Реконструкція, не скриншот
Прийнято: запис тільки кнопками за реальним розкладом: послуга, день, година, підтвердження. Викликів моделі в коді нема
Прийнято: запис тільки кнопками за реальним розкладом: послуга, день, година, підтвердження. Викликів моделі в коді нема

Завдання

Соло-майстер стриже або робить манікюр і не може відповісти клієнту, який пише о 23:00 «чи є час завтра». Відповідь буде вранці, коли клієнт уже записався в іншому місці. Записи живуть у блокноті або в голові, звідси двоє клієнтів на одну годину і забуті візити. Наймати адміністратора одному майстру невигідно.

Це власний продукт, а не замовлення. Хотіли перевірити, чи куплять соло-майстри в Україні простий інструмент запису за $10 на місяць. За нашим розбором ринку AI Beauty Bot коштує $79-219 на місяць, Starta.one від 6 євро, але складний, beautyTG на GitHub безкоштовний, але без розробника його не поставити. Соло-майстер у Telegram українською і російською за $10 виглядав майже вільним місцем.

Навіщо і яка ідея

Ідея: майстер не чекає на нас. Він сам створює бота в @BotFather за покроковою інструкцією з картинками, вставляє токен у головний бот, і сервер підхоплює його бота одразу, без перезапуску. Один процес на сервері тримає необмежену кількість чужих ботів. Клієнт у боті майстра нічого не пише вільним текстом: послуга, день, година, усе кнопками, і видно лише вільний час.

Головне рішення, яке переглянули: у першій версії на вільні питання клієнтів відповідав Claude Haiku 4.5. Через добу ми прибрали його зовсім. Бот міг сказати про ціни і послуги майстра те, чого нема насправді, а для запису точність важливіша за «розумну» розмову. Прибрали весь шлях, не тільки кнопку: якщо лишити обробник вільного тексту, ризик лишається. Ціна: спочатку $20, потім я знизив до $10 як стартову для України, для всіх, включно з уже підключеними, перший місяць безкоштовно. База: SQLite замість PostgreSQL, на старті простіше, за нашою оцінкою вистачить приблизно до 500 майстрів.

Хід роботи

Етап Що відбувалося
День 1, вечір Концепція, розбір конкурентів, план MVP на 1-2 тижні
День 2 26 комітів за день: реєстрація, послуги, календар, реферальна програма, оплата CryptoCloud і LiqPay, захист пробного місяця, три критичні баги багатоботової схеми. Увечері прибрали AI-відповіді на вільний текст
День 3 MVP на сервері. Ручна видача підписки командою /activate, щоб продавати, не чекаючи підключення LiqPay
День 5 Кабінет майстра шістьма мовами, картинки-інструкція BotFather шістьма мовами, пароль сервера прибрано з deploy.py
День 6 Вихідні дні, розсилка клієнтам, підтримка. Ціна знижена з $20 до $10 для всіх. Документація проєкту
Через 2,5 місяці Перевірка на запит: бот живий. Закрита діра з подвійними записами, перші тести в проєкті
Наступного дня Закрита діра в прийомі оплати, ротація логів, відключений бот майстра з чужим вебхуком

Усього 46 комітів: 5 днів активної розробки і дві точкові сесії пізніше.

Чим робили

Python 3.11, aiogram 3.7, SQLAlchemy 2 з aiosqlite, APScheduler для нагадувань, aiohttp-сервер для постбеків оплати. Близько 4 700 рядків, найбільші файли: реєстрація майстра 2 125 рядків, переклади 986, бот клієнта 813.

Багато ботів в одному процесі: один спільний диспетчер aiogram і один виклик опитування з усіма ботами одразу. Коли майстер підключається або йде, задача опитування перезапускається з новим списком під замком asyncio.Lock, щоб два одночасні підключення не перебили одне одного. База: SQLite, один файл, таблиці майстрів, клієнтів, записів і окрема таблиця історії пробних місяців за Telegram ID. Сервер: VPS, служба systemd з автозапуском і автоперезапуском, деплой через git push і скрипт, вхід за SSH-ключем.

Гроші і ключі: секрети тільки в .env поза git. Постбек оплати приймається тільки з підписом (JWT HS256), підпис привʼязаний до конкретного рахунку, LiqPay перевіряє свою підпись окремо. Ціна задана в одному місці коду плюс тексти в перекладах.

Результат

Головний бот для майстрів: вибір мови, реєстрація (спеціальність, послуги з цінами, робочі години, вихідні дні, адреса з підказкою формату), інструкція BotFather з картинками, вставка токена. Кабінет: мої записи, налаштування, редагування і видалення послуг, розсилка всім своїм клієнтам, реферальне посилання (приведи майстра, отримай місяць безкоштовно), підтримка, оплата карткою через LiqPay або криптою через CryptoCloud. У сповіщенні про новий запис є кнопка «Написати клієнту».

Бот майстра для клієнтів: мова, послуга, день (швидкий вибір на 7 днів або своя дата), година. Видно лише вільний час. Можна скасувати запис із причиною, лишити контакт. Нагадування приходить за день до візиту. Мови: українська, російська, англійська, польська, іспанська, німецька. Лендінг ai-bot.com.ua/masters українською і англійською з демо-перепискою, тарифом і питаннями. Сам бот: t.me/masterbooking_main_bot.

Що заміряли. Аптайм: служба відпрацювала 2 місяці 20 днів без перезапуску, 180 МБ памʼяті, 195 хвилин процесора за весь час, черга необроблених повідомлень у Telegram порожня. Тести: три файли, 49 перевірок: 19 на зайняті слоти, включно з гонкою двох одночасних бронювань, 13 на справжню функцію запису, 17 на підпис постбека оплати. Кожен тест спершу падав на старому коді.

Чесно про слабке. Продукт технічно працює, але продажів нема. У базі 5 майстрів (один тестовий), 9 записів, після перших днів нових записів не зʼявлялося. Оплат нуль за всю історію, у трьох майстрів пробний місяць закінчився 21-55 днів тому, вони користуються безкоштовно. Чому підключені майстри перестали вести запис через бота, ми не зʼясовували, а без відповіді на це лагодити оплату рано. Відкритих дефектів на момент останньої перевірки пʼять, серед них: за несплату нікого не відключає, постбек іде по HTTP без TLS, кроки запису у клієнта поки захардкоджені російською, хоча кабінет майстра перекладено шістьма мовами.

Помилки і що винесли

Бот майстра мовчки не працював.Другий і наступні боти майстрів не отримували повідомлень: жодних помилок, просто тиша. Зловили за лічильником необроблених повідомлень у Telegram, який у другого бота не зменшувався. В aiogram не можна запускати опитування одного диспетчера кілька разів окремими задачами. «Нема помилок у лозі» не значить «працює»: дивитися на зовнішню ознаку.
Секрет оплати читався порожнім.load_dotenv() викликався після імпортів, які вже прочитали змінні оточення, і кожна перевірка підпису падала з 401 при правильному .env. Тепер завантаження оточення йде першим рядком. Того ж дня зʼясували, що провайдер підписує постбек JWT, а не HMAC, як ми думали.
Нескінченний безкоштовний місяць.Команда /reset видаляла майстра цілком, і можна було перереєструватися заради нового пробного місяця. Історію пробних місяців винесли в окрему таблицю за Telegram ID, вона переживає скидання.
Лендінг обіцяв те, чого не робив код.Сторінка тричі казала «без подвійних записів», а функція вільних слотів взагалі не дивилася в таблицю записів: зайнята година пропонувалася знову. Закрили у три шари: зайняті години віднімаються зі списку, перед записом перевірка, у базі частковий унікальний індекс лише для підтверджених записів. Окремий урок: create_all() не створює новий індекс на вже існуючій таблиці, його треба доставляти окремою командою, інакше по коду захист є, а в базі нема.
Підписку міг видати будь-хто.У перевірці підпису стояло «нема підпису, значить пропустити» з посиланням на офіційний приклад провайдера, а порт постбека відкритий в інтернет. Запит без підпису видавав майстру 30 днів. Перевірили живим запитом до правки і після (стало 401). Офіційний приклад провайдера не привід пускати непідписаний запит, якщо порт дивиться назовні.
Лог на 1,1 ГБ.Один майстер підключив до свого бота чужу платформу з вебхуком, наш процес отримував конфлікт кожні 5 секунд і писав його в лог, 6,8 МБ на добу. Лог стиснули до 49 МБ, поставили ротацію, токен цього бота відключили. Заодно зловили власну помилку: вранці вирішили, що логів у бота нема взагалі, бо дивилися не в той файл.
Пароль сервера в коді.У deploy.py лежав root-пароль. Прибрано, вхід за SSH-ключем, пароль на сервері змінено.

Інструменти

Python 3.11aiogram 3.7SQLAlchemy 2SQLiteAPScheduleraiohttpPyJWTLiqPayCryptoCloudsystemdlogrotateGitHubClaude Code