I Categorized 1,200 Transactions in Google Sheets. Here Are the Exact Formulas
I spent a whole evening categorizing 1,200 transactions by hand. It was miserable. Then I found a formula that does it in about two minutes, and I've never gone back.
Here's the thing: most people quit expense tracking not because they don't want to know where their money goes, but because the categorizing part is soul-crushing. You stare at a list of raw bank descriptions like "GRAB *TFR" and "FAIRPRICE" and you have to decide, one by one, whether each one is transport or groceries.
This post shows you the exact Google Sheets formulas I use to categorize a month of transactions automatically. No add-ons, no scripts, no paid tools. Just three functions you already have: IFS, SEARCH, and SUMIF.
I'll use my own real spending from last month as the example, so you can see the numbers and copy the formulas directly.
Why manual categorizing is a trap
When I first started tracking, I had a spreadsheet with a "Category" column and a drop-down list. Every transaction, I clicked the cell, picked a category, moved on. For 40 transactions a month, that's maybe 20 minutes. Fine.
But then I imported a full year of bank history. 1,200 rows. At 20 minutes per 40 rows, that's ten hours of clicking. I did about 200 rows before I gave up and closed the tab.
The problem isn't you. It's that raw bank descriptions don't look like categories. "PAYNOW" tells you nothing. "NETFLIX.COM" is obvious, but "GRAB *TFR" could be a taxi, a food delivery, or a ride share. You're doing the same mental work over and over.
The formula that fixes it
The trick is to let Google Sheets read the description and guess the category for you. You give it a list of keywords, and it matches each transaction to a category.
Here's the core formula, in column C next to your raw data:
=IFS(ISNUMBER(SEARCH("grab", B2)), "Transport",
ISNUMBER(SEARCH("fairprice", B2)), "Groceries",
ISNUMBER(SEARCH("netflix", B2)), "Subscriptions",
TRUE, "Uncategorized")
Let me break that down, because it looks scarier than it is.
SEARCH("grab", B2)looks for the word "grab" inside the description in cell B2. It's not case-sensitive, so "GRAB" and "grab" both match.ISNUMBER(...)turns that into a TRUE or FALSE. If the word is found, SEARCH returns a number, so ISNUMBER is TRUE.IFS(...)checks each condition in order and returns the first one that's TRUE. So if the description contains "grab", it returns "Transport". If not, it checks "fairprice", then "netflix".- The final
TRUE, "Uncategorized"is the catch-all. If nothing matches, it labels the row "Uncategorized" so you can fix it later.
My real example
Here's a slice of my actual transactions from last month, with the formula applied:
| Date | Description | Amount | Category |
|---|---|---|---|
| 2026-07-02 | GRAB *TFR | $12.40 | Transport |
| 2026-07-03 | FAIRPRICE | $84.20 | Groceries |
| 2026-07-05 | NETFLIX.COM | $15.98 | Subscriptions |
| 2026-07-06 | GRAB *TFR | $9.10 | Transport |
| 2026-07-08 | KOPITIAM | $4.50 | Uncategorized |
| 2026-07-09 | FAIRPRICE | $61.75 | Groceries |
The formula caught the obvious ones. "KOPITIAM" didn't match anything, so it landed in "Uncategorized", and I added one line to the formula: ISNUMBER(SEARCH("kopitiam", B2)), "Dining Out". Thirty seconds of work, and now every future kopitiam visit is categorized automatically.
That's the real payoff. You build the keyword list once, and it compounds. Every new transaction that matches an existing keyword is categorized with zero effort.
The keyword list that covers most of my spending
After a few months, my list settled into about 20 keywords that catch 90% of my transactions. Here's the full formula I use now:
=IFS(
ISNUMBER(SEARCH("grab", B2)), "Transport",
ISNUMBER(SEARCH("comfort", B2)), "Transport",
ISNUMBER(SEARCH("fairprice", B2)), "Groceries",
ISNUMBER(SEARCH("cold storage", B2)), "Groceries",
ISNUMBER(SEARCH("kopitiam", B2)), "Dining Out",
ISNUMBER(SEARCH("hawker", B2)), "Dining Out",
ISNUMBER(SEARCH("netflix", B2)), "Subscriptions",
ISNUMBER(SEARCH("spotify", B2)), "Subscriptions",
ISNUMBER(SEARCH("singtel", B2)), "Utilities",
ISNUMBER(SEARCH("sp services", B2)), "Utilities",
TRUE, "Uncategorized"
)
The exact keywords depend on your bank and your habits, but the structure is the same. Start with the merchants you see most often, and add one line whenever something lands in "Uncategorized" that you expect to see again.
Summing it up with SUMIF
Once everything is categorized, you want totals per category. That's where SUMIF comes in:
=SUMIF(C:C, "Groceries", D:D)
This adds up every amount in column D where the category in column C is "Groceries". Last month that gave me $1,247.30 on groceries, which is more than I thought. The formula doesn't judge, it just shows you the number.
For a full breakdown, a pivot table is even better. Select your data, go to Insert > Pivot table, put Category in Rows and Amount in Values, and you get a clean summary in one click.
What this actually saved me
Here's the before and after:
| Before | After | |
|---|---|---|
| Time to categorize a month | ~20 min | ~2 min |
| Time to categorize a year (1,200 rows) | ~10 hours | ~15 min |
| Rows left to fix by hand | all of them | ~10% |
The 10% that land in "Uncategorized" are the weird one-offs, and those are worth a quick look anyway, because they're usually the spending you forgot about.
When a formula isn't enough
The formula approach works great if you're comfortable in Google Sheets and you don't mind maintaining a keyword list. But it has limits. If your bank exports descriptions in inconsistent formats, or you have transactions in multiple currencies, or you just don't want to babysit a formula, it gets tedious fast.
That's the gap I ran into, and it's why I built CalmExpense. It's a Google Sheets dashboard that does the categorization for you, with rules you set once on the Setup page. You upload your bank CSV, it processes the data, and your transactions come out categorized. It's a one-time $29.90 purchase, your data stays in your own Google Drive, and there's no subscription to feed. If you're already tracking in Google Sheets, it saves you roughly 10 minutes a month on the categorizing you'd otherwise do by hand.
If you need help getting your bank data into a spreadsheet in the first place, I wrote a step-by-step guide to importing bank statements as CSV. And if you're wondering why keeping your data in your own Google Drive matters, I covered that too.
FAQ
Does SEARCH work with uppercase and lowercase? Yes. SEARCH is not case-sensitive, so "GRAB" and "grab" both match. If you want case-sensitive matching, use FIND instead.
What if a transaction matches two keywords? IFS returns the first match in the order you wrote them. Put the more specific keyword first. For example, put "grab food" before "grab" if you want food deliveries separated from rides.
Can I use this with Excel? Yes. IFS, SEARCH, and SUMIF all work in Excel too. The syntax is the same.
How do I handle transactions that stay "Uncategorized"? Add a new line to the formula for any keyword you see repeating. After a few months, the list stabilizes and almost nothing falls through.
Is there a way to avoid maintaining the formula at all? Yes. That's exactly what CalmExpense automates. You set your categorization rules once and it applies them to every import.
Last updated: August 26, 2026
See your own spending this clearly
CalmExpense turns your bank statement into a clean dashboard inside your own Google Sheets. No bank linking, no subscription. One payment of $29.90.
Start your free trial