Guides › Affirm
A

Affirm Interview Guide (2026)

You can pass the Affirm loop without being a competitive-programming god. You cannot pass it with code you can't explain, and you cannot pass it by hand-waving away what happens to someone's money when your code is wrong. Every round is secretly checking the same thing: do you treat correctness like it matters.

Software Engineer12 min readUpdated 2026-11

The complete Affirm interview, start to finish. Work through these 10 sections (about 12 min) and you walk in knowing exactly what each round tests and how to prepare.

The loop at a glance

Six rounds, one bar. Everything below is how to clear it.

  1. Recruiter screen (30 min). Motivation, level fit, comp. Low stakes, do not fumble the logistics.
  2. Phone screen (45 to 60 min). One medium DSA problem, live and out loud. They grade your reasoning, not just the answer.
  3. Coding onsite (60 min). Medium-hard DSA with follow-up extensions. Clean, tested, legible code beats a clever one-liner.
  4. Machine coding / LLD (60 to 90 min). Build a small running system from a spec. Model the domain, ship the happy path early, leave seams.
  5. System design (E5+) plus values. A payments-adjacent design where the hard part is correctness under failure, and a values round you cannot treat as a throwaway.

1Snapshot, read this first#

Thing What it actually is
Roles Software Engineer (backend-heavy), Full Stack, Frontend, some ML/Platform
Levels E3 (new grad) through E6 (staff). Most external hiring sits at E4/E5
Process length Usually 3 to 5 weeks, recruiter screen to offer
Rounds Recruiter call, technical phone screen, then a 4 to 5 part onsite loop
What wins Clean readable code, loud clear thinking, modeling a real domain well, honest values stories
What fails Silent coding, over-engineering, hand-wavy data models, treating behavioral as a throwaway
US comp (E4/E5) ~$170k to $240k base, meaningful RSUs, total roughly $230k to $400k
Canada comp ~C$140k to C$210k base, total ~C$190k to C$320k
India comp Smaller footprint. Roughly ₹30L to ₹70L total for mid to senior, if a req is open
UK Hires in limited cases via EU/remote; treat London comp as £90k to £150k base if open

The one thing to understand about Affirm. They build consumer lending software, and a buy-now-pay-later installment is a loan.

  • A single off-by-one in a payment schedule is a regulatory and trust problem, not a cosmetic one.
  • A bug can mislead someone about money they owe, charge them twice, or show the wrong payment date.
  • The whole engineering culture bends toward correctness, clear data modeling, and people who think about edge cases without being told to.
  • A clever one-liner nobody can audit is a liability here. Trustworthy, legible, and correct-under-failure is the whole game.
The thing every round is really testing

Strip away the problem on the screen and each interviewer is asking one question: can we trust this person with money code. Name edge cases unprompted, say what breaks under a retry, represent amounts as integer cents. Do that across rounds and you look senior before anyone checks your title.

2Getting the call (the part most guides skip)#

Affirm gets a flood of applicants. The cold-application pile is brutal and most resumes there never reach a human. A referral routes you to an engineer or a recruiter instead of a keyword filter, so it is worth more than a perfect resume.

How people actually get shortlisted.

  • A referral from a current engineer. Find Affirm folks on LinkedIn who worked where you worked, or share a bootcamp or university. A short, specific note beats a polite one: "I spent two years on payments infra at X, I'd love a referral for the E4 backend req, here's my resume and two bullets on why Affirm." Attach the resume so they can forward it in one click.
  • A resume that screams money, scale, and ownership. Affirm is a payments company. Payments, ledgers, transactions, reconciliation, fraud, idempotency, and anything high-throughput jumps off the page to a reviewer who lives in that world.
  • Keywords that survive the ATS, all of them true: Python, Kotlin, TypeScript, React, Go, PostgreSQL, Kafka, gRPC, microservices, distributed systems, payments, API, AWS. A reviewer can smell a resume that lists Kafka but never touched it, and that gap surfaces in the phone screen the moment they ask what partition key you used and why.

A resume bullet that lands. Compare these two.

  • Weak: "Worked on backend services and improved performance."
  • Strong: "Rebuilt the settlement reconciliation job in Python + Postgres, cutting nightly run time from 40 min to 6 min and eliminating a class of duplicate-payment bugs affecting ~2k daily transactions."

Why the strong one wins:

  • Numbers, a real domain, and a clear "I owned this."
  • The weak one could have been written by anyone about anything.
  • The strong one tells the reviewer you've already shipped the exact kind of work Affirm does: a batch job, a correctness bug, money on the line, a measured result.
  • No payments work? Do the same move on whatever you had: name the system, name the metric, name the before-and-after number.

3The loop at a glance#

Round Length What it tests
Recruiter screen 30 min Motivation, level fit, comp alignment, logistics
Technical phone screen 45 to 60 min One medium DSA problem, live coding, communication
Coding (onsite) 60 min Medium-hard DSA, clean code, tests, complexity
Machine coding / LLD 60 to 90 min Build a small working system from a spec, OOP modeling
System design (E5+) 60 min Design a payments-adjacent system at scale
Behavioral / values 45 to 60 min Affirm values, ownership, collaboration, conflict

How the loop scales by level.

  • New grads (E3) usually get a lighter loop: more CS fundamentals, a cleaner single coding problem, and often no full scale system design.
  • Senior folks (E5 and up) get the full system design plus a deeper values round, often with a hiring manager or director probing whether you can own a surface area, not just a ticket.
  • The E5 tell: they stop asking "can you solve this" and start asking "how would you decide." Answers that name a tradeoff out loud score higher than answers that just produce a result.

Here is how the stages chain together.

flowchart LR A[Recruiter screen] --> B[Phone screen] B --> C[Coding onsite] C --> D[Machine coding] D --> E[System design] E --> F[Values round] F --> G[Debrief and offer]
The full pipeline. Notice the debrief sits after everything: no single round decides your fate alone, but any one strong-no can stall the whole chain.

The debrief matters more than people realize.

  • Interviewers write up each round and the hiring committee reads them together, usually a few days after your last round.
  • One strong-no on values can stall an otherwise clean loop, which is why the behavioral round is not a formality.
  • The committee weighs consistency: four lukewarm "leaning yes" writeups often lose to three clear yeses and one no, because a clear signal is easier to defend than a muddy one.

4The coding or technical rounds#

Affirm coding is medium-hard LeetCode territory with a twist: they care more about how you build than whether you find the one clever trick.

  • I've passed candidates who didn't fully optimize but modeled the problem beautifully and tested it.
  • I've failed candidates who got the optimal answer in silence and couldn't explain why their loop terminated when I asked.

Patterns they reuse a lot.

  • Hash maps and frequency counting. Two-sum-flavored stuff, grouping, dedup, counting distinct transactions per customer.
  • Interval problems. Merge intervals, meeting rooms, overlap detection. Very on-brand: think overlapping promo windows, rate windows, or whether two installment schedules collide.
  • Strings and parsing. Tokenizers, simple expression evaluation, encode and decode, parsing a fixed-width record out of a settlement file.
  • Trees and graphs. BFS and DFS, topological sort, shortest path on a small grid. Topo sort shows up disguised as dependency ordering between billing steps, where step B can't run until step A settles.
  • Stacks and queues. Valid parentheses variants, monotonic stack, next-greater-element.
  • A "design a small class" problem that bridges into the LLD round: an LRU cache, a rate limiter, or an in-memory key-value store with per-key expiry. These are a soft handoff. Do well here and the machine-coding round feels familiar.

The follow-up extensions are the real test. Difficulty is roughly LeetCode medium, with one or two pushing into hard-ish territory.

  • "Now make it handle duplicates."
  • "Now the input is a stream, so you can't see it all at once." You lose the ability to sort or random-access, so a heap or a running count beats re-scanning.
  • "Now it has to run concurrently, what breaks." Name the shared mutable state and say what you'd lock or make atomic.
  • They are testing whether your first design has room to grow.
Pause: the interviewer runs your loop line by line and asks why it terminates. What are they actually checking?
Reveal the answer
Whether you understand your own code or just pattern-matched it from memory. A candidate who can point to the exact condition that shrinks the search space each iteration has written the solution. A candidate who shrugs has recited it. At Affirm, correct-and-understood passes and correct-and-lucky does not, because lucky code breaks in production and nobody can fix it.

How to actually win the round.

  1. Clarify first. Ask about input size, edge cases, empty input, duplicates, negative numbers, and what should happen on bad input. Thirty seconds of real questions signals seniority and often reveals the trap. For a payments prompt, "can amounts be negative, and do negatives mean refunds" makes an interviewer sit up.
  2. Think out loud the whole time. Narrate the decision, not just the keystroke: "I'll key the hash map by customer id so lookups stay O(1), and I'll store the latest timestamp as the value so I can resolve ties."
  3. State complexity before you're asked. "This is O(n log n) time because of the sort, O(n) space for the map." Then say whether you can do better: "I could get this to O(n) with a bucket, but the sort keeps it readable and n is small, so I'll keep it," is a senior sentence.
  4. Write code a teammate could read. Real variable names, small helpers, early returns over nested ifs. No one-letter soup. Legible beats clever.
  5. Test it yourself. Walk through one normal case and one edge case out loud, tracing the variables by hand. Finding your own bug before the interviewer points it out gets a big mental checkmark, because that is literally the job.
From the interviewer's chair

When I run a loop in your code, I am not checking arithmetic. I am checking whether you can hear a bug coming. The candidate who says "wait, this breaks on an empty list, let me guard it" before I say a word just showed me the exact instinct I want on call at 3 a.m. Silence tells me nothing, and I grade on what I can hear.

Practice tip.

  • Grab 40 to 50 mediums across arrays, hash maps, intervals, trees, and graphs.
  • Redo five of them talking out loud to a wall or a webcam, timed to 30 minutes. The talking is the skill Affirm grades, and the one you can't fake on the day.
  • Record one and watch it back once. It is uncomfortable, and it fixes more than another ten solved problems will.

5System design and the machine-coding / LLD round#

This is where Affirm differs from a generic big-tech loop. The machine-coding and low-level design round is common here, and it's where a lot of otherwise-strong people slip, usually on time management.

The machine-coding / LLD round#

You get a spec for a small system and build a working, runnable version in your language of choice.

  • Common prompts: a parking lot, a vending machine, a splitwise-style expense splitter, a payment-plan calculator, a coupon or discount engine, an in-memory order book.
  • Payments-flavored prompts show up often because they map directly to the domain.

What they're really grading.

  • Clean domain modeling. One class, one job. An InstallmentSchedule computes schedules; it does not also talk to a database and format a receipt.
  • It actually runs and produces correct output. Not pseudocode, not "and then it would roughly do this." Running, with a tiny main or a test that prints real results.
  • Obvious edge cases handled without being told. Zero-dollar loan, a refund larger than the balance, a coupon that would push the price below zero.
  • Extensibility. They love to say "now add refunds" or "now add a second currency" at the end and watch whether your design bends or snaps. A design that snaps reads as junior no matter how clean the first version looked.

A framework I give everyone.

  1. Read the whole spec, then restate it in one sentence. "So I'm building X that supports A, B, C." This catches misreads before you've burned 20 minutes coding the wrong thing.
  2. List the core entities out loud. For a payment-plan calculator: Loan, Installment, Schedule, PaymentProcessor. Naming them early forces the model to the surface.
  3. Sketch the interfaces before writing bodies. Decide what talks to what and who owns what state.
  4. Build the happy path first, run it, then add edge cases. A running happy path at minute 30 is worth far more than a perfect model that compiles at minute 59.
  5. Keep state and logic separated. No god class that is impossible to extend.
  6. Leave seams for the follow-up. If they'll probably add "refunds," make a Transaction type now instead of passing raw floats around. That one decision is often the difference between a two-line add and a rewrite.
Red flag that fails you here

Representing money as a float. Write 0.1 + 0.2 in front of a payments interviewer, watch it print 0.30000000000000004, and you just failed the domain test without them saying a word. Say "I'll store amounts as integer minor units so I never hit floating-point rounding." It costs one sentence and reads as someone who has shipped money code.

Do not over-engineer.

  • I've watched people reach for abstract factories and visitor patterns on a 60-minute problem and never ship working code.
  • Working and simple beats clever and broken, every single time.
  • If you find yourself writing an interface with one implementation and no second caller in sight, stop.

System design (E5 and up)#

For senior loops you'll get a proper scale design, usually payments-adjacent.

Classic prompts.

  • Design a payment processing or checkout service (idempotency, retries, exactly-once charging).
  • Design a ledger or double-entry accounting system.
  • Design a loan or installment scheduling service.
  • Design a rate limiter or an idempotency key store.
  • Design a notification system for payment reminders.

The framework. Requirements (functional and non-functional) first, then rough numbers (QPS, data size, read-vs-write ratio), then the API, then the data model, then the high-level diagram, then a deep-dive on the hard part.

  • At a payments company the hard part is almost always correctness under failure.
  • Talk idempotency keys, exactly-once semantics, the outbox pattern, reconciliation jobs, and what happens when a downstream charge times out but may have already succeeded.
1
The money questionA charge where the network drops after the money moved but before you got the acknowledgment. This single scenario separates senior payments engineers from everyone else. Raise it unprompted, walk through how your idempotency key makes the retry safe, and you look senior without saying a word about your title.

For the ledger prompt specifically, the answer they want is append-only double-entry.

  • Every movement is two balanced rows: a debit and a credit.
  • You never update a balance in place.
  • The current balance is a sum or a materialized rollup over the immutable entries.
  • Say that and you've shown you know why accountants and payments people trust ledgers: you can always reconstruct and audit how a balance got where it is.

A minimal shape for a charge service worth sketching on the board.

flowchart LR C[Client] --> G[API gateway] G --> S[Charge service] S --> K[(Idempotency store)] S --> L[(Ledger DB)] S --> P[Processor] S --> O[(Outbox)] O --> N[Notifier]
The charge path. Notice the idempotency store sits in front of the processor, not after it: the retry has to hit the store before any money can move a second time.

Then narrate the failure case over that picture.

  • Client retries with the same idempotency key.
  • The charge service checks the store, sees the key already resolved, and returns the prior result instead of charging twice.
  • Spell out the write order: you persist the key as "in progress" before you call the processor, so a crash mid-charge leaves a record the retry can reconcile against instead of a silent double charge.
  • That is the kind of answer that moves an E5 loop from "fine" to "clear yes."

6Behavioral and culture fit#

Do not sleep on this round. Affirm takes values seriously and a weak behavioral can sink an otherwise strong loop. I have personally watched a candidate with two strong-yes coding scores get debated into a no-hire because the values round was flat and a little blamey.

Affirm's values (know these, they'll come up by name).

  • People come first.
  • No fine print. (Honesty, transparency, saying the hard thing plainly instead of burying it.)
  • It's an honor to serve.
  • Push the boundaries.
  • Simpler is better.
  • Be the owner.

Prepare five or six STAR stories.

  • A conflict with a teammate.
  • A hard technical call you owned.
  • A time you simplified something messy.
  • A failure and what you changed afterward.
  • A time you pushed for the customer's interest over your own convenience or a deadline.
  • Map each story to one or two values out loud, because the interviewer is scoring you against those words. End a story with "and that's really the 'be the owner' one for me," so they can drop it straight into the right box.

One full worked STAR example.

Situation: Our team's nightly batch that generated customer payment schedules started silently dropping about 3% of records when the input file format changed upstream.

Task: I was on call and owned getting schedules correct again, fast, without sending anyone a wrong payment amount.

Action: Instead of patching the parser and moving on, I added a reconciliation check that compared record counts in versus out and hard-failed the job on mismatch, then I wrote a one-page postmortem and flagged the upstream team about the format change. I pushed to make the job fail loud rather than fail quiet, because quiet wrong numbers are worse than a delayed run in lending. A late schedule is an inconvenience. A wrong schedule is a customer paying money they don't owe.

Result: We recovered 100% of the dropped schedules within the day, and the new guardrail caught two more upstream format changes over the next quarter before any customer saw a wrong number.

Why that shape works.

  • The number in the result maps straight onto "No fine print" and "Be the owner."
  • A concrete situation, a decision you personally made, a measured outcome, and a value it demonstrates.
  • Avoid stories where "we" did everything and "I" is nowhere.
  • Avoid any story whose moral is that someone else was at fault. If a story has to involve a teammate's mistake, make the point about how you handled it.

In lending, a late schedule is an inconvenience. A wrong schedule is a customer paying money they don't owe.

7Your prep plan#

4-week plan.

  • Week 1: 25 LeetCode mediums across arrays, hash maps, strings. Talk out loud on half of them, out loud for real, not in your head.
  • Week 2: Trees, graphs, intervals, stacks. Add 20 more. Start timing yourself to 30 min and note which patterns you stall on.
  • Week 3: Machine coding. Build three small systems end to end (parking lot, expense splitter, payment-plan calculator). Make them run, then make yourself add one feature to each cold.
  • Week 4: System design (if E5+) plus six STAR stories mapped to the values, rehearsed aloud. Do two full mock loops with someone who will interrupt you.

2-week plan.

  • Days 1 to 5: 30 mediums, focus on hash maps, intervals, trees, graphs.
  • Days 6 to 9: Two machine-coding builds, runnable, with an "add a feature" extension each.
  • Days 10 to 12: System design framework plus two payments prompts, or more mocks if you're E3/E4 and skipping system design.
  • Days 13 to 14: STAR stories mapped to Affirm values, plus one timed mock coding round out loud.

2-day crash plan.

  • Day 1: 12 mediums (hash maps, intervals, trees). One machine-coding build that actually runs. Read Affirm's values and jot one story per value.
  • Day 2: Review the complexity cheat-sheet. Write four STAR stories with real numbers in the result. Do one timed problem talking out loud. Re-read the payment-processing design notes above so the idempotency and failure story is fresh.

8Why people get rejected at Affirm#

  1. Silent coding. If I can't hear your reasoning, I can't pass you, even with correct code, because I can't tell correct-and-understood from correct-and-lucky.
  2. The machine-coding round turns into one giant function. No classes, no clear ownership of state, no room to extend. The "now add refunds" follow-up then collapses the whole thing.
  3. Over-engineering a small problem and never getting it running. A perfect design that doesn't execute scores below a plain design that does.
  4. Hand-wavy data models in system design. "I'll store it in a database" with no schema, no keys, and no thought about what makes a write correct under a retry.
  5. Ignoring failure and idempotency in a payments design. At Affirm that's a red flag, not a nice-to-have. A charge flow with no answer for the timed-out-but-maybe-succeeded case reads as not understanding the domain.
  6. A flat behavioral round. No numbers, no clear ownership, blaming teammates, or stories that don't connect to any value. This one quietly ends more loops than people expect.

9The offer, comp and negotiation#

How to read the offer. Comp is base + RSUs (4-year vest, typically) + bonus.

  • As a public company the equity is real and liquid: you can look up the share price and actually sell when it vests, so there is less guesswork than with a private startup's paper grant.
  • The flip side: Affirm's stock has been volatile. Ask whether the grant is a fixed dollar value divided by price at grant, or a fixed share count, because that one answer changes what the number is really worth.

Rough 2026 ranges.

  • US E4/E5: base ~$170k to $240k, total roughly $230k to $400k with equity.
  • Canada: base ~C$140k to C$210k, total ~C$190k to C$320k.
  • India (if a req is open): roughly ₹30L to ₹70L total for mid to senior.
  • UK (limited hiring): treat London base as ~£90k to £150k if a role is open.

Negotiation tips.

  1. Negotiate on equity, not just base. At Affirm the RSU grant has the most give, and the recruiter expects a counter there. Base is banded tightly by level; the grant is where a few tens of thousands a year actually live.
  2. Bring a competing number if you have one. A real offer from another payments or big-tech company moves the equity meaningfully. Be honest about it, because recruiters talk and a bluff that unravels costs you leverage you can't get back.
  3. Anchor to level. If your loop felt like a strong E5 but they're offering E4 comp, push on the level, because that resets the whole band, not just one number. A level bump is worth more than any single-number tweak.

One last move. Always get the full breakdown in writing: base, target bonus, grant value, and vest schedule. Then sit with it for a day before you respond. A calm "thank you, I'd like a day to review the full numbers" is a completely normal thing to say and it never costs you the offer.

10FAQ#

Follow-ups the interviewer will ask (and your answers)
"Is Affirm's coding round LeetCode-hard?"
Medium to medium-hard, with follow-up extensions like "now handle a stream" or "now make it concurrent." It's less about rare tricks and more about clean, tested, well-explained code that has room to grow.
"What languages can I use?"
Your choice. Python, Java, Kotlin, TypeScript, Go are all common. Pick the one you're fastest and cleanest in, especially for the machine-coding round where you're building a running system against the clock.
"How important is the behavioral round really?"
Very. A strong technical loop with a weak values round still gets debated hard in the committee, and I've seen it tip to no-hire. Treat it as a real round with prepared, numbered stories.
"Do I need payments experience to get hired?"
No. It helps your resume stand out, but plenty of hires come from unrelated domains. What matters is that you think about correctness and edge cases like someone who could be trusted with money, and that you ask "what happens if this fails halfway" on your own.
"What usually trips people up in the machine-coding round?"
Time management and modeling. People spend too long chasing a perfect design and never ship a running program, or they ship a running blob with zero structure that falls apart on the first follow-up. Aim for runnable by minute 30 and reasonably modeled, then harden it.

What you can now explain in the room

  • Why Affirm grades correctness and legibility over clever one-liners, and that a BNPL installment is a loan.
  • How to narrate a coding round so the interviewer hears reasoning, not just keystrokes, and why that is the whole grade.
  • How to run the machine-coding round: restate the spec, name entities, ship the happy path by minute 30, leave seams for the follow-up.
  • Why money is integer cents and never a float, and how to say it in one sentence.
  • How to handle the timed-out-but-maybe-succeeded charge with an idempotency key, plus append-only double-entry for a ledger.
  • How to tell a STAR story that maps to an Affirm value with a real number in the result, and how to negotiate on equity and level.

If you want, map these rounds onto your actual calendar and build a dated week-by-week plan around the date of your Affirm loop.

Get a prep plan built around your Affirm interview

Tell us the role and your interview date. We will send back a dated, day by day plan. Free.

Thanks. Check your inbox, your Affirm prep plan is on the way.