С деньгами у меня всегда была странная ситуация: их хватает, но их как-то не сильно много. Зарплата приходит, ничего крупного вроде не покупаю, а к концу месяца опять непонятно, куда все делось.
За жизнь я попробовал несколько подходов и сервисов для решения этой проблемы, но почти все упиралось в необходимость ручного ввода.
В почти любом сервисе можно настроить синхронизацию с банком и разложить операции по категориям. Сложнее с наличкой, но тоже можно: телеграм-боты позволяют быстро записывать суммы в подготовленные категории. Самый мрак начинается с супермаркетов, где в одной банковской операции оказываются и продукты, и домашняя утварь, и разные другие излишества. Банк видит магазин и общую сумму. Что именно вы там купили, из этой операции не узнаешь.
И вот мы попадаем на территорию магазинных чеков.

Почему не подошли готовые решения
Я был уверен, что здесь все давным-давно решено. Начал искать. В Дзен-мани и Дребеденьгах нашел сканирование QR-кодов: приложение получает по ним данные из налоговой или другой фискальной системы. Это удобно, пока твои чеки относятся к поддерживаемым странам. А мне хотелось просто сфотографировать чек из магазина в NL.
Другие найденные решения предлагали заодно переехать в их экосистему ведения бюджета. Или пользоваться заданным набором категорий. Или стоили как B2B. Короче, подходящего варианта не нашел. А заодно и понял, почему многие разбирают чеки именно руками.
И как хорошо, что теперь есть ИИ и каждый может сделать себе собственный сервис - можно просто описать хотелку, посыпать ее токенами и получить результат.
Приключение на 2-3 дня
Во всяком случае, так все выглядело до начала разработки.
Оказалось, что даже обычный магазинный чек умеет удивлять. Например, скидка может стоять отдельной строкой или быть второй строкой к товару. Еще есть возвратная тара, наличные со сдачей, разные языки названий позиций чека и разные валюты оплаты.
И все это нужно превратить в понятные покупки, которые потом не придется заново разбирать руками. И чтобы можно было синхронизировать с существующей системой учета. Короче, приключение на 2-3 дня начало затягиваться, и я начал задумываться, что такое приложение - это полезный и для других продукт, а не скрипт автоматизации.

Запросы на естественном языке
Очень быстро я заметил еще один неочевидный снаружи юзкейс - глядя в магазине на масло по скидке, как бы быстро понять, когда мы в прошлый раз покупали масло и сколько/почем? Ответы уже есть в чеках, но мне хотелось получить интерфейс, который концептуально способен отвечать на свободные или слабо-предсказуемые вопросы пользователя.
Таким образом, бот в телеграме перестал быть просто инбоксом чеков, а стал еще и инструментом для голосового ввода для NQL-запросов (Natural Query Language - запросы на естественном языке). Этого я не встречал у других приложений или ботов - большинство используют тг канал только как инбокс и для классической статистики по категориям. Спросить "сколько энергетиков в неделю я пью" - нельзя.


Пользовательские категории
Даже когда я был единственным пользователем, набор категорий товаров уже проектировался гибким и не захардкоженным - хоть я и взял за основу категории с одного известного сайта, но постоянно вводил новые категории по мере пользования. И я понимал, что невозможно ввести Единую Конечную и Полную категоризацию, пригодную для всех.
Также я знал, что невозможно за один присест разработать таксономию даже для одной семьи - это процесс вечного тюнинга. А еще я знал, что обнаружение нехватки категорий почти всегда происходит в момент заведения нового чека.
И вот так бот уже не просто инбокс и инструмент быстрого анализа - это уже полноценный альтернативный интерфейс создания чека, редактирования позиций чека, с возможностью прямо тут на месте создать новую категорию, которую забыли предусмотреть заранее.



Ошибки и память
А ошибки распознавания и категоризации будут всегда. Человек и сам не всегда может понять, что за позиция в чеке, тем более по нечеткому фото. LLM на удивление хорошо догадываются во многих ситуациях, но иногда результат все равно приходится поправлять.
И хочется, чтобы каждая такая правка помогала при следующих распознаваниях. Поэтому приложение запоминает, как товар назывался в чеке, где был куплен и какую категорию я ему назначил. При следующей похожей покупке оно учитывает это исправление. Это и есть семантическая память - способ постепенно уменьшать ручной разбор и наступать лишь на разные грабли, а не на одинаковые.
Экспорт и синхронизация
Но для чего собирать все эти красивые чеки с правильными категориями? Готовые сканилки чеков, как правило, предлагают свои же (эко)системы для фин учета, но мне очень не хотелось в это играть - очередная Правильная и Единая система управления финансами не нужна ни мне, ни рынку. Поэтому сканилка должна уметь передавать покупки в ту систему, в которой семья ведет планирование бюджета. Это может быть выгрузка в excel/json/Google Sheets, а может быть двухсторонняя синхронизация с, например, Actual Budget (который я использую сейчас).
Если с выгрузкой все более-менее понятно (добавил чек в сервис - увидел его в табличке в Google Sheets), то в случае Actual Budget внешняя система хранит в себе транзакции из банка, а FacturAI добавляет к ним субтранзакции (сплиты) с категориями. В результате в Actual Budget есть полная разбивка трат от ипотеки до покупки лука.


Интерфейс
И все это вместе нужно не просто выстроить в какой-то пайплайн, но еще и упаковать в продукт, которым приятно в самом широком смысле пользоваться. Мне очень не хотелось построить еще один generic SaaS AI slop UI, но в то же время, я максимально далек в профессиональном смысле от интерфейсов и не знаю, как правильно делать удобные и приятные продукты.
На середине этого текста, я думаю, вы уже поняли, почему я не смог найти себе готовое решение. Но, собрав MVP своего решения, занейрослопив весь UI, быстро понял, что хочу плеваться, а не пользоваться. Но при этом объяснить самому себе, что именно мне в сгенеренном варианте не нравится - не могу.




В итоге я оттолкнулся от любимого мною, но устаревшего нынче скевоморфизма (а точнее его наследника - неоморфизма) - мне хотелось, чтобы человек не находился в очередном безликом UI пространстве системы финансового учета, а работал с чеками. С маркерами, скрепками, пометками на полях и т.д.




PDF и почта
Однажды для проверки загрузки PDF я взял выписку по кредитной карте. Там были Steam, YouTube Premium и другие покупки, которые до этого прятались за общей суммой оплаты кредитки. Система разобрала их по отдельности, и я смог посмотреть, сколько действительно трачу на игры.
Выяснилось, что на вход вполне подходят инвойсы, выписки и скриншоты корзин. Следом появился почтовый инбокс: у каждой семьи есть адрес, на который можно переслать письмо с покупкой прямо во время разбора почты.
Для регулярных писем можно настроить автоматическую пересылку. Купил что-нибудь на маркетплейсе, получил подтверждение заказа, почта переслала его в FacturAI, сервис разобрал покупки и отправил разбивку в Actual. В таком флоу уже вообще исчезает тот самый ручной ввод, с которого началась вся история.


Что дальше
Сейчас я пользуюсь FacturAI каждый день, вместе со мной его используют несколько друзей. По их фидбэку мы уже исправили самые очевидные болячки, и мне нравится, что из этой затеи получилось что-то полезное в обычной жизни.
Идей для продолжения накопилось много, кое-что уже пробую. Теперь хочется посмотреть, какие задачи возникнут у других людей и что из задуманного пригодится им. Это поможет понять, куда развивать сервис дальше.
Если вам знакома история с загадочной категорией "Супермаркеты", приходите попробовать FacturAI. Можно загрузить несколько своих чеков, посмотреть на покупки и спросить бота текстом или голосом о чем-нибудь, что давно хотелось узнать.
Бесплатно можно вести учет покупок, выгружать данные в Excel, CSV и JSON, а траты заносить вручную или голосом через Telegram без месячного лимита. Еще в бесплатной версии есть 15 распознаваний фото и документов и 15 AI-запросов к истории покупок в месяц. Платный доступ снимает оба месячных лимита и добавляет прием чеков по email, автоматическую синхронизацию с Google Sheets и интеграцию с Actual Budget.

А еще даже в бесплатной версии доступны публичный API и вебхуки. Можно написать небольшую обвязку на Python: получать уведомления о новых чеках, забирать данные о покупках и отправлять их в свою таблицу или другую систему учета. Так что если готовые интеграции вам не подходят, свою автоматизацию можно собрать и без платного доступа.



А если вы тоже ведете бюджет в Actual Budget, напишите мне здесь или в Telegram, открою платный доступ бесплатно. Еще интересно, какие другие системы учета вы используете и хотели бы связать с FacturAI. Не везде есть сплиты, поэтому буду рад услышать, как вы представляете такую интеграцию и какие ограничения своей системы уже знаете. Пишите в комментарии или в личку, буду благодарен.
Еще я веду канал в Telegram, где пишу про обновления и показываю, как меняется продукт. Если интересно посмотреть, что из этой затеи получится, подписывайтесь. Мне будет приятно видеть там ваши реакции, вопросы и идеи - с таким общением делать продукт интереснее.
Ссылки
- Сайт: facturai.io
- Документация API: api.facturai.io/docs
- Telegram-канал: t.me/facturai
- Написать мне в Telegram: t.me/madesst
