This workflow turns a simple chat interface into a powerful personal expense tracker. Just describe your spending in plain language β the AI understands it, categorizes it, and saves it to Google Sheets automatically.
Example inputs the AI understands:
spent 500 on lunchuber 150paid 1200 electricity billlunch in feb 25 cost 500 β handles past dates toonetflix 499$50 hotel booking β detects currencyNo rigid formats. No dropdowns. Just type naturally.
SUMMARY or summary february for any month| What you type | What happens |
|---|---|
spent 500 on lunch |
β Saved: π Food & Dining β Lunch Β· βΉ500 |
uber 150 |
β Saved: π Transport β Uber Β· βΉ150 |
1200 electricity bill |
β Saved: π‘ Bills & Utilities Β· βΉ1200 |
lunch in feb 25 cost 500 |
β Saved to February 2025 correctly |
SUMMARY |
π Current month report with breakdown |
summary february |
π February report (current year) |
summary february 2025 |
π February 2025 specific report |
HELP |
π Shows all commands and categories |
Create a new Google Sheet with these exact headers in Row 1:
| Col | Header |
|---|---|
| A | Date |
| B | Amount |
| C | Category |
| D | Description |
| E | Currency |
| F | Month |
| G | Raw Message |
| H | Total |
| Credential | Used for | Free? |
|---|---|---|
| Anthropic API | Claude Haiku AI parsing | Paid (very low cost) |
| Google Sheets OAuth2 | Read & write expenses | Free |
Claude Haiku nodeYou type: "spent 500 on car wash"
β
Detect Intent β classified as: expense
β
Read All Expenses β loads sheet (works even if empty)
β
Prepare Data β calculates existing month total
β
AI Parse Expense (Claude Haiku)
β amount: 500
β category: Transport
β description: Car wash
β date: today
β currency: INR
β
Parse & Total
β derives Month from parsed date
β computes new running total
β
Is Valid? (amount > 0 and is_expense = true)
β
YES β Save to Sheet β Reply with confirmation
β NO β Ask user to include an amount
Summary flow:
You type: "summary february"
β
Detect Intent β classified as: summary
β
Read for Summary β loads all rows
β
Build Summary
β detects "february" in message
β filters rows by February (current year)
β calculates total, breakdown by category, daily avg
β
Returns formatted report
π March 2026 Report
π³ Total: βΉ8,450
π Entries: 12
π Daily avg: βΉ470
π Top: π Food & Dining
Breakdown:
π Food & Dining: βΉ3,200 (38%)
π Transport: βΉ1,800 (21%)
π‘ Bills & Utilities: βΉ1,200 (14%)
ποΈ Shopping: βΉ1,050 (12%)
π¬ Entertainment: βΉ800 (9%)
π₯ Health: βΉ400 (5%)
| Emoji | Category | Example keywords |
|---|---|---|
| π | Food & Dining | lunch, dinner, restaurant, zomato, swiggy, grocery |
| π | Transport | uber, ola, petrol, metro, flight, car wash, parking |
| ποΈ | Shopping | amazon, flipkart, clothes, electronics, shoes |
| π‘ | Bills & Utilities | electricity, wifi, rent, recharge, emi, gas |
| π¬ | Entertainment | netflix, movie, spotify, concert, gaming |
| π₯ | Health | medicine, doctor, gym, pharmacy, hospital |
| πΌ | Business | office, software, domain, hosting, tools |
| π | Education | course, books, tuition, udemy, fees |
| π° | Other | anything that doesn't match above |
| Node | Type | Purpose |
|---|---|---|
| When chat message received | Chat Trigger | Entry point |
| Detect Intent | Code | Classify: expense / summary / help |
| Intent Switch | Switch | Route to correct path |
| Read All Expenses | Google Sheets | Load rows (alwaysOutputData: true) |
| Prepare Data | Code | Compute month total, handle empty sheet |
| AI Parse Expense | LLM Chain | Extract fields using Claude Haiku |
| Claude Haiku | Anthropic Model | AI model for parsing |
| Parse & Total | Code | Validate, derive month, compute total |
| Is Valid Expense? | IF | Check amount > 0 |
| Save Expense to Sheet | Google Sheets | Append new row |
| Reply Saved | Code | Format confirmation message |
| Reply Invalid | Code | Request amount from user |
| Read for Summary | Google Sheets | Load all rows for report |
| Build Summary | Code | Filter by month, compute breakdown |
| Send Help | Code | Return command reference |
Read All Expenses node has Always Output Data enabled β this is required so the flow works on an empty sheetTotal column stores the running month total at the time of each entry β it does not update retroactively if you delete rowsBuilt with n8n Β· Claude Haiku Β· Google Sheets By Nirav Gajera