Expense Categorizer Skill
Auto-categorize expenses from receipts using ML/rule-based categorization with learning from user corrections.
Features
- Smart Categorization: Rule-based and ML-inspired categorization using merchant names, keywords, and receipt content
- Custom Categories: Define your own expense categories beyond the defaults
- Learning System: Improves accuracy by learning from user corrections
- Bulk Categorization: Process multiple receipts at once
- Confidence Scoring: Each categorization includes a confidence score
- Merchant Mapping: Automatic merchant-to-category mapping based on history
Installation
cd skills/expense-categorizer
npm install
npm run build
Usage
CLI
# Check status
npm run cli -- status
# Categorize a single receipt
npm run cli -- categorize 1
# Categorize all uncategorized receipts
npm run cli -- bulk
# Suggest category for a receipt (dry run)
npm run cli -- suggest 1
# Apply a correction (teaches the system)
npm run cli -- correct 1 --category "Office Supplies"
# Manage categories
npm run cli -- categories
npm run cli -- add-category "Professional Development" --keywords "course,training,certification,conference"
# View merchant mappings
npm run cli -- merchants
npm run cli -- map-merchant "Starbucks" --category "Dining"
# Statistics
npm run cli -- stats
npm run cli -- accuracy
Library
import { ExpenseCategorizerSkill } from '@openclaw/expense-categorizer';
const skill = new ExpenseCategorizerSkill();
// Categorize a single receipt
const result = await skill.categorizeReceipt(1);
console.log(result.category); // "Dining"
console.log(result.confidence); // 0.92
// Bulk categorize all uncategorized receipts
const results = await skill.bulkCategorize();
// Suggest category without applying
const suggestion = await skill.suggestCategory(1);
// Apply correction to teach the system
await skill.applyCorrection(1, 'Office Supplies');
// Manage custom categories
await skill.addCategory({
name: 'Professional Development',
keywords: ['course', 'training', 'certification'],
parentCategory: 'Business'
});
// Get merchant mappings
const mappings = await skill.getMerchantMappings();
// Manually map a merchant
await skill.mapMerchant('Starbucks', 'Dining');
// Get categorization statistics
const stats = await skill.getStats();
await skill.close();
Default Categories
- Groceries: Supermarkets, food stores
- Dining: Restaurants, cafes, fast food
- Gas: Fuel stations, car services
- Pharmacy: Drugstores, medical supplies
- Office: Office supplies, stationery
- Electronics: Tech stores, gadgets
- Transportation: Rideshare, transit, parking
- Entertainment: Movies, games, events
- Retail: General shopping
- Utilities: Electricity, gas, water, internet
- Travel: Hotels, flights, car rentals
- Healthcare: Medical, dental, vision
How It Works
- Rule-Based Matching: First checks merchant name against known mappings
- Keyword Analysis: Analyzes receipt content for category keywords
- Line Item Analysis: Considers purchased items for categorization
- Learning: When you correct a category, the system learns for future receipts
Data Storage
Data is stored in ~/.openclaw/skills/expense-categorizer/:
categorizer.db - SQLite database with categories, mappings, and learning data
Confidence Levels
- High (80-100%): Strong merchant match or multiple keyword matches
- Medium (50-79%): Partial keyword matches or similar merchant
- Low (<50%): No clear match - manual review recommended
1---2name: expense-categorizer3description: Auto-categorize expenses from receipts with learning from corrections4---56# Expense Categorizer Skill78Auto-categorize expenses from receipts using ML/rule-based categorization with learning from user corrections.910## Features1112- **Smart Categorization**: Rule-based and ML-inspired categorization using merchant names, keywords, and receipt content13- **Custom Categories**: Define your own expense categories beyond the defaults14- **Learning System**: Improves accuracy by learning from user corrections15- **Bulk Categorization**: Process multiple receipts at once16- **Confidence Scoring**: Each categorization includes a confidence score17- **Merchant Mapping**: Automatic merchant-to-category mapping based on history1819## Installation2021```bash22cd skills/expense-categorizer23npm install24npm run build25```2627## Usage2829### CLI3031```bash32# Check status33npm run cli -- status3435# Categorize a single receipt36npm run cli -- categorize 13738# Categorize all uncategorized receipts39npm run cli -- bulk4041# Suggest category for a receipt (dry run)42npm run cli -- suggest 14344# Apply a correction (teaches the system)45npm run cli -- correct 1 --category "Office Supplies"4647# Manage categories48npm run cli -- categories49npm run cli -- add-category "Professional Development" --keywords "course,training,certification,conference"5051# View merchant mappings52npm run cli -- merchants53npm run cli -- map-merchant "Starbucks" --category "Dining"5455# Statistics56npm run cli -- stats57npm run cli -- accuracy58```5960### Library6162```typescript63import { ExpenseCategorizerSkill } from '@openclaw/expense-categorizer';6465const skill = new ExpenseCategorizerSkill();6667// Categorize a single receipt68const result = await skill.categorizeReceipt(1);69console.log(result.category); // "Dining"70console.log(result.confidence); // 0.927172// Bulk categorize all uncategorized receipts73const results = await skill.bulkCategorize();7475// Suggest category without applying76const suggestion = await skill.suggestCategory(1);7778// Apply correction to teach the system79await skill.applyCorrection(1, 'Office Supplies');8081// Manage custom categories82await skill.addCategory({83 name: 'Professional Development',84 keywords: ['course', 'training', 'certification'],85 parentCategory: 'Business'86});8788// Get merchant mappings89const mappings = await skill.getMerchantMappings();9091// Manually map a merchant92await skill.mapMerchant('Starbucks', 'Dining');9394// Get categorization statistics95const stats = await skill.getStats();9697await skill.close();98```99100## Default Categories101102- **Groceries**: Supermarkets, food stores103- **Dining**: Restaurants, cafes, fast food104- **Gas**: Fuel stations, car services105- **Pharmacy**: Drugstores, medical supplies106- **Office**: Office supplies, stationery107- **Electronics**: Tech stores, gadgets108- **Transportation**: Rideshare, transit, parking109- **Entertainment**: Movies, games, events110- **Retail**: General shopping111- **Utilities**: Electricity, gas, water, internet112- **Travel**: Hotels, flights, car rentals113- **Healthcare**: Medical, dental, vision114115## How It Works1161171. **Rule-Based Matching**: First checks merchant name against known mappings1182. **Keyword Analysis**: Analyzes receipt content for category keywords1193. **Line Item Analysis**: Considers purchased items for categorization1204. **Learning**: When you correct a category, the system learns for future receipts121122## Data Storage123124Data is stored in `~/.openclaw/skills/expense-categorizer/`:125- `categorizer.db` - SQLite database with categories, mappings, and learning data126127## Confidence Levels128129- **High (80-100%)**: Strong merchant match or multiple keyword matches130- **Medium (50-79%)**: Partial keyword matches or similar merchant131- **Low (<50%)**: No clear match - manual review recommended