Back to blog
· 12 min read

How to categorize a bank statement (that actually stays clean)

A playbook for categorizing bank transactions: taxonomy design, rule ordering, retroactive edits, and audit trails that survive real spending.

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 routine we recommend to anyone who wants a categorized statement they can actually trust six months from now.

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 it survives your next credit card change without renaming everything. Ten to fourteen top-level groups is the sweet spot for personal spending. Small businesses need more, but should still stay under thirty leaves.

We ship a default taxonomy with Karchu that covers Housing, Utilities, Groceries, Dining, Transport, Health, Personal, Subscriptions, Entertainment, Shopping, Travel, Fees, Income, Transfers, and a catch-all Uncategorized. Every account, personal or business, starts here. You add or split leaves as your rules mature.

Rules, not one-off tagging

The single biggest categorization mistake is tagging individual transactions. It does not scale. Every reissued card, every merchant rebrand, every new subscription costs you another manual click. The alternative is to write rules on the string patterns you see, and let the rules apply forward and backward.

A rule is three fields: a match (contains, equals, or regex), a category, and a priority. Priority matters because the same string can match multiple rules. Coffee purchases at a hotel should probably land under Travel, not Dining, so the Travel rule wins by being higher priority.

Rule ordering that survives merchant renames

Order rules from specific to general. A rule for STARBUCKS RESERVE ROASTERY should sit above the generic STARBUCKS rule. When a merchant renames itself, add the new string to the same rule instead of writing a fresh one. This keeps the audit trail intact and the category history stable.

Regex sparingly

Regex is powerful and dangerous. Reserve it for two cases: matching an account number in a memo field, and pulling out amounts that follow a fixed pattern (payroll, rent, mortgages). For everything else, contains and equals are safer and easier to audit.

Retroactive by default

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. Every serious categorization tool applies rules retroactively; Karchu does this every time you save a rule.

Handle transfers and internal moves

Transfers between your own accounts are not income and not expenses. If you leave them uncategorized they inflate both sides of your cash flow. Create a dedicated Transfers category, write rules for the exact transfer strings your banks use, and exclude Transfers from your monthly spend totals. Karchu does this by default when both sides of a transfer appear within a two-day window.

Recurring detection

Recurring charges deserve their own workflow. A subscription that hits monthly at roughly the same amount is a fingerprint. Auto-detecting recurrence reveals two things: the total drag on your cash flow, and the subscriptions you forgot you were paying for. Every Karchu account gets a recurring detector out of the box.

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 are done. Chasing 100 percent categorization is a productivity trap; leave the last few percent in Uncategorized and move on.

Audit trail matters more than accuracy

The single most useful feature of a categorized statement is not the categories themselves but the history of how those categories were assigned. Six months from now you will look at a transaction and wonder why it landed where it did. If your tool cannot show you which rule fired and when it was written, you cannot trust the outcome. Karchu records the rule ID, the timestamp, and the raw description on every categorization.

What to do on statement day

A tight monthly routine takes fifteen minutes. Upload the statement, let the rules run, review only the Uncategorized bucket, and either add a rule or accept the default. Do not tag individually. Do not rename categories. Do not restructure the tree unless a real gap has opened up. Consistency beats perfection.

Related reading

Try Karchu on your own statement

Free 30-day trial. Upload a CSV, Excel, or PDF statement and see categorized transactions in under two minutes.

Start free →