Assessment tips
- Confirm the current Stripe pattern from the drive mail before practising old papers
- Finish one problem or section fully before starting the next
- Revise the fundamentals listed in the round table on this page
These notes walk through how Stripe’s engineering loop actually plays out round by round, based on the process Stripe itself documents publicly and patterns candidates consistently report, especially around the debugging round.
| Round | Duration | What it tests |
|---|---|---|
| Recruiter Screen | ~30 min | Background, motivation, role fit, logistics |
| Technical Screen | 45-60 min | Live coding - one scenario-driven, multi-part problem |
| Onsite: General Coding | 45-60 min | Production-quality code against a realistic prompt |
| Onsite: Debugging (“Bug Bash”) | 45-60 min | Diagnosing and fixing a bug in an unfamiliar codebase |
| Onsite: Integration | 45-60 min | Building a feature against a provided API/SDK, docs open |
| Onsite: System Design | 45-60 min | Scalable systems, trade-offs (mid-level and above) |
| Onsite: Behavioral | 45 min | Stripe’s operating principles - ownership, urgency, collaboration |
Profile: 3 years’ experience at a mid-size SaaS company, applied off-campus after a referral from a former colleague now at Stripe.
Recruiter screen
Technical screen
Onsite: general coding
Onsite: Bug Bash
Onsite: integration
Onsite: system design
Onsite: behavioral
Result: Selected
Takeaways
Profile: Final-year student, strong DSA background from placement prep, applied through Stripe’s new-grad posting.
What differed from the standard loop
Where the candidate struggled
Result: Rejected after the onsite, with feedback centered on debugging approach rather than raw coding ability.
Takeaways
Profile: Mid-level backend candidate; public DEV Community recap of a full Stripe VO.
Round 1 - Coding: Account-balance settlement style problem - straightforward logic but interviewers pressed edge completeness and stable handling of negative balances or partial settlements.
Round 2 - Hiring manager: Deep project walkthrough, technology choices, ownership, and conflict stories - less algorithms, more communication and maturity.
Round 3 - API integration: Build against provided docs with pagination and failure handling; open-book environment similar to production integration work.
Round 4 - Debug: Unfamiliar codebase (candidate reported Mako-templated service); failing test required tracing template rendering and validation gaps, not guessing from skim-reading.
Round 5 - System design: Ledger service with double-entry accounting, idempotency, concurrency control, audit trail, and duplicate-submission prevention - interviewers pushed past generic “load balancer + cache” answers into financial rigor.
Result: Selected (per public account) Takeaway: Stripe system design rewards ledger and idempotency depth; template-layer debugging shows up, not only Java/Go services.
Profile: Engineer with strong LeetCode prep but limited production debugging practice.
Technical screen: Multi-part CSV / record parsing with cross-field validation - significant time spent clarifying rules before coding.
Onsite coding: Extended an order model for partial fulfillment; follow-up changed constraints mid-round.
Bug Squash: Validation bug causing silent failures - candidate lost time trying to spot issue by inspection instead of running tests and adding logging first (feedback theme matches Experience 2).
Integration: Mock REST client with flaky rate limits; interviewer weighted Retry-After, checkpointing pagination, and idempotent retries.
Behavioral: Mapped directly to operating principles - user advocacy and scope cuts under deadline.
Result: Rejected; feedback cited debugging process and integration error handling Takeaway: Schedule deliberate unfamiliar-repo debugging sessions weekly; treat integration like on-call work, not a single happy-path script.
After the technical rounds, Stripe closes with a behavioral round scored against its operating principles - closer to a values interview than a generic HR chat. Prepare those answers on the dedicated page rather than cramming them into this hub.
Use these as frames, not scripts - interviewers probe follow-ups.
Q. Implement a rate limiter for an API. Which algorithm would you pick?
A. Token bucket is the usual answer: each key holds a token count and a last-refill timestamp, tokens accrue at a fixed rate up to a burst capacity, and a request is allowed only if it can take a token. It permits short bursts while bounding the long-run rate, and it stores just two numbers per key. A fixed window counter is simpler but allows twice the limit across a window boundary; a sliding window log is exact but stores a timestamp per request. In a distributed setting, keep the counter in Redis and do the check-and-decrement in a single Lua script so the read and write are atomic, and fail open or closed deliberately when Redis is unreachable.
Q. What is idempotency, and how would you make a payment endpoint idempotent?
A. An idempotent operation produces the same result whether it is applied once or many times, which matters because a client that times out cannot tell whether the charge went through. The standard design is an Idempotency-Key header: on the first request you insert the key into a uniquely indexed table inside the same transaction as the charge, and store the response. A retry with the same key hits the unique constraint, so you return the stored response instead of charging again. Keys must be scoped per account and expire after a fixed window, and a request that arrives while the first is still in flight should get a 409 rather than a second attempt - that concurrent case is the part candidates usually miss.
Q. How would you handle webhook delivery reliably, on both the sending and receiving side?
A. As the sender, write the event to a durable queue in the same transaction that changed the state, then deliver asynchronously with exponential backoff plus jitter, retrying for hours or days and parking permanent failures on a dead-letter queue for manual replay. Sign each payload with an HMAC over the body plus a timestamp so the receiver can verify authenticity and reject replays outside a tolerance window. As the receiver, respond 2xx immediately and process asynchronously, because slow handlers cause spurious retries. Assume at-least-once delivery and out-of-order arrival: deduplicate on the event id and ignore an event whose sequence number is older than the state you already have.
Q. Write a function that converts a word into a numeronym, such as internationalization into i18n.
A. Return the input unchanged when its length is at most three, since there are no interior characters to compress. Otherwise take the first character, append the count of characters between the first and last - that is length minus two - and append the last character. In Python that is s if len(s) is at most 3 else s[0] + str(len(s) - 2) + s[-1], which runs in O(1) after the length check. The follow-ups Stripe tends to add are handling a whole sentence word by word while preserving punctuation, and handling multi-byte characters, where you must count Unicode code points rather than bytes or you will report the wrong number.
Q. How would you find and fix a race condition in a piece of concurrent code?
A. First characterise it: a race means the outcome depends on interleaving, so look for shared mutable state touched without a lock, a check-then-act sequence, or a non-atomic read-modify-write. Reproduce it by increasing concurrency and adding artificial delays between the check and the act, and use a race detector - the Go race detector, ThreadSanitizer, or Java’s jcstress - rather than staring at the code. Fixes in order of preference are removing the sharing entirely, making the operation atomic with a compare-and-swap or a single database statement such as UPDATE balance SET amount = amount - 10 WHERE id = 1 AND amount is at least 10, and only then adding a mutex with a documented lock ordering. Finish by writing a regression test that fails reliably under the old code.
Assessment tips
Interview tips
HR tips
These links are research inputs we used to map round structure and recurring questions - not copied page mirrors. We reorganized reports into process tables, outcome notes, and prep takeaways for Stripe (Exponent, Medium, DEV Community, and similar process guides for 2025-2026).
Cross-check the current drive mail for timings - some loops add a HackerRank OA before the live screen, and integration rounds may run 90-120 minutes on some teams. For OA practice, see Stripe placement papers. For the hub and HR prompts, see the Stripe hub and Stripe HR page.
Razorpay · PayPal · PhonePe · Visa · Mastercard