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

Klaviyo·Software Engineer·Jul 2025
Online Assessmenthard

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.

Published

Curated and edited by PracHub

Practice the questions from this interview

Discussion

Sign in to join the discussion. The author is notified of every comment.

Loading comments…

Interview at a glance

Company
Klaviyo
Role
Software Engineer
Rounds
Online Assessment
Difficulty
hard
Interview date
Jul 2025
Questions from this interview
1 question

Real Klaviyo interview experiences

First-hand reports from Klaviyo candidates — the rounds, the questions they were asked, and how it went.

All 8 Klaviyo interview experiences