Plaid

Plaid Software Engineer Interview Questions

5+ questions from real Plaid Software Engineer interviews, reported by candidates.

5
Questions
1
Round Types
3
Topic Areas

Round Types

Phone 5

Top Topics

Questions

## Problem A bank has undergone several mergers. Each merger maps old account IDs to new ones. Given a list of mergers `[(old_id, new_id)]` applied in sequence and a query account ID, return the final canonical ID it resolves to. Mergers may chain: if A -> B and B -> C, then A ultimately resolves to C. ```python def resolve_bank_id( mergers: List[Tuple[str, str]], query_id: str ) -> str: ... def resolve_all( mergers: List[Tuple[str, str]], queries: List[str] ) -> List[str]: ... ``` **Example:** ``` mergers = [("ACC001", "ACC002"), ("ACC002", "ACC999"), ("ACC050", "ACC999")] resolve_bank_id(mergers, "ACC001") -> "ACC999" resolve_bank_id(mergers, "ACC050") -> "ACC999" resolve_bank_id(mergers, "ACC999") -> "ACC999" # no further mapping ``` ## Approach Model as a Union-Find (Disjoint Set Union) structure. Each `merge(old, new)` is a union operation with path compression. ## Follow-ups 1. How does path compression in Union-Find achieve near-O(1) amortized `find`? 2. What if a merger maps one new ID to multiple old IDs simultaneously? 3. How would you detect and handle circular mergers (A -> B -> A)? 4. How would you audit which original IDs all map to the same canonical ID?

## Problem Design a coupon application system for an e-commerce checkout. Coupons have types: `percent_off`, `fixed_off`, `buy_x_get_y_free`, and `category_discount`. Rules: - At most 2 coupons can be applied per order. - Coupons cannot reduce the price below $0. - Some coupons are exclusive (cannot stack with others). Implement: - `apply_coupons(order, coupon_codes) -> CheckoutResult` ```python class CouponSystem: def apply_coupons( self, order: dict, # {"items": [{"id", "category", "price", "qty"}]} coupon_codes: List[str] ) -> dict: # {"original": float, "discount": float, "final": float, "applied": List[str]} ... ``` **Example:** ``` order = {"items": [{"id":"i1","category":"electronics","price":200,"qty":1}]} coupons = ["SAVE10PCT", "TECH20"] # SAVE10PCT: 10% off entire order # TECH20: $20 off electronics category apply_coupons(order, coupons) -> {"original": 200, "discount": 40.0, "final": 160.0, "applied": ["SAVE10PCT","TECH20"]} ``` ## Follow-ups 1. How do you determine the optimal order to apply coupons to maximize the discount? 2. How do you enforce the exclusivity constraint when 3+ coupons are submitted? 3. How would you validate coupon expiry and single-use restrictions? 4. How do you handle a `buy_x_get_y_free` coupon across multiple cart items?

## Problem Group financial transactions by merchant, category, or date and compute aggregates for each group. ## Likely LeetCode equivalent No direct unambiguous LC equivalent. ## Tags hash_table, arrays, design

## Problem Given a loan principal `P`, annual interest rate `r` (as a decimal), and term in months `n`, compute the full amortization schedule - the breakdown of each monthly payment into principal and interest portions. ```python def amortization_schedule( principal: float, annual_rate: float, months: int ) -> List[dict]: # Returns list of {month, payment, principal_paid, interest_paid, remaining_balance} ... ``` **Example:** ``` P=10000, annual_rate=0.06, months=12 Monthly rate = 0.06/12 = 0.005 Monthly payment = P * r / (1 - (1+r)^-n) = 10000 * 0.005 / (1 - 1.005^-12) = 860.66 Month 1: interest = 10000 * 0.005 = 50.00 principal = 860.66 - 50.00 = 810.66 balance = 10000 - 810.66 = 9189.34 ... Month 12: balance rounds to 0.00 ``` ## Follow-ups 1. How do you handle rounding errors so the final balance is exactly $0.00? 2. Extend to support extra monthly payments that reduce the remaining principal. 3. How would you compute the total interest paid and the effective APR if fees are included? 4. Model a variable-rate loan where the interest rate changes every 12 months.

## Problem Settle debts or transactions among a group with minimum number of transfers, a classic graph debt-reduction problem. ## Likely LeetCode equivalent LC 465 - Optimal Account Balancing (>80% confident) ## Tags graph, backtracking, greedy

What Plaid Looks for in Software Engineer Interviews

Plaid Software Engineer interviews are calibrated against the level and scope expected of the role. Across 5+ verified candidate reports on LeakCode, the consistent signals interviewers look for: clear problem decomposition before coding, explicit complexity reasoning, structured handling of edge cases, and the ability to articulate trade-offs between two reasonable approaches.

The discriminator between candidates who advance and candidates who do not is rarely the final correctness of the solution. It is the path to the solution: did you ask clarifying questions, did you state your approach before coding, did you handle edge cases without prompting, and did you communicate your reasoning throughout. Reports tagged "no hire" frequently cite a working solution with poor communication; reports tagged "strong hire" cite clear thinking even when the final solution was incomplete.

How To Use This Question Set

Real interview reports are a calibration tool, not a memorization target. Companies update their question pools every 2-4 months; memorizing exact problems risks misleading you when the interviewer uses a variant. The high-leverage use: identify the patterns that appear repeatedly in Plaid Software Engineer reports, practice those patterns on similar (not identical) problems, and use the reports to understand the interviewer's typical follow-up depth.

Filter the questions below by round type, difficulty, and recency. Focus first on reports from the past 6-12 months; older reports may reference questions that have since rotated out of Plaid's pool. Reports tagged with quantified difficulty (e.g., "medium-hard") are higher-signal than reports without difficulty tags.

Round-by-Round Expectations

Plaid Software Engineer loops typically span 4-6 rounds across phone screens and on-site or virtual on-site interviews. The structure varies by company: some run 1 recruiter screen + 1 technical phone + 3-4 on-site rounds; others run 1 recruiter screen + 1 OA + 4-5 on-site rounds. The recruiter screen is logistics and culture-light; the technical phone screen is medium-difficulty coding; the on-site loop covers coding, system design (at L4+ levels), and behavioral rounds.

Each round is designed to surface a specific signal. Coding rounds: correctness, code quality, complexity reasoning, communication. System design rounds: requirements clarification, design judgment, operational thinking. Behavioral rounds: ownership scope, leadership, ambiguity tolerance, conflict navigation. Strong candidates explicitly hit each signal dimension out loud during the round; weak candidates focus only on solving the prompt.

Common Interview Mistakes At This Combination

Reports tagged "no hire" at Plaid Software Engineer commonly cite: jumping into code without clarifying requirements, coding silently for 10+ minutes without verbalizing approach, missing edge cases (empty input, single element, very large input, overflow), and producing a working solution that the candidate cannot explain or refactor when probed. Strong candidates avoid these patterns by following a consistent template: clarify, verbalize approach, code with narration, test with examples.

Behavioral and design rounds have their own failure modes. Behavioral: stories that use "we" instead of "I" diluting individual signal, stories with no quantified outcome, defensiveness when probed about failure. Design: not asking clarifying questions, not stating requirements out loud, designing for a single server when the prompt clearly implies scale, ignoring operational concerns (deployment, monitoring, rollback). These show up in roughly half of Plaid Software Engineer interview retrospectives on LeakCode.

See All 5 Plaid Software Engineer Questions

Full question text, answer context, and frequency data for subscribers.

Get Access