Mint is a personal finance product that connects to its users’ external bank and credit-card accounts, imports their transactions into a single view, automatically categorizes them, and displays monthly budget progress. The core architectural challenge is that the most critical upstream data source—the bank—is outside our control, imposes rate limits, and responds slowly, forcing the system to deliver a real-time feel while operating mostly on cached, slightly-stale data.
The system's bottleneck is the bank, not our own compute infrastructure. We cannot solve a data freshness problem by scaling horizontally when the external dependency itself caps how often we may call it.
Out of scope (below the line)
~4 times per day, and the system never bursts into the bank on user logins.300 ms from the warm read path.500 ms, and first-time generation of one user's report completes in a few seconds.~50M registered users, ~10M daily active users, ~3 linked accounts per active user, and ~50 transactions per account per month.~100k QPS.99.95% availability for the user-facing read path, surviving the loss of one full region without manual data restore.| Quantity | Value | Why it matters |
|---|---|---|
| Registered users | ~50M | Stored linked accounts and budgets |
| Daily active users | ~10M | Drives read QPS and cache sizing |
| Linked accounts per active user | ~3 | Multiplies bank-side pull cost |
| Transactions per account per month | ~50 | Drives monthly write volume |
| Aggregate monthly inserts | ~1.5B | 10M * 3 * 50 into the ingest write path |
| Bank pulls per account per day | ~4 | Hard cap on aggregator calls |
| Aggregate aggregator pulls per day | ~120M | Must be smoothed across 24h |
| Steady-state aggregator call rate | ~1.4k/sec | What the rate limiter holds the line to |
| Peak read QPS | ~100k | History and budget view at peak hours |
| Monthly reports served per day | ~10M | Roughly one per daily active user |
[!IMPORTANT] The two load numbers that drive every later decision are
~1.4k/secof aggregator calls and~100kpeak read QPS. They differ by almost two orders of magnitude. That gap is why ingest and read serving must be designed as separate planes.