кейсыsalon-budget-bot

enобсудить задачуменюзакрыть

Небольшой салон красоты · 

Учёт салона, который ведётся сообщением в Telegram

Расход или доход пишут боту своими словами — «аренда 20000 за октябрь». Бот показывает, как понял, и записывает после кнопки. Сводка за год открывается с телефона по ссылке, а привычный файл Excel собирается по кнопке.

Сводка за год на экране телефона — доход, расход, прибыль и рентабельность, ниже таблица по месяцам. Данные демонстрационные

Что за задача

У небольшого салона доходы и расходы жили в одной таблице Excel: дата, статья, сумма, внизу итог, сбоку — прибыль по месяцам и два графика. Таблица понятная, беда в другом: чтобы внести расход, её надо открыть. А расход случается на ходу, когда под рукой только телефон.

Поэтому записи появлялись потом, когда до таблицы доходили руки. День покупки к этому времени уже не вспомнить — в таблицу ставили первое число месяца. А у части расходов не осталось и названия: в таблице есть строки «Расход без пояснения» — деньги ушли, а на что, в учёте не записано.

Нужен был учёт, ради которого не надо садиться за компьютер: записал там же, где переписываешься, и забыл. Без новой программы, которую придётся осваивать, и так, чтобы вносить могли двое. А привычная таблица с итогами и графиками должна была остаться.

Что это дало

Расход или доход записывается сообщением в Telegram — своими словами и в тот день, когда он случился, а не в конце месяца по памяти. Сводка за год с прибылью по месяцам и графиками открывается с телефона по кнопке. Привычный файл Excel никуда не делся: бот собирает его из тех же цифр.

С чего начинал

Таблица за 2026 год — всё, что было до бота. По ней видно, где ручной учёт теряет точность.

Годовые итоги салона в кейсе не показаны. На кадрах страницы сводки — демонстрационные данные: цифры выдуманы, а страница собрана тем же кодом, что работает у салона. Кадры переписки с ботом — настоящие, из рабочего бота.

Таблица учёта салона, январь — начало октября 2026
ПоказательСколько
Операций в таблице за год109
Из них с первым числом месяца вместо настоящего дня105
Закупок в рублях, где сумма и курс вписаны в название статьи5
Написаний у одной и той же статьи2

Первое число вместо дня — не небрежность, а следствие способа: таблицу заполняют, когда до неё дошли руки. По такой таблице видно, сколько ушло за месяц, но не видно когда, и сверить запись с чеком уже трудно.

С рублёвыми закупками то же самое. В колонке стояла сумма после пересчёта, а рубли и курс были записаны словами в названии статьи: прочитать можно, посчитать по ним — нет.

Что сделал

Операция — одно сообщение

Боту пишут так, как сказали бы человеку: «аренда 20000 за октябрь», «приход 4800 сегодня», «кофе 1200 вчера». Форм и обязательного порядка слов нет. Из сообщения бот достаёт дату, тип — доход или расход, — статью и сумму.

Дата не названа — берётся сегодняшняя. Назван только месяц — бот помечает, что точного дня нет, и не выдумывает его. Несколько операций можно прислать одним сообщением, по строке на каждую.

Справка бота в Telegram: примеры сообщений — «закупка лебель 14244», «аренда 16000 за октябрь», «приход 5400 сегодня», «июль в рублях закупка 37700»
Справка самого бота: так выглядит всё, что нужно знать, чтобы вести учёт. Четыре примера сообщений — и ни одной формы.

Сначала показывает, потом записывает

На каждое сообщение бот отвечает разбором: что понял, на какую дату, в какую статью и на какую сумму. Под разбором две кнопки — «Записать» и «Отмена». В учёт операция попадает только после «Записать».

Переписка с ботом: сообщение «Закупка кофе на 2000», ответ «Проверьте и подтвердите: расход, кофе, 2 000, 07.10.2026» и кнопки «Записать» и «Отмена»
Весь ввод — одно сообщение. Бот отвечает, как его понял: расход, статья, сумма и сегодняшняя дата, потому что день не назван. Дальше — одна кнопка.

Если из текста неясно, доход это или расход, бот не угадывает, а спрашивает двумя кнопками. Если разобрать сообщение не удалось — так и отвечает и ничего не записывает.

ИИ читает, считает программа

Свободный текст разбирает ИИ — и на этом его работа кончается. Он возвращает дату, тип, статью и сумму так, как их написал человек. Складывать, пересчитывать валюту и считать проценты ему не доверено: вся арифметика — обычная программа, которая на одних и тех же данных всегда даёт один и тот же ответ.

Для учёта это главное решение. Ошибка в понимании видна на экране до записи. Ошибка в сложении была бы не видна никому.

Одна статья — одно название

Вместе с сообщением ИИ получает список статей, которые в учёте уже есть. Поэтому название, написанное с маленькой буквы, с большой или латиницей, попадает в одну и ту же статью, а не в три разные.

В старой таблице одна статья была записана двумя способами — при переносе они сведены в одну.

Рубли пересчитываются сами

Часть закупок салон оплачивает в рублях, а учёт ведёт в другой валюте. Достаточно написать «июль в рублях закупка 30000»: бот возьмёт курс Банка России и пересчитает. За уже закрытый месяц — средний курс за месяц, за текущий — курс на день операции. В записи остаются и рубли, и курс, и результат: видно, откуда взялась сумма.

Если Банк России не отвечает, курс наугад не подставляется: операция не записывается, сообщение сохраняется, и под ним появляется кнопка «Повторить».

Сводка открывается по ссылке на 15 минут

По кнопке «Статистика» бот присылает ссылку. Она открывается в браузере телефона — без приложения, пароля и регистрации — и работает 15 минут. Потом страница перестаёт открываться, и ссылку берут заново.

Ответ бота на запрос статистики: «Ссылка на статистику действует 15 минут» и кнопка «Открыть статистику»
Сводка — одна кнопка в чате. Бот сразу говорит, сколько живёт ссылка и что делать потом.

На странице — итоги года: доход, расход, прибыль и рентабельность. Ниже — таблица по месяцам со средней прибылью с начала года, два графика, на которых убыточный месяц отмечен красным, и все операции списком.

Месяц, который ещё идёт и в котором расходы уже записаны, а выручка нет, в прибыль и среднее не входит — иначе каждый месяц начинался бы с «убытка». На странице об этом прямо написано.

Названия салона на странице нет. По просроченной ссылке и по любому другому адресу сервер не показывает ничего, поисковикам страница закрыта.

И одна неочевидная деталь: ссылка не одноразовая, хотя так было бы строже. Telegram сам открывает присланные ссылки, чтобы показать превью, — одноразовую он потратил бы раньше человека.

Два графика на странице сводки: столбцы доходов и расходов по месяцам и линия чистой прибыли со средним с начала года, убыточный март отмечен красной точкой
Графики на странице сводки, как их видно с телефона. Данные демонстрационные: март сделан убыточным, чтобы показать красную отметку, а в октябре нет выручки — поэтому в прибыль он не входит.

Excel остался

По кнопке «Выгрузить xlsx» бот присылает файл в привычном виде: операции, итог, прибыль, рентабельность, таблица по месяцам и два графика.

Бот прислал в чат файл «Доходы и расходы 07.10.2026.xlsx»
Файл приходит прямо в переписку, в названии — день выгрузки.

Итоги в файле и на странице не могут разойтись: и то и другое берётся из одного расчёта. В ячейках стоят числа, а не формулы, поэтому файл одинаково открывается в Excel и в предпросмотре на телефоне.

Ошибку видно, и её можно убрать

Кнопка «Последние операции» показывает десять последних записей, у каждой — удаление с подтверждением. Удалённая операция исчезает из сводки и из выгрузки, но из базы не стирается, а помечается.

Кнопки «Изменить» нет намеренно: исправить — значит удалить и написать заново, тем же сообщением.

Сообщение бота «Последние операции»: десять записей с датой, типом, статьёй и суммой, под ними десять кнопок с корзиной и номером
Последние десять записей в чате. Под списком — по кнопке на каждую: нажал номер, подтвердил, и запись ушла из учёта.
Список операций на странице сводки: дата, статья, доход или расход, новые записи сверху
Все операции на странице сводки: новые сверху, у каждой — день, статья и сумма. Удалённая запись отсюда исчезает. Данные демонстрационные.

Старая таблица переехала целиком

Учёт за год не начинали с нуля: при первом запуске бот перенёс из таблицы все 109 операций. Перенос считается удачным, только если после него сошлись четыре контрольные цифры — число операций, сумма доходов, сумма расходов и прибыль. Сошлись все четыре.

Рублёвые закупки при переносе разобраны на рубли, курс и результат. Заодно пять таких операций пересчитаны заново по курсу Банка России — итог совпал с таблицей до единицы.

Тут нашлась мелочь, которая в деньгах мелочью не бывает: с курсом, округлённым до трёх знаков, одна операция расходилась на две единицы. Поэтому бот считает по неокруглённому курсу, а округляет только итог.

Сервер выключили — сообщения не пропали

Бот живёт на небольшом своём сервере, не в дата-центре: свет или интернет могут пропасть. На этот случай сообщения ждут в самом Telegram и разбираются по порядку, когда бот возвращается.

Дата операции берётся из времени отправки сообщения, а не из времени разбора: расход, написанный вечером тридцатого, не уедет на первое число. Кнопки «Записать» и «Отмена» под старыми сообщениями работают и после перезапуска, а повторно доставленное сообщение не записывается второй раз. Вернувшись, бот одним сообщением говорит, что был недоступен и сколько сообщений разобрал.

У этого есть честная граница: Telegram хранит такие сообщения не дольше суток. Если сервер молчал дольше, более ранние пропадут. Об этом бот предупреждает в справке и советует после долгого простоя заглянуть в «Последние операции».

Копия учёта — каждую ночь

Весь учёт — один файл на сервере. Раз в сутки, ночью, бот присылает его копию в Telegram тем, кто ведёт учёт, — если за день что-то изменилось. Сломается сервер — последняя копия останется в переписке.

Чужим бот не отвечает

Вносить операции и смотреть сводку могут только те, кто внесён в список, — сейчас это двое. Всем остальным бот не отвечает вообще: ни на сообщения, ни на кнопки, и меню команд посторонний не видит.

В группах бот тоже молчит — чтобы суммы не увидели лишние люди. В служебные журналы на сервере не попадают ни тексты сообщений, ни суммы.

Учёт у вас тоже живёт в таблице, до которой не доходят руки?

Написать

Почему в кейсе нет цифр

Бот работает со 2 октября 2026 года — на день публикации меньше недели. За это время нельзя честно сказать ни «экономит столько-то часов», ни «учёт стал точнее на столько-то».

Точно известно то, что проверено до запуска и в первый день.

Что проверено и чем — на 7 октября 2026
Что проверялиЧто вышло
Перенос старой таблицы109 операций, все четыре контрольные цифры сошлись
Разбор сообщений настоящим ИИВосемь пробных сообщений из восьми разобраны верно
Время ответаОколо пяти секунд на сообщение
Простой и перезапускАвтоматическая проверка: три сообщения из очереди записаны по порядку, с датами отправки и без повторов
Обрыв посреди записиОтдельная проверка кода: двойной записи и порчи базы нет

А вот чем будет меряться результат. У каждой операции бот помечает, записана она через него или перенесена из таблицы и назван ли в ней точный день. В старой таблице настоящий день стоял у 4 операций из 109. Через месяц-другой та же доля у новых записей и покажет, стал ли учёт вестись вовремя.

Цифры про старую таблицу — из неё самой и из проверки переноса. Про разбор и время ответа — из рабочего журнала проекта, запись от 2 октября 2026. Кадры страницы сводки сняты на демонстрационных данных, кадры переписки — в рабочем боте 7 октября 2026. Исходный код не опубликован: в его проверках стоят настоящие цифры салона.

Что это даёт бизнесу дальше

Нужно ли кого-то учить?

Нет. Писать боту — то же, что писать человеку в Telegram: что купили и за сколько. Форм и обязательного порядка слов нет, а если бот понял не так — это видно до записи.

Что, если ИИ поймёт неправильно?

Сам он ничего не записывает: сначала показывает разбор, и в учёт операция попадает только после кнопки. А считать ему не доверено вовсе — суммы, курс и проценты считает программа.

Кто увидит цифры?

Только те, кто внесён в список. Остальным бот не отвечает, ссылка на сводку живёт 15 минут, названия бизнеса на странице нет, поисковикам она закрыта.

Что стоит денег после запуска?

Сервер, на котором живёт бот, и ИИ, который разбирает сообщения. Telegram и курс Банка России бесплатны.

Что из этого переносится на другой бизнес?

Почти всё, кроме самих статей. Написал своими словами, проверил, подтвердил; сообщения не теряются при простое; копия каждую ночь; сводка по ссылке и файл для Excel — это каркас. Меняется то, что именно записывают: вместо доходов и расходов это могут быть заказы, смены, пробег машин или остатки на складе.

Как это устроено технически

Python 3.14, aiogram 3, aiohttp, openpyxl, SQLite в режиме WAL с synchronous=FULL. Разбор — модель Claude Sonnet, ответ строго по JSON-схеме: дата, тип, статья, сумма, валюта. В запрос уходят сегодняшняя дата и список существующих статей. Курс — XML Банка России с кэшем в базе: закрытый месяц — среднее по дням, где курс есть, текущий — курс на дату или ближайший предыдущий.

Обновления — long polling без сброса очереди, строго по одному; отметки обработанных update_id хранятся неделю. Сообщение сохраняется в базе до обращения к модели, один пакет на одно сообщение Telegram (UNIQUE (chat_id, message_id)); запись операций и смена статуса пакета — одной транзакцией, поэтому подтверждение идемпотентно. Ответ с кнопками отправляется до победного: пока он не ушёл, следующее обновление не берётся.

Страница сводки — один HTML без скриптов и внешних ресурсов, графики — встроенный SVG, светлая и тёмная тема. Токен ссылки — 32 случайных байта, живёт в памяти 15 минут. Без действующего токена сервер отдаёт пустой 404 на всё, кроме robots.txt, — в том числе на запросы, которые не являются HTTP. Заголовки запрещают индексацию, кэширование и встраивание; журнал доступа выключен, чтобы токены в него не попадали. Наружу сервер опубликован через Tailscale Funnel.

Служба systemd с автозапуском, домашняя папка для неё закрыта на запись. Копия базы снимается механизмом резервного копирования SQLite, а не чтением файла на ходу. Больше трёхсот автоматических тестов, сети и секретов они не требуют: ответы Банка России записаны заранее. Перед выкладкой — отдельное ревью кода, по нему исправлены четыре дефекта доставки ответов и веб-сервера.

Кто это делал

За jw-dev.pro — я один, а не студия и не агентство. Значит, вы говорите напрямую с тем, кто делает: без менеджера, без брифа через третьи руки и без передачи проекта другому исполнителю посреди работы.

Часовой пояс UTC+7 — как в Бангкоке и Ханое. Делаю сайты, Telegram-ботов и автоматизацию — задача редко заканчивается страницей, обычно её нужно связать с тем, что у вас уже работает.

Чем дальше, тем реже задача звучит как «сделать сайт». Одному нужно, чтобы цена правилась в одном месте, а не на двадцати страницах. Другому — чтобы канал выходил без него. Третьему — чтобы весь прайс лежал внутри Telegram, куда его клиенты и так заходят каждый день. Поэтому список работ у меня открытый: если вашей задачи в нём нет, это ещё не значит, что она не решается.

Кейсы я пишу так, чтобы их можно было проверить: что было, что сделано и чем это измерено. Есть аналитика — ставлю её цифры и период, за который они сняты; мерить рано — так и пишу. «Увеличил продажи» вы тут не найдёте: это не результат, а обещание.

Нужно похожее?

Сайт, бот или то, что сейчас делается руками, — расскажите, что у вас происходит, и я скажу, решается это или нет.

Такая работа — услуга «Автоматизация бизнес-процессов для малого бизнеса».

Заявка у меня

Прочитаю сам и отвечу туда, куда вы указали.

Отправить ещё одну

Что нужно можно несколько

Своими словами: что есть сейчас и что хочется получить. Есть сайт или бот — вставьте ссылку.

Заявка придёт мне в Telegram — отвечу сам.

Удобнее написать самому — в Telegram, в WhatsApp или на почту.

Не уверены, что с сайтом не так, — проверьте его бесплатно в Telegram: @jw_site_check_bot.

Кому потом всё принадлежит и что будет, если я пропаду, — ответы на главной.