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

Что за задача
У небольшого салона доходы и расходы жили в одной таблице Excel: дата, статья, сумма, внизу итог, сбоку — прибыль по месяцам и два графика. Таблица понятная, беда в другом: чтобы внести расход, её надо открыть. А расход случается на ходу, когда под рукой только телефон.
Поэтому записи появлялись потом, когда до таблицы доходили руки. День покупки к этому времени уже не вспомнить — в таблицу ставили первое число месяца. А у части расходов не осталось и названия: в таблице есть строки «Расход без пояснения» — деньги ушли, а на что, в учёте не записано.
Нужен был учёт, ради которого не надо садиться за компьютер: записал там же, где переписываешься, и забыл. Без новой программы, которую придётся осваивать, и так, чтобы вносить могли двое. А привычная таблица с итогами и графиками должна была остаться.
Что это дало
Расход или доход записывается сообщением в Telegram — своими словами и в тот день, когда он случился, а не в конце месяца по памяти. Сводка за год с прибылью по месяцам и графиками открывается с телефона по кнопке. Привычный файл Excel никуда не делся: бот собирает его из тех же цифр.
С чего начинал
Таблица за 2026 год — всё, что было до бота. По ней видно, где ручной учёт теряет точность.
Годовые итоги салона в кейсе не показаны. На кадрах страницы сводки — демонстрационные данные: цифры выдуманы, а страница собрана тем же кодом, что работает у салона. Кадры переписки с ботом — настоящие, из рабочего бота.
| Показатель | Сколько |
|---|---|
| Операций в таблице за год | 109 |
| Из них с первым числом месяца вместо настоящего дня | 105 |
| Закупок в рублях, где сумма и курс вписаны в название статьи | 5 |
| Написаний у одной и той же статьи | 2 |
Первое число вместо дня — не небрежность, а следствие способа: таблицу заполняют, когда до неё дошли руки. По такой таблице видно, сколько ушло за месяц, но не видно когда, и сверить запись с чеком уже трудно.
С рублёвыми закупками то же самое. В колонке стояла сумма после пересчёта, а рубли и курс были записаны словами в названии статьи: прочитать можно, посчитать по ним — нет.
Что сделал
Операция — одно сообщение
Боту пишут так, как сказали бы человеку: «аренда 20000 за октябрь», «приход 4800 сегодня», «кофе 1200 вчера». Форм и обязательного порядка слов нет. Из сообщения бот достаёт дату, тип — доход или расход, — статью и сумму.
Дата не названа — берётся сегодняшняя. Назван только месяц — бот помечает, что точного дня нет, и не выдумывает его. Несколько операций можно прислать одним сообщением, по строке на каждую.

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

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

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

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

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


Старая таблица переехала целиком
Учёт за год не начинали с нуля: при первом запуске бот перенёс из таблицы все 109 операций. Перенос считается удачным, только если после него сошлись четыре контрольные цифры — число операций, сумма доходов, сумма расходов и прибыль. Сошлись все четыре.
Рублёвые закупки при переносе разобраны на рубли, курс и результат. Заодно пять таких операций пересчитаны заново по курсу Банка России — итог совпал с таблицей до единицы.
Тут нашлась мелочь, которая в деньгах мелочью не бывает: с курсом, округлённым до трёх знаков, одна операция расходилась на две единицы. Поэтому бот считает по неокруглённому курсу, а округляет только итог.
Сервер выключили — сообщения не пропали
Бот живёт на небольшом своём сервере, не в дата-центре: свет или интернет могут пропасть. На этот случай сообщения ждут в самом Telegram и разбираются по порядку, когда бот возвращается.
Дата операции берётся из времени отправки сообщения, а не из времени разбора: расход, написанный вечером тридцатого, не уедет на первое число. Кнопки «Записать» и «Отмена» под старыми сообщениями работают и после перезапуска, а повторно доставленное сообщение не записывается второй раз. Вернувшись, бот одним сообщением говорит, что был недоступен и сколько сообщений разобрал.
У этого есть честная граница: Telegram хранит такие сообщения не дольше суток. Если сервер молчал дольше, более ранние пропадут. Об этом бот предупреждает в справке и советует после долгого простоя заглянуть в «Последние операции».
Копия учёта — каждую ночь
Весь учёт — один файл на сервере. Раз в сутки, ночью, бот присылает его копию в Telegram тем, кто ведёт учёт, — если за день что-то изменилось. Сломается сервер — последняя копия останется в переписке.
Чужим бот не отвечает
Вносить операции и смотреть сводку могут только те, кто внесён в список, — сейчас это двое. Всем остальным бот не отвечает вообще: ни на сообщения, ни на кнопки, и меню команд посторонний не видит.
В группах бот тоже молчит — чтобы суммы не увидели лишние люди. В служебные журналы на сервере не попадают ни тексты сообщений, ни суммы.
Учёт у вас тоже живёт в таблице, до которой не доходят руки?
НаписатьПочему в кейсе нет цифр
Бот работает со 2 октября 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, в WhatsApp или на почту.
Удобнее написать самому — в Telegram, в WhatsApp или на почту.
Не уверены, что с сайтом не так, — проверьте его бесплатно в Telegram: @jw_site_check_bot.
Кому потом всё принадлежит и что будет, если я пропаду, — ответы на главной.