interview prep

What Deel actually screens for in its engineering interviews

Deel will not ask you to invert a binary tree. Candidates who went through the loop over the past year describe the same shape: four or five rounds, a take-home that decides most of the outcome, and technical conversations that keep circling back to money moving between bank accounts. One candidate summed it up as no LeetCode at all, just conversations and direct questions.

That changes what prep looks like. Three weeks of dynamic programming will leave you sharp for a round Deel doesn’t run, and rusty on transaction isolation, which they ask about repeatedly.

The loop, stage by stage

Deel is a global payroll and employer-of-record company, so the engineering org skews toward backend, payments, and integrations work. The process typically runs three to five weeks end to end, and candidates report hearing back within a few business days of the final conversation. Round count varies by team, and some loops fold the hiring manager and the values conversation into a single call.

Stage in the Deel engineering loop Format Typical length What the round is actually scoring
Recruiter screen Video call with an in-house recruiter 30 minutes Background, country and timezone overlap with the team, comp expectations, employment status (many hires are engaged as contractors)
Take-home assignment Async coding task scoped to the role, given to nearly every candidate Suggested around 3 hours, returned within a few days Correctness under concurrent access, error handling, tests, restraint about adding unrequested features
Technical interview Live call, often pair-programming on an extension of your take-home or a fresh problem 60 minutes Reasoning out loud, defending your design choices, database and API tradeoffs
System design discussion Live call, whiteboard-style, usually payments or high-volume API shaped 45 to 60 minutes Idempotency, failure handling, data integrity, availability tradeoffs
Team lead and values conversation Discussion of past work, ways of working, mutual fit 45 to 60 minutes Ownership of shipped projects, async communication habits, how you handle disagreement

The stack on most backend postings is Node, Express, TypeScript, and PostgreSQL, with AWS or GCP, containers, and event-driven patterns listed as nice-to-haves. Interviewers will let you write the live coding round in whatever you’re strongest in, but the database questions assume Postgres semantics.

The take-home is where most people get cut

Deel gives a take-home to nearly every candidate, tailored to the role. Backend candidates get something shaped like the actual product: a small service that records transactions, or an API that has to stay correct when the same request lands twice.

The stated budget is around three hours. Most people spend more, and the ones who spend a full weekend building an abstraction layer over 200 lines of logic tend to do worse, not better. Read the requirements literally. Build exactly what was asked, handle the error paths, and write tests for the concurrent case rather than only the happy path. The reviewer is a working engineer reading your repo between meetings, and they are checking whether you found the trap they planted.

A short README does a lot of work here. Name the tradeoffs you made, say what you’d change with another day, and flag anything you deliberately left out. That one file turns a silent submission into the start of the conversation you’ll have in the next round, since the live technical interview often extends your own code.

Why isolation levels come up in almost every technical round

Payroll is a domain where the same request arriving twice costs someone real money. Two operators kick off the same payroll run. A payment provider retries a webhook after a timeout. A contractor taps withdraw twice on a bad connection. Deel’s interviewers ask about this directly, in wording close to:

  • How do you handle concurrent operations in a database to prevent race conditions?
  • Explain the difference between database isolation levels and when you would use each one.
  • How would you optimize a slow SQL query that’s causing a performance bottleneck?

A weak answer recites the four levels. A strong one names the anomalies and picks the cheapest mechanism that prevents the specific one you care about. Postgres defaults to READ COMMITTED, which still allows non-repeatable reads and lost updates on read-modify-write patterns. REPEATABLE READ in Postgres is really snapshot isolation, which kills phantoms but leaves write skew alive. SERIALIZABLE catches write skew through predicate locking, at the cost of serialization failures your application code has to catch and retry.

Most of the time the right answer isn’t a heavier isolation level at all.

-- read then write: two concurrent transactions can both see the old value
SELECT amount_paid FROM payroll_run WHERE id = $1;
UPDATE payroll_run SET amount_paid = $2 WHERE id = $1;

-- lock the row for the life of the transaction
BEGIN;
SELECT amount_paid FROM payroll_run WHERE id = $1 FOR UPDATE;
UPDATE payroll_run SET amount_paid = amount_paid + $2 WHERE id = $1;
COMMIT;

Better still, make the write idempotent so a duplicate becomes a no-op rather than a race you have to win. A unique constraint on a natural business identifier costs almost nothing and turns a correctness problem into a constraint violation you can handle explicitly. Say that out loud in the interview. Reaching for row locks and SERIALIZABLE before considering a unique index reads as someone who learned the vocabulary but not the habit.

On query optimization they want to hear EXPLAIN ANALYZE, then a diagnosis. Know the usual reasons an index sits unused: a function wrapped around the indexed column, a type mismatch between the parameter and the column, selectivity low enough that a sequential scan is genuinely cheaper, or statistics that haven’t been refreshed since a bulk load.

Designing the payroll deposit API

The system design prompt Deel candidates report most often is some version of designing an API that handles a high volume of payroll deposits, with a follow-up about guaranteeing idempotency. It’s the same question twice, and the second half is the one they care about.

Start with the client-supplied idempotency key. The client generates it, sends it as a header, and you store it alongside a fingerprint of the request body and the response you returned. A unique index on that value is what actually enforces the guarantee. A repeat with the same key returns the stored response; a repeat with the same key and a different body is a 422, not a silent overwrite. The case people miss is the in-flight duplicate, where the first request hasn’t committed yet. Say what you do there: return 409 and let the client retry, and give the record a TTL so keys don’t accumulate forever.

Then the ledger. Deposits belong in an append-only double-entry ledger, with balances derived from entries or maintained in the same transaction that writes them. No destructive updates to a balance column from application code. When they push on publishing events to downstream services, the answer is the transactional outbox, because you cannot atomically commit to Postgres and produce to Kafka. Write the event to an outbox table inside the same transaction, let a relay publish it at least once, and make every consumer idempotent. Exactly-once delivery is a marketing term.

The failure question that separates candidates: the payment provider times out and you have no idea whether the transfer executed. Never blindly retry a money movement. You either pass the provider your own idempotency key so their side deduplicates, or you query their status endpoint before deciding. Bring up reconciliation on your own, a scheduled job comparing your ledger against provider statements, because rails settle late and sometimes disagree with you.

The behavioral rounds, and the fully remote part

Deel sells remote employment as a product and runs itself that way, across a lot of countries. The values conversation leans hard on async habits. Reported prompts include describing a time you dealt with a significant technical constraint, and how you handle disagreement with stakeholders over technical tradeoffs.

Generic answers die here. Give the timezone spread you actually worked across and what you changed because of it, something like moving design review from a call to a written doc with a 24-hour comment window because half the team was eight hours ahead. For the disagreement question, the story where you lost the argument, shipped the other approach well, and found out later whether you were right beats the one where you were correct from the start.

Comp, and why the number depends on where you live

Deel pays against local market bands rather than one global scale, so two engineers at the same level in different countries see materially different offers. Ask the recruiter for the range for your specific country during the screen, before you spend a weekend on the take-home. Three to five weeks is a long time to discover a mismatch.

The equity is private-company stock in a business valued in the low tens of billions after its most recent round, which means illiquid and worth real diligence. Ask about strike price, the current 409A, the preference stack sitting ahead of common, and whether the post-termination exercise window extends past the standard 90 days. Many international hires are engaged as contractors rather than employees, which shifts the benefits and tax math enough that it belongs in your offer comparison. Check the posted range on the job listing and cross-reference levels.fyi rather than anchoring on one Glassdoor data point.

What to do the week before

Re-read the Postgres documentation on transaction isolation until you can explain write skew with a concrete example. Build a small service with an idempotency key and hammer it with concurrent requests until you’ve produced your own race condition. Practice reading EXPLAIN ANALYZE output. Have two stories ready with real numbers in them.

The people who do well in this loop tend to be the ones who have been paged at three in the morning for a customer who got charged twice. If that hasn’t happened to you yet, build the small version of that system and break it on purpose, before someone asks you to explain how it breaks.

newsletter

What's actually being asked right now

Interview patterns & comp trends, straight to your inbox.

No spam. Unsubscribe anytime.

newsletter

What's actually being asked right now

Interview patterns & comp trends, straight to your inbox.

No spam. Unsubscribe anytime.

1972 Soviet postage stamp commemorating the Mars 2 probe

worth a read

Mars For The Rest of Us — a weekly-or-more deep dive on the technical side of Mars exploration: rocket propulsion, microbiology, mission architecture, and everything in between. Written by Maciej Ceglowski.

Read it on Substack →
Scroll to Top