name: categorization
description: Danish merchant knowledge and transaction categorization rules. Reference this when classifying transactions into spending categories.
Categorization
Purpose
Provides Claude with Danish merchant knowledge and categorization rules for classifying bank transactions into spending categories.
Categories
15 Danish spending categories with subcategories:
| Category |
Subcategories |
Description |
| Bolig |
Husleje, El, Vand, Varme, Forsikring |
Housing costs |
| Dagligvarer |
Supermarked, Specialbutik |
Groceries |
| Transport |
Offentlig, Bil, Taxi, Cykel |
Transportation |
| Abonnementer |
Streaming, Fitness, Software, Telefon |
Subscriptions |
| Restauranter |
Restaurant, Café, Takeaway |
Dining out |
| Shopping |
Tøj, Elektronik, Bolig, Andet |
Shopping |
| Sundhed |
Apotek, Læge, Tandlæge |
Health |
| Underholdning |
Biograf, Koncert, Spil |
Entertainment |
| Rejser |
Fly, Hotel, Ferie |
Travel |
| Børn |
Daginstitution, Tøj, Legetøj |
Children |
| Personlig pleje |
Frisør, Kosmetik |
Personal care |
| Uddannelse |
Kurser, Bøger, Materialer |
Education |
| Opsparing |
Overførsler til opsparing |
Savings transfers |
| Indkomst |
Løn, Refusion |
Income |
| Andet |
Ukategoriseret |
Other / fallback |
Merchant Pattern Database
Map raw transaction text patterns to normalized merchant names and categories. Patterns use * as wildcard.
Dagligvarer (Groceries)
| Pattern |
Merchant |
Subcategory |
*NETTO* |
Netto |
Supermarked |
*FØTEX* or *FOETEX* |
Føtex |
Supermarked |
*REMA*1000* or *REMA1000* |
Rema 1000 |
Supermarked |
*IRMA* |
Irma |
Supermarked |
*LIDL* |
Lidl |
Supermarked |
*ALDI* |
Aldi |
Supermarked |
*BILKA* |
Bilka |
Supermarked |
*MENY* |
Meny |
Supermarked |
*SPAR* |
Spar |
Supermarked |
*FAKTA* |
Fakta |
Supermarked |
*COOP* |
Coop |
Supermarked |
*DAGLIG*BRUGSEN* or *DAGLI*BRUGSEN* |
Dagli'Brugsen |
Supermarked |
*SUPER*BRUGSEN* |
SuperBrugsen |
Supermarked |
*KVICKLY* |
Kvickly |
Supermarked |
Transport
| Pattern |
Merchant |
Subcategory |
*DSB* |
DSB |
Offentlig |
*REJSEKORT* |
Rejsekort |
Offentlig |
*MOVIA* |
Movia |
Offentlig |
*Q8* |
Q8 |
Bil |
*CIRCLE*K* |
Circle K |
Bil |
*SHELL* |
Shell |
Bil |
*OK BENZIN* or *OK PLUS* |
OK |
Bil |
*UBER* |
Uber |
Taxi |
*TAXA* or *DANTAXI* |
Taxa |
Taxi |
*DONKEY*REPUBLIC* |
Donkey Republic |
Cykel |
Abonnementer (Subscriptions)
| Pattern |
Merchant |
Subcategory |
*NETFLIX* |
Netflix |
Streaming |
*SPOTIFY* |
Spotify |
Streaming |
*DISNEY*PLUS* or *DISNEYPLUS* |
Disney+ |
Streaming |
*HBO* or *MAX*STREAMING* |
HBO Max |
Streaming |
*VIAPLAY* |
Viaplay |
Streaming |
*TV2*PLAY* or *TV 2 PLAY* |
TV2 Play |
Streaming |
*YOUTUBE*PREMIUM* or *GOOGLE*YOUTUBE* |
YouTube Premium |
Streaming |
*APPLE*MUSIC* |
Apple Music |
Streaming |
*FITNESS*WORLD* |
Fitness World |
Fitness |
*FITNESS*DK* |
Fitness DK |
Fitness |
*SATS* |
SATS |
Fitness |
*TDC* or *YOUSEE* |
TDC |
Telefon |
*TELENOR* |
Telenor |
Telefon |
*TELIA* |
Telia |
Telefon |
*ADOBE* |
Adobe CC |
Software |
*MICROSOFT*365* or *MICROSOFT*OFFICE* |
Microsoft 365 |
Software |
*ICLOUD* or *APPLE.COM/BILL* |
iCloud |
Software |
*DROPBOX* |
Dropbox |
Software |
Restauranter (Dining)
| Pattern |
Merchant |
Subcategory |
*WOLT* |
Wolt |
Takeaway |
*JUST*EAT* |
Just Eat |
Takeaway |
*TOO GOOD TO GO* or *TOOGOODTOGO* |
Too Good To Go |
Takeaway |
*STARBUCKS* |
Starbucks |
Café |
*JOE*THE*JUICE* or *JOE & THE JUICE* |
Joe & The Juice |
Café |
*LAGKAGEHUSET* |
Lagkagehuset |
Café |
*MCDONALDS* or *MC DONALDS* |
McDonald's |
Restaurant |
*BURGER*KING* |
Burger King |
Restaurant |
Shopping
| Pattern |
Merchant |
Subcategory |
*H&M* or *H M * or *HM * |
H&M |
Tøj |
*ZALANDO* |
Zalando |
Tøj |
*IKEA* |
IKEA |
Bolig |
*ELGIGANTEN* |
Elgiganten |
Elektronik |
*POWER* |
Power |
Elektronik |
*NORMAL* |
Normal |
Andet |
*FLYING*TIGER* |
Flying Tiger |
Andet |
*SØSTRENE*GRENE* or *SOSTRENE*GRENE* |
Søstrene Grene |
Andet |
*AMAZON* |
Amazon |
Andet |
*JYSK* |
Jysk |
Bolig |
Bolig (Housing)
| Pattern |
Merchant |
Subcategory |
*ØRSTED* or *OERSTED* |
Ørsted |
El |
*HOFOR* |
HOFOR |
Vand |
*TRYG* |
Tryg |
Forsikring |
*TOPDANMARK* |
Topdanmark |
Forsikring |
*ALKA* or *CODAN* |
Codan |
Forsikring |
*HUSLEJE* or *FAST OVERFØRSEL*HUSLEJE* |
Husleje |
Husleje |
*NORLYS* |
Norlys |
El |
*EWII* |
Ewii |
El |
Sundhed (Health)
| Pattern |
Merchant |
Subcategory |
*APOTEK* |
Apoteket |
Apotek |
*MATAS* |
Matas |
Apotek |
*TANDLÆGE* or *TANDLAEGE* |
Tandlæge |
Tandlæge |
*LÆGE* or *LAEGE* |
Læge |
Læge |
Underholdning (Entertainment)
| Pattern |
Merchant |
Subcategory |
*NORDISK*FILM* |
Nordisk Film |
Biograf |
*CINEMAXX* |
CinemaxX |
Biograf |
*TICKETMASTER* |
Ticketmaster |
Koncert |
*BILLETLUGEN* |
Billetlugen |
Koncert |
Rejser (Travel)
| Pattern |
Merchant |
Subcategory |
*SAS* or *SCANDINAVIAN*AIRLINES* |
SAS |
Fly |
*NORWEGIAN* |
Norwegian |
Fly |
*RYANAIR* |
Ryanair |
Fly |
*AIRBNB* |
Airbnb |
Hotel |
*HOTELS.COM* or *BOOKING.COM* |
Booking.com |
Hotel |
Personlig pleje
| Pattern |
Merchant |
Subcategory |
*SEPHORA* |
Sephora |
Kosmetik |
*FRISØR* or *FRISOER* or *CUTTERS* |
Frisør |
Frisør |
Uddannelse (Education)
| Pattern |
Merchant |
Subcategory |
*SAXO* |
Saxo |
Bøger |
*AMAZON*KINDLE* |
Amazon Kindle |
Bøger |
Normalization Rules
Before matching patterns, normalize the raw transaction text:
- Convert to uppercase for matching
- Replace Danish characters:
Ø → OE, Æ → AE, Å → AA (for pattern matching only — preserve originals in raw_text)
- Collapse multiple spaces into one
- Trim leading/trailing whitespace
Transaction Type Detection
Use the transaction description prefix to identify the payment method:
| Prefix Pattern |
Type |
Notes |
Dankort-køb |
Card payment (physical) |
Danish debit card |
Visa-køb |
Card payment (physical) |
Visa card |
Overførsel |
Bank transfer |
Internal or external |
Fast overførsel |
Standing order |
Recurring transfer |
PBS or Betalingsservice |
Direct debit |
Subscriptions and bills |
MobilePay |
Mobile payment |
Person-to-person or merchant |
Løn fra |
Salary |
Income — categorize as Indkomst |
Hævning |
ATM withdrawal |
Categorize as Andet |
Matching Order
When categorizing a transaction, check these sources in order — stop at the first match:
- learnings/categorization.md — Check for user corrections learned from previous sessions (confidence 1.0). These take precedence over all other rules.
- learnings/merchants.md — Check for merchant name aliases to normalize the raw text before pattern matching.
- merchant-overrides.csv — Check for a matching
raw_pattern (confidence 1.0). These are learned from previous user corrections within the same session.
- Static pattern database — Check the merchant pattern tables above (confidence 1.0 exact / 0.8 partial).
- Intelligent classification — No pattern match, but Claude can infer category from transaction context (confidence 0.5–0.7).
- Fallback — Cannot determine category — assign to "Andet" (confidence 0.0).
Confidence Scoring
Assign a confidence score to each categorization:
| Match Type |
Confidence |
Description |
| Merchant override match |
1.0 |
Transaction text matches a learned override in merchant-overrides.csv |
| Exact pattern match |
1.0 |
Transaction text matches a known merchant pattern |
| Partial pattern match |
0.8 |
Part of the text matches a known pattern |
| Intelligent classification |
0.5–0.7 |
No pattern match, but Claude can infer from context |
| Unknown |
0.0 |
Cannot determine category — assign to Andet |
When manual_override is TRUE for a transaction, always use the user's category regardless of what patterns suggest.
Learning from Corrections
When a user manually corrects a transaction's category, the correction should be saved to learnings/categorization.md so future sessions automatically apply the learned rule.
How to record a categorization learning:
- Open
learnings/categorization.md
- Append a new row to the Learnings table with:
- Date: Today's date (YYYY-MM-DD)
- Pattern: The normalized raw text pattern to match (uppercase, wildcards allowed)
- Merchant: The normalized merchant name
- Category: The user-corrected category
- Subcategory: The user-corrected subcategory
- Context: Brief note about why this correction was made
Example learning entry:
| 2026-01-15 | *NETFLIX* | Netflix | Underholdning | Streaming | User: "Netflix er underholdning, ikke abonnement" |
Also update merchant-overrides.csv for the current session:
- Take the corrected transaction's
raw_text from transactions.csv
- Normalize it: uppercase, trim whitespace, collapse multiple spaces
- Use this as the
raw_pattern
- Use the user-corrected
merchant, category, and subcategory from categorized.csv
- Set
created_at to the current timestamp
- Only append if no row with the same
raw_pattern already exists
Ambiguous Merchants
- Netto: Always
Dagligvarer, even though they sell non-grocery items
- 7-Eleven:
Dagligvarer (most purchases are food/drink)
- Amazon: Default to
Shopping unless description contains "Prime" or "Kindle" (then Abonnementer or Uddannelse)
- Normal:
Shopping → Andet (sells mixed categories)
- Matas:
Sundhed → Apotek (primarily health/beauty)
- Wolt:
Restauranter → Takeaway unless the Wolt+ subscription charge (then Abonnementer)
Examples
Example 1: Clear Match
raw_text: "NETTO FO 1234 KØBENHAVN"
normalized: "NETTO FO 1234 KOEBENHAVN"
pattern match: *NETTO* → Netto
result: category=Dagligvarer, subcategory=Supermarked, merchant=Netto, confidence=1.0
Example 2: PBS Subscription
raw_text: "PBS FITNESS WORLD"
normalized: "PBS FITNESS WORLD"
pattern match: *FITNESS*WORLD* → Fitness World
result: category=Abonnementer, subcategory=Fitness, merchant=Fitness World, confidence=1.0, is_recurring=TRUE
Example 3: Intelligent Classification
raw_text: "RESTAURANT COFOCO KBH"
normalized: "RESTAURANT COFOCO KBH"
no pattern match — but "RESTAURANT" prefix suggests dining
result: category=Restauranter, subcategory=Restaurant, merchant=Cofoco, confidence=0.6
Example 4: Income
raw_text: "Løn fra Arbejdsgiver ApS"
prefix match: "Løn fra" → salary
result: category=Indkomst, subcategory=Løn, merchant=Arbejdsgiver ApS, confidence=1.0