

One text message and the expense is filed in Notion
Text the bot in English or Russian the way you would text a friend, tap who it was for and tap Confirm. Five steps later the categorized row is in Notion.
Built with Claude Code in 1 day

Nothing reaches Notion until you tap Confirm
The bot pulls the amount, the type, the category and the date out of your message and shows them back. One tap saves the row, one tap throws it away.
- 1Write in Russian, get Expense €14.50, category Food, date filled in
- 2Person, currency and category are on screen before anything is saved

Your spending is already a filterable table
Every confirmed message writes one typed row with amount, type, category, date, notes, person and currency. Filter by person or by category without building a spreadsheet first.

It picks the category, you pick the person
Twenty-two categories from Food to Taxes are matched against the words in your message, in English or Russian. The only thing the bot asks is who the transaction belongs to.
Logging a coffee meant opening an app and picking from menus, so the log fell behind within weeks.
You text it like a friend and the categorized row is in Notion one tap later.
Under the hood
01Context
Tracking spending by hand means opening an app every time
Logging a purchase by hand means opening a separate app or spreadsheet, then picking a category, a currency and who it was for from a set of menus, for every coffee and every bill. That friction is exactly why a spending log tends to fall behind or stop after a few weeks. The bot logs a transaction from wherever it already gets mentioned: a short message in English or Russian.
02How it works
A message, three taps, a row in Notion
A message like 'spent $45 on lunch' or 'потратил 500 на обед' is the only typing involved. The bot replies with buttons for who it is for, then a currency choice between USD and EUR, then a preview of everything it parsed: amount, type, category, date and notes. Behind that reply, tools/parse_transaction.py matches the message against 22 categories by keyword, checked in order until one fits, and decides expense or income from words like 'spent' and 'paid' against 'received' and 'salary'.
03Constraints
Rule-based parsing, a whitelist, two ways to run it
Category detection is rule-based rather than a model call, so a message that matches no keyword lands in Other instead of a smart guess, and currency is limited to USD and EUR. The bot only answers Telegram user IDs on an explicit whitelist, and re-validates the person and currency server-side even though they arrive from button taps. The same code runs two ways: main.py for a local process, or modal_app.py on Modal, where credentials live as Modal secrets instead of a local .env file.
ANM SOLUTIONS / CONTACT US
Want something like this?
First 30-minute call is free. We scope it, you decide.
Related service · Workflow & Process Automation ›

A Shorts factory with story, voice, video and approval in Telegram
