Skip to content

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".