Skill: Log Expense
When to Use
- User sends an image that is clearly a receipt, invoice, order confirmation, or proof-of-payment
- User says "log this expense", "add to expenses", "budget this", "track this spend", "save this receipt"
- User forwards an emailed receipt (screenshot or attachment)
- User types an expense manually ("log $42 coffee, client meeting")
Do NOT auto-log without a proposal step. Expenses are financial records — always show the extracted data and wait for approval before writing. This is a Yellow tier action.
Prerequisites
Writes to a Notion database. The user must have configured in personal/notion-databases.md:
expenses_database_id: <user's Notion database ID>
expenses_data_source: collection://<data source id>
expenses_parent_page: <parent page id>
If the keys are missing, pause and guide the user through setup. Link to docs/SETUP.md section 9 (Notion Database Wiring).
Expected Notion Schema
| Property |
Type |
Notes |
| Name |
title |
Merchant + short descriptor (e.g. "Starbucks — meeting coffee") |
| Amount |
number |
Positive, in the currency's base unit (4.85, not 485) |
| Currency |
select |
USD, EUR, GBP, SGD, AUD, JPY, CAD, Other |
| Category |
select |
Food & Drink, Groceries, Transport, Travel, Accommodation, Software & SaaS, Entertainment, Health, Shopping, Utilities, Home, Business, Tax-Deductible, Gifts, Other |
| Merchant |
text |
Name as it appears on the receipt |
| Date |
date |
Transaction date (from the receipt, not today) |
| Payment Method |
select |
Card, Cash, Transfer, Other |
| Tax Deductible |
checkbox |
True for business-related or clearly deductible items |
| Business |
checkbox |
True if the expense is work/company-related vs personal |
| Notes |
text |
Any context (client name, project, line items if meaningful) |
Adapt to the user's actual property names if they differ — do not fail the save over naming differences.
Flow
Step 1 — Extract
Read the image (Claude vision handles receipts natively). Pull:
- Merchant — the store/business name at the top of the receipt.
- Amount — the total paid (not subtotal). Include tip if shown on the same receipt.
- Currency — infer from the symbol or merchant location. If ambiguous, ask.
- Date — transaction date from the receipt. If only a time is visible, use today and flag it.
- Payment method — from the footer if shown (last-4 card, CASH, etc.). Otherwise "Card" as default.
- Line items — if helpful, summarize in Notes (e.g. "2x latte, 1x croissant"). Don't list every item if the receipt is long.
Step 2 — Categorize
Assign a category from the list above. Use this heuristic:
| Pattern |
Category |
| Restaurants, cafes, takeout, bars |
Food & Drink |
| Supermarkets, farmers' markets |
Groceries |
| Uber, Lyft, taxi, subway, train, gas, parking |
Transport |
| Hotels, Airbnb |
Accommodation |
| Flights |
Travel |
| Software subscriptions, domains, hosting, SaaS |
Software & SaaS |
| Cinema, concerts, streaming |
Entertainment |
| Pharmacy, doctor, gym |
Health |
| Clothes, electronics, general retail |
Shopping |
| Electric, internet, phone bill |
Utilities |
| Furniture, IKEA, home repair |
Home |
| Client dinner, coworking, work travel, business tools |
Business + Tax-Deductible |
| Anything gift-like |
Gifts |
If the user has a pattern you've seen before (e.g. they always mark "Figma" as Business + Tax-Deductible), match that. Check MemPalace if uncertain.
Step 3 — Propose
Show the extracted entry back to the user as a compact proposal. No Notion write yet.
Expense extracted:
- Merchant: Starbucks
- Amount: $4.85 USD
- Category: Food & Drink
- Date: 2026-04-22
- Payment: Card (ending 4321)
- Notes: —
- Tax-deductible: No | Business: No
Save? (yes / edit / skip)
On Telegram, keep it even tighter — same facts, no decoration:
Starbucks, $4.85, Food & Drink, 2026-04-22. Save? yes/edit/skip
Step 4 — Handle the response
- yes / ok / save → write to Notion via
mcp__notion__notion-create-pages using the database from personal/notion-databases.md. Confirm with the saved entry + a one-line aggregate ("Week-to-date food spend: $47").
- edit / change X to Y → update the field, show the proposal again, re-prompt.
- skip / cancel / no → discard. Confirm in one line.
If the user only sends an image with no text, treat that as "propose this expense" by default. They can reply "skip" if it's not actually for logging.
Step 5 — Attach the receipt (optional)
If the Notion schema includes a Receipt files property and the user opted into filesystem access, attach the image file path to the created page. If not available or not configured, skip silently — the record is still useful without the attachment.
Rules
- Never write without a proposal. Yellow tier.
- If the image is not a receipt (e.g. photo of food, a whiteboard, a dog) fall back to normal Claude vision describe-the-image behavior. Do not force this skill.
- If the user says "log it" multiple times with no image, ask them to describe it or resend.
- Always use the currency on the receipt, not convert. The user can query in native currency later.
- Date parsing: prefer ISO 8601 (YYYY-MM-DD). If the receipt only shows a time, use today's date and flag it in Notes.
- Do not log tips as a separate line unless the receipt separates them. Total-paid is what matters.
Output Format (after save)
Logged to Expenses:
- [Name] — [Amount] [Currency], [Category], [Date]
[optional one-line context, e.g. "Month-to-date in [Category]: $XX"]
One-line confirmation. No emojis. No exclamation marks. No "Great!".
Related Skills
spending-summary — query and aggregate the Expenses database ("how much did I spend on food this month?", "what's my tax-deductible total for Q1?")
calendar-manager — for recurring expenses that are also calendar events (conferences, subscriptions with renewal dates)
1---2name: log-expense3description: Extract and log an expense from a receipt photo into the user's Notion Expenses database. Auto-proposes the extraction, waits for approval before writing. Use when the user sends a receipt photo, says "log this expense", "add to expenses", "budget this", "track this spend", "save this receipt", or when an image sent on Telegram is clearly a receipt, invoice, or order confirmation.4---56# Skill: Log Expense78## When to Use910- User sends an image that is clearly a receipt, invoice, order confirmation, or proof-of-payment11- User says "log this expense", "add to expenses", "budget this", "track this spend", "save this receipt"12- User forwards an emailed receipt (screenshot or attachment)13- User types an expense manually ("log $42 coffee, client meeting")1415**Do NOT auto-log without a proposal step.** Expenses are financial records — always show the extracted data and wait for approval before writing. This is a Yellow tier action.1617## Prerequisites1819Writes to a Notion database. The user must have configured in `personal/notion-databases.md`:2021```22expenses_database_id: <user's Notion database ID>23expenses_data_source: collection://<data source id>24expenses_parent_page: <parent page id>25```2627If the keys are missing, pause and guide the user through setup. Link to `docs/SETUP.md` section 9 (Notion Database Wiring).2829## Expected Notion Schema3031| Property | Type | Notes |32|----------|------|-------|33| Name | title | Merchant + short descriptor (e.g. "Starbucks — meeting coffee") |34| Amount | number | Positive, in the currency's base unit (4.85, not 485) |35| Currency | select | USD, EUR, GBP, SGD, AUD, JPY, CAD, Other |36| Category | select | Food & Drink, Groceries, Transport, Travel, Accommodation, Software & SaaS, Entertainment, Health, Shopping, Utilities, Home, Business, Tax-Deductible, Gifts, Other |37| Merchant | text | Name as it appears on the receipt |38| Date | date | Transaction date (from the receipt, not today) |39| Payment Method | select | Card, Cash, Transfer, Other |40| Tax Deductible | checkbox | True for business-related or clearly deductible items |41| Business | checkbox | True if the expense is work/company-related vs personal |42| Notes | text | Any context (client name, project, line items if meaningful) |4344Adapt to the user's actual property names if they differ — do not fail the save over naming differences.4546## Flow4748### Step 1 — Extract4950Read the image (Claude vision handles receipts natively). Pull:51521. **Merchant** — the store/business name at the top of the receipt.532. **Amount** — the total paid (not subtotal). Include tip if shown on the same receipt.543. **Currency** — infer from the symbol or merchant location. If ambiguous, ask.554. **Date** — transaction date from the receipt. If only a time is visible, use today and flag it.565. **Payment method** — from the footer if shown (last-4 card, CASH, etc.). Otherwise "Card" as default.576. **Line items** — if helpful, summarize in Notes (e.g. "2x latte, 1x croissant"). Don't list every item if the receipt is long.5859### Step 2 — Categorize6061Assign a category from the list above. Use this heuristic:6263| Pattern | Category |64|---|---|65| Restaurants, cafes, takeout, bars | Food & Drink |66| Supermarkets, farmers' markets | Groceries |67| Uber, Lyft, taxi, subway, train, gas, parking | Transport |68| Hotels, Airbnb | Accommodation |69| Flights | Travel |70| Software subscriptions, domains, hosting, SaaS | Software & SaaS |71| Cinema, concerts, streaming | Entertainment |72| Pharmacy, doctor, gym | Health |73| Clothes, electronics, general retail | Shopping |74| Electric, internet, phone bill | Utilities |75| Furniture, IKEA, home repair | Home |76| Client dinner, coworking, work travel, business tools | Business + Tax-Deductible |77| Anything gift-like | Gifts |7879If the user has a pattern you've seen before (e.g. they always mark "Figma" as Business + Tax-Deductible), match that. Check MemPalace if uncertain.8081### Step 3 — Propose8283Show the extracted entry back to the user as a compact proposal. No Notion write yet.8485```86Expense extracted:87- Merchant: Starbucks88- Amount: $4.85 USD89- Category: Food & Drink90- Date: 2026-04-2291- Payment: Card (ending 4321)92- Notes: —93- Tax-deductible: No | Business: No9495Save? (yes / edit / skip)96```9798On Telegram, keep it even tighter — same facts, no decoration:99100```101Starbucks, $4.85, Food & Drink, 2026-04-22. Save? yes/edit/skip102```103104### Step 4 — Handle the response105106- **yes / ok / save** → write to Notion via `mcp__notion__notion-create-pages` using the database from `personal/notion-databases.md`. Confirm with the saved entry + a one-line aggregate ("Week-to-date food spend: $47").107- **edit / change X to Y** → update the field, show the proposal again, re-prompt.108- **skip / cancel / no** → discard. Confirm in one line.109110If the user only sends an image with no text, treat that as "propose this expense" by default. They can reply "skip" if it's not actually for logging.111112### Step 5 — Attach the receipt (optional)113114If the Notion schema includes a `Receipt` files property and the user opted into filesystem access, attach the image file path to the created page. If not available or not configured, skip silently — the record is still useful without the attachment.115116## Rules117118- Never write without a proposal. Yellow tier.119- If the image is not a receipt (e.g. photo of food, a whiteboard, a dog) fall back to normal Claude vision describe-the-image behavior. Do not force this skill.120- If the user says "log it" multiple times with no image, ask them to describe it or resend.121- Always use the currency on the receipt, not convert. The user can query in native currency later.122- Date parsing: prefer ISO 8601 (YYYY-MM-DD). If the receipt only shows a time, use today's date and flag it in Notes.123- Do not log tips as a separate line unless the receipt separates them. Total-paid is what matters.124125## Output Format (after save)126127```128Logged to Expenses:129- [Name] — [Amount] [Currency], [Category], [Date]130[optional one-line context, e.g. "Month-to-date in [Category]: $XX"]131```132133One-line confirmation. No emojis. No exclamation marks. No "Great!".134135## Related Skills136137- `spending-summary` — query and aggregate the Expenses database ("how much did I spend on food this month?", "what's my tax-deductible total for Q1?")138- `calendar-manager` — for recurring expenses that are also calendar events (conferences, subscriptions with renewal dates)