How to categorize a bank statement (that actually stays clean)
The full playbook for categorizing bank transactions: category lists, rule ordering, refunds, transfers, and an audit trail that survives a real year.
By Karchu Editorial Team, reviewed against our editorial standards · Updated
Categorizing a bank statement sounds easy until you try to keep it clean for a full year. Merchant names change, cards get reissued, subscriptions rename themselves, and the same coffee shop shows up under four different strings. This guide is the whole routine: how to design the category tree, how to write rules that hold up, how to deal with the awkward cases (refunds, transfers, split charges, foreign currency), and how to review the result in five minutes a month.
The short version: stop tagging transactions, start writing rules, and let the rules run backwards over your history as well as forwards.
Why manual categorization always collapses
Three reasons, in order of severity.
- Volume. One person on a normal card produces 40 to 100 transactions a month. A small business produces 200 to 500. Even at five seconds a row that is a chore you will skip.
- Consistency. Two months later you cannot remember whether Amazon was Household or Personal. The categories drift and month to month comparisons quietly stop meaning anything.
- Restart cost. Once you are three months behind, catching up feels harder than starting over. So you start over, and then you fall behind again.
None of that is a discipline problem. It is a model problem. Tagging rows is linear work that grows with your spending. Writing rules is fixed work that shrinks over time.
Step 1: start with a taxonomy you can defend
A good category tree has three properties. Every real transaction fits exactly one leaf. The top level groups map to a question you actually ask (how much do I spend on housing, food, transport). And the tree survives your next card change without renaming anything.
Ten to fourteen top level groups is the sweet spot for personal spending. Small businesses need more, but should still stay under thirty leaves. Split a category only when you make a real decision at the sub level: Groceries versus Restaurants inside Food is a decision, Coffee versus Tea is not.
Starter category list, personal
- Housing: rent, mortgage, service charges, home maintenance
- Utilities: electricity, gas, water, broadband, mobile
- Groceries: supermarkets, food boxes, local markets
- Dining: restaurants, cafes, food delivery apps
- Transport: rideshare, fuel, transit, tolls, parking
- Health: insurance premiums, prescriptions, dentist, gym
- Subscriptions: streaming, software, memberships
- Shopping: clothing, electronics, household goods
- Entertainment: cinema, events, hobbies
- Travel: flights, hotels, holiday spending
- Fees: bank charges, interest, foreign exchange markups
- Income: salary, interest, refunds that are not returns
- Transfers: movements between your own accounts, nets to zero
- Uncategorized: the deliberate catch-all, kept on purpose
Starter category list, small business
- Revenue: customer payments, platform payouts
- Payroll and contractors
- Software and subscriptions
- Marketing and advertising
- Travel and client entertainment
- Office, equipment and supplies
- Cost of goods sold
- Professional fees: legal, accounting, filings
- Insurance
- Taxes and licenses
- Bank fees and interest
- Owner draws and internal transfers
If you file a US Schedule C, name the business leaves after the form's line items. If you file elsewhere, name them after the boxes on your own return. Any category tree that does not map to your filing will get remapped by hand in January, which is the worst possible month to do it.
Step 2: write rules, not tags
A rule has three fields: a match (contains, equals, or regex), a category, and a priority. Instead of labelling a row, you label a pattern. Any transaction whose description contains UBER, LYFT or BOLT is Transport. Write it once and every future transaction that matches lands in the right place with no intervention.
Three signals cover almost everything:
- Merchant or description keywords. The strongest signal by far. Match on the merchant string your bank writes into the description field, not on the cleaned display name.
- Amount ranges. Useful for a narrow set of splits, such as small Amazon purchases as Household and large ones as Equipment. Use sparingly.
- Account. A charge on the business card should default to a business category even when the merchant is ambiguous.
After a few months of this, 90 to 95 percent of transactions land correctly with zero clicks. The remaining rows are the genuine one-offs, which are exactly the rows worth your attention.
Rule ordering that survives merchant renames
Order rules from specific to general. STARBUCKS RESERVE ROASTERY sits above the generic STARBUCKS rule. AMAZON PRIME as Subscriptions sits above AMAZON as Shopping. HILTON sits above a generic HOTEL rule. When a merchant renames itself, add the new string to the existing rule rather than writing a fresh one, so the audit trail and the category history stay intact.
Use regex sparingly
Regex is powerful and dangerous. Reserve it for two cases: pulling an account number out of a memo field, and matching amounts that follow a fixed pattern such as payroll, rent or mortgage. For everything else, contains and equals are safer, faster and much easier to audit six months later.
Ignore the bank's transaction codes
Bank descriptions are padded with codes: POS, ACH, DDA, XFER, SEPA, BACS, EFTPOS. Do not write rules against them, because they describe the payment rail and not the merchant. A rule matching UBER EATS will happily catch POS DEBIT UBER EATS 8837 SAN FRANCISCO CA without you having to teach it what POS means. If a code is unfamiliar, the bank statement abbreviations guide decodes the full set.
Step 3: apply rules retroactively
A rule you add today should apply to every transaction on file, not just future ones. If it does not, you end up with two versions of history: pre-rule and post-rule. Any year over year comparison across that boundary is fiction. Karchu re-runs the full rule set over your whole history every time you save a rule, and records which rule fired on each row.
Step 4: handle the awkward cases
Transfers between your own accounts
Transfers are not income and not expenses. Left uncategorized they inflate both sides of your cash flow, which is the single most common reason a categorized statement shows spending that looks twice as high as reality. Create a Transfers category, write rules for the exact transfer strings your banks use, and exclude Transfers from spend totals. Karchu pairs the two legs automatically when both appear within a two day window.
Refunds and reversals
A refund belongs in the category of the original purchase, not in Income. Same for a chargeback or a partial reversal. When the refund lands in a later month, that category shows a negative amount for the month, which is correct. Categorizing refunds as income is the second most common way to make a P&L look wrong.
Split transactions
One supermarket charge that is half groceries and half a gift is a split. Splits are worth the effort only above a threshold you set yourself, typically anything material relative to the category total. Below that, pick the dominant category and move on. Chasing perfect splits on small charges is the fastest way to abandon the routine.
Foreign currency and card markups
A foreign purchase often lands as two rows: the converted amount and a separate foreign transaction fee. Categorize the purchase normally and send the fee to Fees, so the fee total tells you what your card is actually costing you in a year of travel. Keep the original currency and the converted amount side by side if your tool preserves both.
Personal spending on the business card, and the reverse
Reclassify the individual transaction and add a note. Do not adjust the rule to accommodate the exception, because the next hundred charges from that merchant genuinely do belong in the original category.
Cash withdrawals
An ATM withdrawal is not a category, it is a hole in your data. Either accept it as Cash and stop there, or, if cash is a large share of your spending, keep a simple manual note per withdrawal. Do not pretend a withdrawal is groceries.
Step 5: recurring detection
Recurring charges deserve their own workflow. A charge that hits monthly at roughly the same amount is a fingerprint, even when the merchant string changes slightly. Auto-detecting recurrence reveals two things at once: the total fixed drag on your cash flow, and the subscriptions you forgot you were paying for. Every Karchu account gets a recurring detector by default.
A worked example: one month, start to finish
Take a normal month with 82 transactions on one current account and one credit card.
- Import both statements. Karchu reconciles extracted totals against the printed opening and closing balances, so you know immediately whether a page is missing.
- Rules run. 74 rows land in a category. 8 sit in Uncategorized.
- Of those 8: three are the same new grocery delivery service (write one rule), two are a card reissue of an existing subscription (add the new string to the existing rule), one is a refund from last month (assign to the original category), one is an ATM withdrawal (Cash), and one is a genuine one-off gift (assign directly, no rule).
- Rules re-run retroactively. Uncategorized drops to zero, and the three grocery rows from the previous two months get categorized too.
- Check the transfer pairs net to zero, then read the category totals.
Elapsed time after the first month of setup: about five minutes. The rule list gained two entries and will keep working without further attention.
Troubleshooting a category tree that has gone wrong
- Uncategorized is above 10 percent. You are missing rules for your top recurring merchants. Sort Uncategorized by frequency, not by amount, and write rules top down.
- One category dominates everything. A general rule is sitting above a specific one. Check priority order before adding new categories.
- Totals look roughly double. Transfers are being counted as spend. Check the Transfers exclusion first, every time.
- Category creep. You added a leaf for every odd transaction and the tree is now unnavigable. Merge leaves quarterly and keep the count stable.
- The same merchant flips categories across months. Two rules match it. Merge them, do not add a third.
Where AI fits, and where it does not
The recurring question is why not simply ask a model to categorize everything. In demos that works. In practice it fails in ways you cannot audit: the same charge from the same merchant lands in different categories in different months, you cannot see why, and you cannot fix it without changing something invisible. For casual personal budgeting that might be acceptable. For business books, tax prep, or anything an accountant will sign off on, it is not.
Rules give the opposite guarantee: the same input always gives the same output, and you can read the rule that produced it. Models still earn their place at the edges, suggesting a category for a merchant nobody has seen before, or reading line items off a receipt image. The source of truth stays the rule list. There is a longer treatment of that trade-off in AI versus rule-based analysis.
Audit trail matters more than accuracy
The most useful property of a categorized statement is not the categories themselves but the record of how each category was assigned. Six months from now you will look at a row and wonder why it landed where it did. If your tool cannot show you which rule fired, when the rule was written, and what the raw description was, you cannot defend the number. Karchu stores all three on every categorized transaction.
Categorization is a compression job
The goal is not to label every transaction perfectly. It is to compress a year of spending into a story you can act on. If your top three categories cover 70 percent of your spend, you already have your answer. Chasing 100 percent categorization is a productivity trap. Leave the tail in Uncategorized and go make the decision the categorization was supposed to inform.
Frequently asked questions
- How many categories should a bank statement use?
- Ten to fourteen top level categories for personal spending, and up to thirty for a small business. Fewer than ten and everything collects in Other. More than thirty and you spend your review time deciding between near identical buckets instead of reading the numbers.
- Should categorization rules apply to old transactions?
- Yes. A rule you write today should re-run over every transaction already on file, otherwise your history splits into a pre-rule version and a post-rule version and year over year comparisons stop being valid. Karchu re-applies rules retroactively every time you save one.
- How do I categorize transfers between my own accounts?
- Give them a dedicated Transfers category and exclude that category from spending and income totals. If you leave transfers uncategorized or treat them as expenses, both sides of your cash flow inflate and your monthly spend looks roughly double what it really is.
- Is AI categorization better than rules?
- For auditability, no. A rule gives the same answer every month and you can read the rule that produced it. A model can label the same merchant differently in March and in July with no explanation. The practical setup is rules as the source of truth, with a model only suggesting a category for merchants you have never seen before.
- What should I do with a refund or a partial reversal?
- Put the refund in the same category as the original charge so the pair nets out. Never categorize refunds as income. If the refund arrives in a later month, expect that month to show a negative amount in that category, which is correct and is exactly what a reconciled ledger should look like.
- How long does monthly categorization take once rules exist?
- About five minutes per statement. You import the file, let the rules run, review only the Uncategorized bucket, and either accept the default or write one more rule. The initial rule list against a year of history takes about an hour.