zoh .sh
private beta — invite only

Triage your transactions the moment they happen.

zoh pings you the second a charge posts to any of your accounts. Tap once to categorize, split, or note it — while you still remember what it was for. Then slice and dice everything in a fast, queryable table. No Sunday reconciliation ritual.

zoh.sh / transactions
merchant:trader_joes amount:>10 since last_month
Merchant
Category
Account
Date
Amount
Status
TJ Trader Joe's
Groceries
Chase ···4821
2 min ago
$12.40
live
An Anthropic
Software · work
Amex Plat
Today, 9:41
$248.03
posted
Uber Uber
Transport
Chase ···4821
Today, 8:12
$18.70
posted
AW AWS
Cloud · work
Amex Plat
Yesterday
$612.44
posted
WF Whole Foods Market
Groceries
Chase ···4821
Apr 18
$83.11
posted
Sp Spotify
Subscriptions
Amex Plat
Apr 18
$11.99
recurring
showing 6 of 1,284 ⌘K to query · J/K to navigate
Multi-provider by design Pluggable aggregators — one outage doesn't kill your feed
01 — The problem

Every finance app is a rear-view mirror.

It's Sunday. You open the app. Forty rows of SQ *MERCHANT 9823 and AMZN MKTP US*2K4B1 stare back. You try to remember what you bought on Tuesday afternoon. You can't. You tag half of them "Misc," close the tab, and tell yourself you'll do better next week.

The problem isn't willpower. The problem is latency. Aggregators were designed to batch-import once a day, show you a dashboard, and maybe send a weekly email. That loop was acceptable in 2013. Today your card posts in seconds, your memory fades in minutes, and a cryptic merchant string shows up three days later with no human context attached.

And then there's the other failure mode: one bank connection breaks, the whole picture goes stale, and you don't find out until the category totals look wrong. Single-provider plumbing is a single point of failure.

02 — Real-time triage

The right moment to label a transaction is when it happens.

Three moments, one loop. By the time you sit down on Sunday, there's nothing left to reconcile.

A — Instant

A push the second a charge posts.

Webhook from your bank → normalized merchant → your phone. Typical end-to-end: under 12 seconds. Pending charges too, where your bank supports them.

bank webhookzohyour phone
t = 0 11.4s total
B — One tap
from the lock screen

Triage without opening the app.

Categorize, split across people or tags, add a note, attach a photo of the receipt, flag as fraud — all from the notification. Never break flow.

Categorize → Groceries
Split → 50/50 with Sam
Note → "dinner w/ M."
Receipt → from Camera
Flag → not me
C — By Sunday
week of Apr 14

Your data is already clean.

No weekly ritual. No catch-up. Open the transactions view to explore — not to label.

MonTueWedThuFriSatSun
triaged 42 / 42
03 — Query & explore

A transactions view that actually queries.

Filter by merchant, category, amount, date, account, tag. Group by anything. Search normalized merchant names — not the bank's garbage strings. Save views. Export CSV, JSON, or hit the API.

category:dining_out account:amex_plat amount:>25 since:apr_1 + add filter
Tartine Bakery · 4 txns $142.88
Tartine Bakery · TARTINE SF 11
Dining out
Amex Plat
Apr 17
$34.20
posted
Tartine Bakery
Dining out
Amex Plat
Apr 12
$28.75
posted
Zuni Café · 1 txn $188.42
Zuni Café split with Sam
Dining out
Amex Plat
Apr 14
$188.42
posted
State Bird Provisions · 1 txn $216.00
State Bird Provisions · note: anniversary
Dining out
Amex Plat
Apr 9
$216.00
posted
Nopa · 2 txns $164.50
Nopa
Dining out
Amex Plat
Apr 5
$92.30
posted
Total · 4 merchants · 8 transactions
$711.80
Queryable
⌘K, everywhere.

A real query language. Filters compose. Saved views.

Normalized
Canonical merchants.

One "Trader Joe's" instead of twelve SQ *… variants.

Exportable
CSV. JSON. API.

Your data, portable. No lock-in, no premium tier.

Keyboard-first
J/K, /, E, G.

Navigate, filter, tag, group — without your mouse.

04 — How it works

Three moving parts. No ceremony.

step 01

Connect

Plaid, Teller, SimpleFIN, or Quiltt — whichever one holds up best for your bank. Or bring all four. If one provider flakes, the others keep the feed alive.

Plaid Teller SimpleFIN Quiltt
step 02

Normalize

Garbage merchant strings become canonical names with a category, a logo, and a location. "SQ *TJ HOLLYWD 9823" becomes "Trader Joe's · Hollywood."

SQ *TJ HOLLYWD 9823
Trader Joe's · Hollywood · Groceries
step 03

Triage + Explore

Push notifications close the loop at the moment of the charge. The transactions view gives you everything after — filtered, grouped, queried, exported.

live + queryable
05 — FAQ

The questions you're already asking.

Missing something? hey@zoh.sh

Is my data safe?

+

Bank credentials never touch our servers — they go directly from you to Plaid/Teller/etc. We only see read-only transaction data. Everything is AES-256 at rest, TLS 1.3 in transit, with SOC 2 Type II in progress. Two-person access control on production; full audit log.

Do you sell my data?

+

No. No anonymized aggregates sold to hedge funds, no "partner offers," no behavioral ads. The revenue model is a flat subscription. That's the entire story.

Which banks work?

+

If it connects to Plaid, Teller, SimpleFIN, or Quiltt — it works. That's virtually every US and Canadian bank, most UK and EU banks, and a long tail of credit unions via SimpleFIN's user-bridge model. You can connect the same account through multiple providers; we deduplicate.

What about transactions that post hours later?

+

We notify on post, always. We also notify on pending where your bank supports it — many do, via Plaid's pending feed or Teller's real-time webhooks. For the rest, the post-time notification still arrives within seconds of the bank marking it settled, usually well before you'd forget what it was.

Can I export everything?

+

Yes. CSV, JSON, or the read API — with your tags, splits, notes, and receipts attached. One click, no quota, no paid tier. If you leave, you walk out with everything.

Stop reconciling. Start triaging.

We're opening invites in small cohorts. Leave your email; we'll send a code when your slot comes up.