WonderMoney
Personal finance for Europe, unified.
Europeans keep their money in more places than any single app is built to see: a checking account with one bank, savings with another, a broker for investments, and a spreadsheet stitching it together by hand. WonderMoney connects to all of it over Open Banking and shows one real picture: net worth, budgets, and investments together, kept accurate automatically.
Visit WonderMoney
~1,000
automated tests
91.7%
test coverage on our Open Banking rewrite
5 + 4
banks and brokers with manual import
Stack
App
Backend
Under the hood
The engineering worth talking about.
We didn't just integrate Open Banking: we own its reliability
WonderMoney's original Open Banking client was a fork of GoCardless's official SDK. In April 2025, GoCardless deprecated it. Rather than keep depending on dead code, we rewrote it from scratch: auto-refreshing tokens deduplicated through a shared promise so concurrent requests don't trigger a refresh storm, a real dual-bucket rate limiter that reads both of the API's separate rate-limit header families and backs off accordingly, and OpenAPI-generated types so the client can't silently drift from the real API. Along the way we found and fixed a genuine concurrency bug: a circular-promise deadlock in token refresh that only showed up under 401 conditions. The rewrite ships with 91.7% test coverage.
Categorization that gets cheaper the more it's used
Every bank transaction needs a category, and running every one through an LLM is slow and expensive at scale. We built a three-tier cascade instead: deterministic merchant-text rules catch the obvious cases first; a recency-weighted vote over the user's own past corrections catches the rest, weighted so a fresh correction outweighs a pile of stale ones, and deliberately scoped to only the requesting user, never a household member, to avoid a subtle privacy leak; only what's left goes to an LLM, gated by a budget tracker and idempotency guards so a retry can never double-charge or double-suggest. PII like IBANs and payment references is filtered out before it's ever used as a matching key.
Portfolio values you can actually trust
Instead of a running balance that can silently drift out of sync, portfolio valuation is fully event-sourced: every buy, sell, and stock split since account inception gets replayed to reconstruct the position, with FIFO cost-basis lots tracked in memory and point-in-time price and FX rates joined in as-of the target date. It's deliberately non-incremental: a documented tradeoff of recompute cost for correctness and idempotency. Snapshots store both native-currency and display-currency values side by side, and the debt-payoff engine works the same way: real amortization math with avalanche vs. snowball comparisons, credit balances reconstructed by replaying adjustment events rather than mutating a stored total.
Live in production, connected to European banks over Open Banking through GoCardless and Nordigen, with manual CSV import covering 5 additional banks and 4 brokerage formats for accounts outside live Open Banking coverage.