Ledger
Every bank transaction pings you on WhatsApp within minutes, already categorized — and you reply in plain English to fix it.
Why I built it
Existing finance tools do three things badly. They tell you nothing in real time — you have to remember to open an app. Editing a transaction means tapping through menus. And their auto-categorization is a coin flip that never learns. I wanted money to feel like a conversation: a message the second something posts, and a plain-English reply to fix it.
What it does
- A WhatsApp message on every posted transaction, category already applied — no app to open
- Reply in free text to recategorize, split, note, exclude, or attach a receipt; an LLM parses the intent, including combined actions like “travel and split half”
- Three-tier categorization (Plaid → learned rules → LLM) with transfer and refund pairing that learns from your corrections
- A web dashboard: period-aware spend / income / net-flow, live net worth, top merchants, 12-month trends, and a filterable transaction list
- Realtime dashboard updates, and a per-transaction detail view with a split editor and the full WhatsApp conversation log
How it works
Two webhooks drive everything — Plaid for bank data, Twilio for WhatsApp replies. Each stores the raw payload, returns 200 immediately, and hands the real work to an HTTP job queue. From there every step — sync, categorize, pair transfers, notify, parse a reply — is its own idempotent, signature-verified worker with retries. The app is Next.js on Vercel; Supabase provides Postgres with row-level security, auth, realtime, and encrypted storage for Plaid tokens.
The web dashboard
- Rent$1,100.00
- Groceries$412.30
- Eating Out$296.40
- Travel$255.67
- Subscriptions$184.00
- Other$170.00
- posted
- Apr 23
- category source
- AI · 92%
- last WhatsApp ping
- 2h ago · $84.20
The hard part
Every external event — a bank webhook, a WhatsApp reply — had to be acknowledged in under two seconds, survive being delivered twice, and never double-apply a change. So nothing runs inline: webhooks just enqueue, and each worker is idempotent and signature-verified with its own retry policy. The fiddliest bit was the pending→posted transition — re-notifying only when the amount moved more than 5% or the category changed, so you're not spammed for every pending charge that settles.
Status
Live at ledger.mananvyas.com, public repo, running on free / hobby tiers (~$3–10/mo, mostly Twilio). Built solo, then grew multi-user with per-user WhatsApp routing and QR-code pairing.