Senior Full Stack System Design Interview Questions: How to Architect the Whole System (2026)
How senior full stack developers should answer system design questions: a complete framework covering frontend, API, database, and deployment in one story.
On this page
Search "system design interview" and almost everything you find assumes you're interviewing for a backend or infrastructure role. Load balancers, sharding strategies, consistent hashing, the CAP theorem. All genuinely useful, and almost none of it tells you what happens when the job title says "full stack" and the interviewer expects you to own the frontend too.
A senior full stack system design interview is a different exercise. You're not designing a backend that could theoretically serve any client. You're designing one coherent system: how the frontend renders, how it talks to the backend, how the backend stores and serves data, and how the whole thing gets deployed and monitored. The interviewer wants to see whether a frontend decision changes a backend decision, and whether you notice when it does.
This post covers the framework for structuring that answer, then walks through two complete worked examples end to end, frontend through deployment, narrated the way you'd actually want to say them out loud in a real 45-60 minute interview. It's part of the same interview-prep series as our DSA interview questions guide, which covers the coding-round half of a senior interview loop.
What Makes a Full Stack System Design Answer Different
A strong backend-only system design answer for most prompts covers API design, service boundaries, database choice, caching strategy, and scaling the backend under load. That's a complete, senior-level answer for a pure backend role.
A strong full stack answer covers all of that, plus a set of concerns that only show up once you own the client too:
- Rendering strategy: SSR, CSR, SSG, or a hybrid, and why, tied to the actual requirements: SEO needs, time-to-interactive targets, and how much of the UI is personalized per user.
- State management approach: how the frontend tracks and synchronizes state, especially for anything real-time or collaborative, and how that choice constrains what the API needs to expose.
- The API contract itself, designed from both directions: not just what the backend exposes, but what the frontend actually needs to render efficiently, which sometimes changes the API shape entirely (a single aggregated endpoint instead of three separate REST calls, for example).
- Caching at every layer: not just backend and database caching, but CDN caching for static assets, browser caching, and where client-side caching (React Query, SWR, or similar) reduces backend load.
- Deployment and CI/CD: how frontend and backend deploy independently or together, what a bad deploy looks like for each side, and what you'd actually monitor.
| Backend-Only Answer | Full Stack Answer | |
|---|---|---|
| Stops at | API design, database, and backend scaling | Continues through frontend rendering, state, and deployment |
| API design driven by | Service boundaries and the data model | Both the data model and what the frontend needs to render efficiently |
| Caching discussion | Database and application-layer caching | CDN, browser, client-side, application, and database caching |
| Deployment | Rarely mentioned unless asked | Expected unprompted, per multiple 2026 hiring sources |
The core skill being tested: can you reason about how a frontend requirement (real-time updates, offline support, personalization) ripples backward into backend and data decisions, and vice versa. That back-and-forth reasoning, not a longer list of components, is what separates a senior full stack answer from a junior one.
The Framework: How to Structure a 45-60 Minute Answer
This is a full-stack-adapted version of the standard system design framework. The sequence matters: define the API contract early, because it's the seam where frontend and backend reasoning meet.
- 1
Clarify requirements, including frontend-specific ones
Beyond the usual functional and non-functional questions (how many users, read/write ratio, latency targets), ask about target devices, offline behavior expectations, and how real-time the experience needs to feel. These answers directly shape your rendering and state management choices later.
- 2
Define the API contract before diving into either side deeply
Sketch the core endpoints or message types at a high level. This becomes your reference point: every frontend and backend decision you make afterward should be consistent with it, and if you need to change it later, say so out loud and explain why.
- 3
Design the frontend architecture
Cover rendering strategy, state management, and how data flows from the API contract into the UI. Then explain how the UI handles loading, error, and offline states.
- 4
Design the backend architecture
Cover service boundaries, business logic placement, and how the backend fulfills the API contract from step two. Then explain how it scales.
- 5
Design the data layer
Justify your database choice by the actual data shape and access patterns, not by default habit. Then cover your caching strategy across every layer, not just the database.
- 6
Cover deployment and observability, even if not asked directly
Explain how frontend and backend deploy, together or independently, what a bad deploy looks like for each side, and what you'd monitor to catch problems before users do.
- 7
Stress-test the design
Ask what breaks at 10x scale, what the single point of failure is, and what you'd cut for an MVP versus what's required from day one.
Worked Example: Design a Real-Time Collaborative Document Editor
This is a strong full-stack-scoped prompt because nearly every decision on one side has a direct consequence on the other. Here's how a complete answer flows, section by section, the way you'd narrate it in the interview.
Requirements
- Functional: multiple users edit the same document simultaneously, see each other's cursors and changes in near real time, and changes persist and are recoverable if a user disconnects.
- Non-functional, including frontend-specific ones: local edits should feel instant, under 100ms perceived latency even before the server confirms, the editor should tolerate brief network drops without losing local changes, and the initial document load should be fast even for long documents.
API Contract
Two channels, because they serve different needs: a WebSocket connection for real-time edit synchronization (low latency, persistent connection, small frequent messages), and a REST API for document CRUD operations (create, list, delete documents, fetch document metadata) where a persistent connection isn't needed.
{
"type": "edit" | "cursor" | "presence",
"documentId": "string",
"operation": { "...": "the actual edit operation" },
"version": "number, for conflict resolution",
"userId": "string"
}GET /documents # list user's documents
POST /documents # create a new document
GET /documents/:id # fetch document + current state
DELETE /documents/:idDeciding on this two-channel split early is exactly the kind of API-contract decision that shapes both the frontend and backend work that follows.
Frontend Architecture
- Rendering strategy: SSR for the initial document list and document metadata (fast first paint, works without JavaScript for the shell), but the actual editing surface is a CSR-only experience once loaded, since it needs a persistent WebSocket connection and rich client-side interactivity that SSR doesn't help with.
- State management: optimistic local updates. When a user types, the change applies to local document state immediately, before the server confirms it, which is what delivers the sub-100ms perceived latency requirement. The change is simultaneously sent over the WebSocket, and if the server rejects or needs to reconcile it (because another user edited the same region), the client applies a correction.
- Conflict resolution UI: when two users edit overlapping text, the frontend needs to visually resolve this without jarring jumps: showing other users' cursors and selections in real time, and smoothly merging remote changes without disrupting the local user's typing flow. This is a frontend-specific complexity that a backend-only answer would never surface, and mentioning it explicitly signals real full-stack ownership.
- Offline tolerance: local edits queue in memory (or IndexedDB for longer disconnects) and replay over the WebSocket once the connection recovers, using the version number in the message shape to detect and resolve conflicts with changes that happened while offline.
Backend Architecture
- Conflict resolution algorithm choice: CRDTs (Conflict-free Replicated Data Types) over Operational Transform (OT) for this use case. OT requires a central sequencing authority and is more complex to implement correctly, while CRDTs let each client apply operations locally and guarantee eventual consistency across all clients without a central bottleneck, which fits better with the offline-tolerance requirement above.
- WebSocket server scaling: a single WebSocket server can hold many connections, but horizontal scaling requires either sticky sessions (routing a user's reconnects back to the same server, simpler but limits rebalancing) or a pub/sub layer (Redis Pub/Sub or similar) that lets any server instance broadcast document changes to all connected clients for that document regardless of which server they're on. For a collaborative editor where users on the same document might land on different server instances, the pub/sub approach is the more scalable choice, and explaining that trade-off explicitly is a senior-level signal. If you're building this on Node.js, our Node.js interview questions guide covers the event loop and connection-handling fundamentals that this kind of WebSocket server design leans on.
- Document service: handles CRUD operations, persists the CRDT operation log, and reconstructs current document state by replaying or snapshotting operations.
Data Layer
A document-oriented store (MongoDB or similar) fits naturally here, since the CRDT operation log and document snapshots are naturally document-shaped, not relational. Justify this against the actual access pattern (append operations, read the latest snapshot, occasionally read historical versions), not just as a default preference. Our NoSQL interview questions guide covers the access-pattern reasoning behind this kind of document store choice in more depth.
For versioning and history, store periodic snapshots of document state (every N operations, or every few minutes) alongside the raw operation log. That lets you reconstruct any point in history without replaying every operation from the beginning for a long-lived document.
Caching
The initial document list and metadata (REST endpoints) benefit from standard HTTP and CDN caching with short TTLs, since that data changes infrequently relative to how often it's read.
Deployment and Observability
Frontend and backend deploy independently, since the WebSocket protocol and REST API contract are versioned and backward-compatible. That allows frontend deploys without requiring a simultaneous backend deploy, and vice versa.
- WebSocket connection count and reconnection rate: a spike in reconnections signals a problem before users start complaining.
- Edit-to-broadcast latency: how long from a user's edit until other connected clients see it.
- Conflict resolution failure rate: CRDT merges that require unusual fallback handling.
Second Worked Example: Job Board with Real-Time Application Status
A shorter walkthrough applying the same framework to a different problem shape, to reinforce the pattern rather than repeat the full depth of the first example. Job seekers browse and apply to listings, employers post jobs and update application statuses, and applicants see status changes (reviewed, interview scheduled, rejected) without needing to refresh.
- API Contract: REST for job browsing, search, and application submission, standard CRUD that doesn't need real-time. Server-Sent Events (SSE), not WebSockets, for status update notifications, since this is one-directional (server to client only) and doesn't need the bidirectional complexity WebSockets provide. Choosing SSE over WebSockets here, and explaining why the simpler tool fits the actual requirement, is itself a senior-level signal; reaching for WebSockets by default when SSE suffices is a common mistake.
- Frontend: SSR for job listing pages, since SEO matters here and job seekers frequently arrive from search engines, and CSR for the logged-in dashboard where applicants track their applications. The dashboard subscribes to an SSE stream for live status updates and shows a toast notification plus updates the relevant application card in place.
- Backend: a job listing service (mostly read-heavy, benefits from aggressive caching) and an application service (write-heavy on submission, triggers SSE events on status changes). These are natural service boundaries because their read/write patterns and scaling needs differ significantly. If you're structuring these as actual services with clear module boundaries and dependency injection, our NestJS interview questions guide covers the service-layer patterns this kind of split relies on.
- Data layer: a relational database fits well here, since job listings, applications, and employers have clear relational structure with well-defined joins (an application belongs to a job, which belongs to an employer). This is a deliberate contrast with the CRDT example: justify the choice by the actual data shape each time, rather than defaulting to the same database type for every problem. Our SQL database interview questions guide covers the join and normalization reasoning behind a call like this.
- Caching: job listing pages are heavily cacheable at the CDN layer, since the same content is served to many anonymous users, while the authenticated dashboard and SSE stream are not cacheable at all, since they're user-specific and need to be current.
- Deployment: the SSE endpoint needs to handle long-lived connections gracefully during deploys, requiring connection draining (letting existing SSE connections finish or gracefully reconnect rather than being abruptly killed) as part of the deploy process. That's worth mentioning explicitly since it's a common gap in naive deployment setups. If the deployment target is Kubernetes, our Kubernetes interview questions guide covers rolling deploys and readiness probes, the mechanisms that make graceful connection draining possible in the first place.
Common Mistakes Full Stack Candidates Make
- Treating it as two separate mini-interviews: designing the backend thoroughly, then tacking on "and the frontend would be a React app that calls these APIs" as an afterthought. The interviewer is specifically listening for the connective reasoning between layers, not two disconnected halves.
- Over-indexing on backend distributed-systems trivia that isn't relevant to the actual prompt: bringing up Raft consensus or Paxos for a prompt that doesn't involve distributed consensus at all signals memorized trivia rather than applied judgment. Use the concepts the specific problem actually calls for.
- Under-specifying the frontend: "we'd have a React app that fetches from the API" is not a frontend architecture. Rendering strategy, state management approach, and how the UI handles loading, error, and offline states are all expected at senior level, the same way API design and database choice are expected on the backend side.
- Never mentioning deployment or monitoring unprompted: multiple 2026 hiring sources confirm interviewers now explicitly grade for operational maturity, deployment strategy, and monitoring at senior level, not just architectural correctness. Bring it up even if the interviewer doesn't ask directly.
- Defaulting to the same technology choices regardless of the problem: choosing a relational database for every problem, or WebSockets for every real-time-adjacent feature, without justifying the choice against the specific data shape or communication pattern, reads as habit rather than judgment. The two worked examples above deliberately make different choices (CRDT and document store vs. relational, WebSocket vs. SSE) specifically because the underlying problems differ.
Quick Reference: The Full Stack System Design Checklist
Use this as a mental checklist during the actual interview, not a script to recite.
- Requirements: functional and non-functional, including device targets and offline behavior, plus scale estimates: users, read/write ratio, latency targets.
- API Contract: defined early and referenced throughout, shaped by what the frontend needs to render efficiently, not just the data model.
- Frontend: rendering strategy (SSR/CSR/SSG/hybrid) justified against requirements, a state management approach, and loading, error, and offline state handling.
- Backend: service boundaries justified by actual responsibilities and scaling needs, and clear business logic placement.
- Data Layer: database choice justified by data shape and access patterns, plus a caching strategy across CDN, browser, client-side, application, and database layers, including where NOT to cache.
- Deployment and Observability: how frontend and backend deploy (together or independently), what you'd monitor, and what a bad deploy looks like for this specific system.
- Stress Test: what breaks at 10x scale, single points of failure, and MVP scope vs. day-one requirements.
Frequently Asked Questions
Do I need deep Kubernetes or DevOps knowledge for a full stack system design interview?
No. You need to show that you think about deployment and monitoring at all, not that you can recite Kubernetes internals. Interviewers are checking for operational awareness, not certification-level infrastructure depth.
- What's expected: naming whether frontend and backend deploy together or independently, what a bad deploy looks like for your specific system, and two or three concrete things you'd monitor.
- What's not expected: explaining how a Kubernetes scheduler works, writing YAML, or debating service mesh options.
- Where deeper knowledge helps: if the role is explicitly full stack plus infrastructure, having concepts like rolling deploys, readiness probes, and connection draining ready to name (covered in our Kubernetes interview questions guide) will strengthen the answer, but it's not the bar for a standard full stack loop.
How much frontend detail is actually expected in a full stack system design interview?
Enough that a reviewer could tell you've actually built a non-trivial frontend, not just consumed one. "We'd have a React app that calls the API" is not an architecture, it's a placeholder.
- Rendering strategy: SSR, CSR, SSG, or a hybrid, justified against the actual requirements (SEO, time-to-interactive, personalization).
- State management: how the frontend tracks and synchronizes state, especially anything real-time or collaborative.
- Loading, error, and offline states: how the UI behaves when data is slow, missing, or the network drops.
Should I name specific frameworks like React or Vue, or reason framework-agnostically?
Reason framework-agnostically first, then name a specific framework if it's directly relevant to a decision you're making. What matters is the underlying concept: rendering strategy, state synchronization, and data flow, not which framework's API you use to implement it.
It's fine, and often useful, to say "in React this would be a custom hook wrapping a WebSocket connection" if it makes your reasoning concrete. Just don't let framework trivia replace the actual architectural decision.
What are interviewers actually grading for in a full stack system design interview?
- Cross-layer reasoning: whether a frontend requirement changes a backend decision, and whether you notice when it does.
- API contract quality: whether the contract you design serves what the frontend actually needs to render, not just the backend's data model.
- Justified technology choices: whether your database, caching, and communication protocol choices are argued from the problem's actual shape, not defaulted to habit.
- Operational maturity: whether you bring up deployment and monitoring unprompted.
- Communication: whether you can narrate a 45-60 minute design clearly, adjusting as new constraints come up.
WebSockets vs Server-Sent Events (SSE): which should I use for real-time features?
| Trait | WebSockets | Server-Sent Events (SSE) |
|---|---|---|
| Direction | Bidirectional | One-directional, server to client only |
| Setup complexity | Higher: a dedicated protocol and connection handling | Lower: works over plain HTTP with a simple event stream |
| Good fit | Collaborative editing, chat, anything the client also needs to send frequently | Status notifications, live feeds, anything the client only needs to receive |
| Reconnection handling | You implement it yourself | Built into the browser's EventSource API |
Use SSE when the data only flows server to client, like application status updates on a job board. Use WebSockets when the client also needs to send frequent updates back, like cursor positions and edits in a collaborative document editor. Reaching for WebSockets by default when SSE would do the job is one of the common mistakes covered above.
How long should a full stack system design answer take?
Plan for the standard 45-60 minute interview slot, paced across the seven-step framework above. Requirements gathering and the API contract should take roughly the first 10-15 minutes, frontend and backend architecture the next 20-25 minutes combined, and data layer, deployment, and stress-testing the remaining time.
Don't try to cover every detail of every layer with equal depth. Go broad first across all seven steps, then let the interviewer's follow-up questions tell you where to go deep. An answer that reaches deployment and a stress test in 50 minutes beats one that spends 40 minutes perfecting the database schema and never gets there.
Related Articles
30 Node.js Interview Questions and Answers (2026)
30 Node.js interview questions with full answers: event loop, streams, clustering, worker threads, memory leaks, and security. Updated for 2026.
30 NestJS Interview Questions and Answers (2026)
30 NestJS interview questions with full answers: modules, DI, guards, pipes, interceptors, JWT auth, microservices, and testing. Updated for 2026.
40 SQL Interview Questions and Answers (2026)
40 SQL and relational database interview questions covering joins, indexes, ACID, window functions, CTEs, MySQL vs PostgreSQL, and query challenges.