cswork / libraryOpen practice workspace

Articles

Monzo Engineering Manager System Design Interview: Reason Through an Unfamiliar Backend Problem

Prepare for Monzo engineering manager system design with dated official expectations, first-principles reasoning, reservation races, and clear trade-offs.

Preparing for a Monzo Engineering Manager system design interview does not require pretending you are a specialist in every backend technology. The more useful goal is to build a coherent solution from a clear contract, explain its failure boundaries, and keep the interviewer able to follow each decision. An unfamiliar problem becomes manageable when you can trace one request and one invariant end to end.

This article separates dated official guidance, limited candidate accounts, and our preparation inference. Its equipment-reservation exercise is original and unrelated to Monzo's production architecture. It is not a reported interview prompt or a prediction of your current invitation.

Begin with Design a Concurrent Car Reservation Service. Translate its concurrency questions into an unfamiliar domain instead of memorizing a particular architecture diagram.

What does Monzo officially say about the EM technical interview?

Official, dated guidance: Monzo's February 19, 2024 article describes an EM systems design stage using a one-hour virtual-whiteboard distributed-systems exercise also used for backend applicants. It names communication, first-principles reasoning, and correctness/scalability as expectations, while allowing collaboration to uncover limitations. It also explains why candidates from mobile or other engineering backgrounds can participate. EM technical expectations.

Related official background: the March 1, 2025 backend interview article describes a hypothetical, non-Monzo problem, with trade-offs and changing assumptions discussed collaboratively. That is backend guidance; it does not independently establish every current EM stage. Backend interview process.

Confirm duration, format, drawing tool, and permitted resources with your recruiter. These public posts explicitly carry publication-time caveats. Their value is explaining an approach to preparation, not guaranteeing an unchanged process in October 2026.

What do candidate accounts add—and leave unknown?

Candidate-reported, limited evidence: in a June 2025 discussion, a commenter described a manager interview process as organized but said the interview had been a couple of years earlier and could not recall the design exercise. That is historical personal experience, not current task evidence. Candidate discussion.

A separate July 2026 thread includes an EM applicant describing experience-based questions at an initial interview. It does not establish the content of a completed EM system design round. Initial-stage account.

We did not establish two independent, same-cycle accounts of completed EM design interviews. Therefore the scope here is dated official expectations plus a clearly original rehearsal. Do not infer a universal question list, cutoff, rejection reason, or interview sequence from neighboring backend and mobile accounts.

Turn an unfamiliar domain into a small contract

Our exercise: a community equipment library rents cameras. A customer may hold one camera for ten minutes while arranging pickup, then confirm or cancel. Several customers can request the last available camera simultaneously. Notifications are useful, but a failed notification must not create or erase a reservation.

Start with decisions that change the system. Are cameras individually tracked or interchangeable? Does a hold consume capacity? Can pickup times overlap? Must all sites share inventory? Can a confirmation arrive after expiry? For this first version, assume interchangeable units at one site, a hold consumes one unit, and confirmation must occur before its stored deadline.

Define the invariant: active holds plus confirmed reservations must never exceed capacity for a particular inventory bucket. Expired holds do not consume capacity after the authoritative expiry transition. State which time window or pickup slot forms that bucket; “camera model” alone may be insufficient for multi-day rentals.

Then separate user requests from business states. A successful HTTP request might mean “hold created,” while a pickup notification means only “a message was sent.” Neither signal should imply that the camera has been collected. Naming these states early prevents a queue or cache from becoming an accidental authority.

Build the simplest design that enforces the invariant

Propose an API service, an authoritative reservation store, and a background worker for expiry and notifications. Keep search availability as a potentially stale read view. Route admission through the authoritative write path even if the search screen previously displayed an available camera.

Use a bounded transaction to conditionally acquire capacity and write the hold together. One implementation option stores remaining capacity in the inventory bucket and decrements it only when sufficient capacity remains. The transaction must also create a hold with a unique identity and deadline; a partial update cannot be acceptable.

Another option checks occupancy under suitable locking or serializable semantics. Explain the database assumptions and retry behavior rather than saying “transactions solve races.” A count read followed by an unrelated insert can still oversell if concurrent transactions both observe the same capacity.

Our first version has capacity one. Customer A and customer B both see available capacity. The admission path must serialize the decisive change so exactly one gets a hold. The losing request receives an explicit unavailable result rather than a reservation that later disappears during reconciliation.

Keep the sketch small enough to retell. For every arrow, label what crosses it: request, transaction result, pending notification, or reconciliation observation. An unlabeled database box does not explain where the invariant lives or which failure can leave the caller uncertain.

Trace a lost response before adding more components

Suppose A's hold transaction commits, but its HTTP response is lost. A retries. Without request identity, the retry may create a second hold or appear to fail because the first hold consumed the last unit. The user cannot distinguish their own success from someone else's booking.

Our proposed API accepts a client-generated idempotency key scoped to the authenticated caller and operation. The write transaction records the request fingerprint and result. Repeating the same request returns the earlier hold identity; reusing the key with materially different input is rejected rather than silently reinterpreted.

For an interview, describe concurrent duplicate requests as well as later retries. The unique key check, capacity change, and result record need a coordinated transaction boundary. Keep retention policy visible: once an idempotency record expires, the API cannot promise indefinite replay equivalence.

Say this aloud: “A timeout is an unknown result, not proof that nothing committed. I will let the client retry the same operation identity and retrieve its authoritative result.” That statement explains the behavior without depending on a vendor-specific feature name.

How do confirmation and expiry race?

The hold has an immutable ID, a deadline, and a version. Confirmation transitions an active, unexpired hold to confirmed. Expiry transitions an active hold to expired and releases its capacity once. Both must operate through the same authoritative state machine.

Here is our expected race ledger. Assume the database decides deadline comparisons, and each state transition is atomic with its capacity effect.

EventRequired resultCapacity consequence
Confirmation wins before deadlineHold becomes confirmedRemains consumed
Expiry wins after deadlineHold becomes expiredReleased once
Old expiry job arrives after confirmationNo transitionNo release
Duplicate expiry job arrivesNo transitionNo second release
Confirmation arrives after expiryRejected or offered a new admission attemptCannot revive old capacity

Do not let a delayed timer blindly increment available inventory. It must conditionally transition the specific active hold. If a new hold has reused the released unit, a stale job for the old hold must never release the new hold's capacity.

The deadline adds another question: is an active-but-overdue hold visible as available before a worker processes it? Choose a policy. Our simple version reclaims overdue capacity through authoritative transitions during admission or worker processing; a cached display cannot release it independently. That may temporarily reduce availability but protects the invariant.

What does a queue solve, and what does it not solve?

A queue can move notification work away from the interactive path. It does not by itself guarantee that a committed reservation creates a message, that a message appears only once, or that an external notification is delivered exactly once.

Our proposed store records a pending notification alongside confirmation in the same transaction. A worker later delivers it, with retries and an explicit outcome record. This is an original design choice, not a claim about Monzo's systems. Explain the crash boundary: if the worker sends and then crashes before recording success, delivery may repeat.

Define the user impact and the external provider's capabilities. A stable delivery identity may support deduplication where the provider honors it. Otherwise document the duplicate risk and make messages harmless where possible. Marking the business reservation confirmed must remain separate from marking the notification delivered.

For a simple capacity follow-up, assume 120 notifications arrive per second while workers complete 80. Backlog grows by 40 per second, or 12,000 over five minutes, ignoring retries. If arrivals stop, those workers need 150 seconds to drain that backlog. These are scenario calculations, not measured Monzo throughput.

Ask whether additional workers increase provider capacity or merely hit its rate limit harder. Monitor oldest pending age and failure categories as well as queue length. A throughput estimate helps decide which constraint to investigate; it does not justify unlimited retry or parallelism.

Adapt to new constraints while preserving shared understanding

Our preparation inference is to restate the changed requirement before revising the diagram. Suppose the interviewer adds multiple sites. Clarify whether customers reserve from one site or may draw from a global pool. Site-scoped inventory can preserve the original invariant locally; cross-site transfer introduces a separate ownership decision.

If availability must survive loss of the authoritative store, explain the trade-off. Continuing admissions against stale capacity can violate the invariant. Our first proposal fails closed for new holds while allowing clearly labeled availability browsing; whether that is acceptable depends on business requirements. Do not quietly switch from strict admission to optimistic overselling.

If the interviewer identifies a flaw, use it as new evidence: “My worker can release capacity twice because I did not make the transition conditional. I will move the release into the active-to-expired transaction.” Update the state model and show why the duplicate job now becomes a no-op.

For a manager, maintain the distinction between a design proposal and delivery ownership. Monzo's September 18, 2025 EM expectations discuss driving an area and working with partners on product decisions. This is role background rather than an interview scoring sheet. EM expectations.

In our rehearsal, identify the remaining implementation risks: database concurrency proof, provider retry behavior, clock policy, and operational ownership. Assign each a validation artifact rather than a vague promise to “have engineers figure it out.” A manager can show technical judgment without claiming to personally configure every service.

Rehearse an answer another person can retell

Finish the exercise with a short evidence-based recap: the reservation store owns capacity, admission atomically creates a hold, replay returns the same result, conditional expiry releases capacity once, and notification failure does not undo confirmation. Then name one unresolved assumption and its consequence.

Ask a practice partner to reconstruct the request path from your diagram without help. If they cannot explain where confirmation competes with expiry, improve the arrows and labels. This tests shared understanding more directly than counting technologies on the page.

Also rehearse an unfamiliar term. State what behavior you need, explain a simple implementation, and ask whether that abstraction fits the exercise. Honest uncertainty paired with a concrete next step is more useful than a confident component name whose failure behavior you cannot defend.

Sources and Further Reading

Sources checked October 6, 2026. Historical guidance and individual accounts do not establish an unchanged current process; the worked system and calculations are original practice material.