Splitwise — Notes
Functional
- Add expense (payer + participants + split rule).
- Groups, friends, categories.
- Pair / group balances.
- Settle up (record payments, simplify debts).
- Receipts, comments, reminders.
- Multi-currency.
Non-functional
- Eventual consistency OK; offline-first.
- p99 add expense < 500 ms.
- Reliable balance correctness.
Capacity
- ~50M users, hundreds of millions of expenses.
- Per-user data is small (KB-MB).
Schema
users(id, name, email, default_ccy)
groups(id, name, members[])
expenses(id, group_id, payer_id, amount, ccy, ts, split_method, shares[])
journal(pair_a, pair_b, amount_ccy, expense_id)
Trade-offs
- Materialized pair balance vs on-the-fly sum: materialize for fast reads; recompute occasionally.
- Currency conversion uses snapshot at create, not display time.
- Concurrent edits: per-expense version + LWW; for groups, CRDT-ish merge.
Refs
- Splitwise engineering posts.
- "Building Splitwise" blog by founders.
- ByteByteGo "Design Splitwise".