Users receive hundreds of receipts (Amazon, Uber, food delivery). We need to automatically extract structured expense data and detect recurring subscriptions.
Acceptance Criteria
• Add Expense model to Prisma schema
• Create backend/src/services/actions/expense-extractor.service.ts
• Keyword filter first (“receipt”, “invoice”, “order confirmation”) — skip LLM for non-receipts
• Use OpenAI structured outputs for extraction: amount, currency, merchant, category, date, paymentMethod, items
• Regex fallback for simple cases ($XX.XX, €XX,XX)
• Normalize merchant names (“Uber Technologies Inc” → “Uber”)
• Detect recurring expenses (same merchant + similar amount + regular interval)
• Add expense summary to frontend EmailViewer sidebar
Technical Notes
• Must complete in <2s
• Handle multiple receipts in one email
• Currency conversion: store original + USD equivalent
• Must not call LLM for non-receipt emails (save costs)
Users receive hundreds of receipts (Amazon, Uber, food delivery). We need to automatically extract structured expense data and detect recurring subscriptions.
Acceptance Criteria
• Add Expense model to Prisma schema
• Create backend/src/services/actions/expense-extractor.service.ts
• Keyword filter first (“receipt”, “invoice”, “order confirmation”) — skip LLM for non-receipts
• Use OpenAI structured outputs for extraction: amount, currency, merchant, category, date, paymentMethod, items
• Regex fallback for simple cases ($XX.XX, €XX,XX)
• Normalize merchant names (“Uber Technologies Inc” → “Uber”)
• Detect recurring expenses (same merchant + similar amount + regular interval)
• Add expense summary to frontend EmailViewer sidebar
Technical Notes
• Must complete in <2s
• Handle multiple receipts in one email
• Currency conversion: store original + USD equivalent
• Must not call LLM for non-receipt emails (save costs)