Expenso ingests my bank alert emails, classifies every transaction, flags anomalies, and answers plain-English questions about my spending — automated end to end with a nightly job. Eliminated about 3 hours a week of manual finance tracking.
Screenshots from the live app — annual and monthly overviews, the daily spend trend, and the transactions feed with low-confidence flagging.
Expenso connects to Gmail via OAuth2, pulls bank alert emails incrementally, and regex-parses each one into a structured transaction — amount, date, direction, merchant, UPI reference. Only confirmed successful transactions are kept; failed or attempted ones are discarded. The whole thing is built to be re-run safely: every insert is idempotent, so a missed night just catches up automatically the next run, with zero duplicate or lost data across 6+ months of daily runs.
Every transaction moves through three tiers before it's filed:
Substring match against 74+ known merchant patterns. Instant, full confidence.
Unmatched merchants go to Claude Haiku, which returns a confidence score. Anything ≥0.9 is auto-promoted into a new rule for next time.
Anything still wrong gets corrected inline — and that correction is learned as a rule too, so the system never makes the same mistake twice.
A natural-language query interface translates plain-English questions into SQL via Claude Haiku, runs them against PostgreSQL, and returns a formatted answer — including multi-step analytical queries using CTEs. Every generated query is validated before it runs: SELECT/WITH only, no DDL, capped at 50 rows, 8-second timeout.
Immutability — raw emails are never modified; every transaction is re-derivable from source. Idempotency — every insert uses ON CONFLICT logic, so re-running any phase is always safe. Self-healing — incremental ingestion means the pipeline recovers from a missed night without intervention. A macOS launchd job runs the full cycle every night at 00:01, with a staleness check that notifies me if ingestion stalls for 3+ days.