cswork / libraryOpen practice workspace

Interview experiences · Klaviyo

Klaviyo Software Engineer Interview Experience — No-Camera OA, Passed 3 of 4 on a Banking System Design Problem

OAInterviewed 2025-07

No need to turn the camera on. Out of four questions, all subtasks passed on three of them. I was just using it as practice — I didn't use AI, wrote all three questions myself. Level 1 and 2 were fairly simple. Design Banking System Level 3: Schedule Payments transfer(timestamp, source_account_id, target_account_id, amount) -> str|None At timestamp, deduct amount from source_account_id and freeze…

No need to turn the camera on. Out of four questions, all subtasks passed on three of them.

I was just using it as practice — I didn't use AI, wrote all three questions myself. Level 1 and 2 were fairly simple.

Design Banking System

Level 3: Schedule Payments

  • transfer(timestamp, source_account_id, target_account_id, amount) -> str|None

    1. At timestamp, deduct amount from source_account_id and freeze it temporarily until the target account accepts, or the transfer expires (auto-returned after 24h).
    2. If source_account_id and target_account_id are the same, either account doesn't exist, or the balance is insufficient, return None immediately.
    3. A valid transfer returns a unique ID, like "transfer1", "transfer2".
    4. Frozen funds count toward both accounts' "unsettled" transaction totals, and are only recorded into both sides' transaction histories once accepted.
  • accept_transfer(timestamp, account_id, transfer_id) -> bool

    1. At timestamp, accept a previously initiated transfer:
      • Return True if and only if transfer_id exists, hasn't expired, hasn't already been accepted, and account_id is exactly the target account of that transfer.
      • Otherwise return False (including cases where the transfer doesn't exist, has expired, has already been accepted, or the receiver doesn't match).

Level 4: Account Merging and History Lookback

  • merge_accounts(timestamp, account_id_1, account_id_2) -> bool

    1. At timestamp, merge account_id_2 into account_id_1:
      • If the two IDs are the same, or either doesn't exist, return False.
      • Cancel (i.e. expire) all pending outgoing transfers from account_id_2; also cancel all pending transfers from account_id_1 to account_id_2.
      • Redirect all other transfers destined for account_id_2 to account_id_1.
      • account_id_1's balance increases by account_id_2's balance; transaction totals accumulate the history of both.
      • Finally, delete account_id_2 from the system and return True.
  • get_balance(timestamp, account_id, time_at) -> int|None

    1. Query account_id's balance right after time_at (including whatever operation had just finished processing at that moment):
      • If account_id hadn't been created yet, or had already been deleted, at time_at, return None.
      • Otherwise return the correct historical balance value.

Comments

Nothing here yet.

Join in on CSWork →