Skip to main content

Founding engineer system design interview questions

9 questions on system design for founding engineer candidates. Expect prompts such as “End-to-end architecture for a B2B SaaS MVP” and “File upload and async processing pipeline”, each with a worked answer outline and the follow-ups interviewers push on.

Questions

Showing 1 to 9 of 9 system design questions.

As asked

Design the full technical architecture for a B2B SaaS product that needs web app, REST API, background jobs, and multi-tenant data. You have two engineers and three months. Draw the components and explain every technology choice.

Sample answer outline

Strong answer picks a deployable stack (Next.js full-stack, or Express + Next.js), Postgres as the single database, a Postgres-backed job queue (pg-boss or similar) to avoid Redis ops overhead, and a single cloud account with containerised deploys. Explicitly rules out microservices, Kubernetes, and message brokers as premature. Covers auth, file storage (S3), transactional email, and the single DNS+TLS entry point.

Expect these follow-ups

  • Six months in, the single Postgres instance is the bottleneck. What is your first move?
  • How does your architecture change when a customer requires data residency in the EU?
system-designb2b-saasarchitecture0-to-1full-stack

As asked

Design a system where users upload CSV files up to 50 MB, the system validates and processes each row asynchronously, and the user sees live progress updates in the browser. Handle errors at the row level and allow re-processing of failed rows.

Sample answer outline

Upload: presigned S3 URL from the API so the file goes directly to S3 without hitting the app server. Process: a job is enqueued after upload; the worker streams the file from S3 in chunks to avoid loading 50 MB into memory, processes rows, and writes per-row status to a DB table. Progress: the browser polls or subscribes via SSE to a /jobs/:id/status endpoint. Re-processing: a retry endpoint requeues only rows with status='failed'.

Expect these follow-ups

  • A CSV with 500,000 rows takes 20 minutes to process. How do you give the user meaningful progress updates without hammering the database?
  • The worker crashes halfway through. How do you resume from where it stopped?
system-designfile-uploads3background-jobsstreaming

As asked

Design a notification system that sends alerts via email, in-app feed, and Slack webhooks based on per-user preferences. It must handle at least 10,000 notifications per hour at launch and scale to 1 million per hour within a year.

Sample answer outline

Separate notification creation from delivery: a notifications table records every event; a delivery engine reads preferences and fans out to channel-specific workers. Email via a transactional provider (SendGrid, Postmark) with bounces tracked. In-app via a feed table with cursor-based read pagination. Slack via outgoing webhooks with retry logic. At 1M/hr, the fan-out worker needs to batch and the channel workers need horizontal scaling behind a proper queue.

Expect these follow-ups

  • A user has ten thousand notifications and opens their in-app feed for the first time. How do you avoid a slow query?
  • How do you ensure a notification is delivered exactly once even if the delivery worker crashes mid-send?
system-designnotificationsemailqueuesscaling

As asked

Your customers need to search their own documents stored in Postgres. There are 5 million rows. Design the search feature: index strategy, query interface, ranking, and your decision about whether to stay in Postgres or move to a dedicated search engine.

Sample answer outline

At 5 million rows, Postgres tsvector with a GIN index handles full-text search well. Candidate should cover ts_rank for relevance scoring, per-tenant filtering in the WHERE clause before the text match to keep index scans small, and the tsvector update trigger or generated column pattern. Move to Elasticsearch or Typesense only when Postgres search becomes the query latency bottleneck or when relevance tuning needs outgrow tsvector.

Expect these follow-ups

  • A customer searches in Japanese. How does tsvector handle languages without whitespace word boundaries?
  • How do you keep the search index up to date when documents are edited?
system-designsearchpostgresfull-text-searchscaling

As asked

Design the billing integration for a SaaS product that charges customers based on API calls per month. Cover metering, Stripe integration, webhook handling, invoice generation, and how you handle edge cases like mid-month plan changes and failed payments.

Sample answer outline

Metering: count events in a usage table partitioned by customer and billing period, flush to Stripe Usage Records via the Metered Billing API. Webhooks: handle invoice.payment_failed to gate access and customer.subscription.deleted to deprovision. Mid-month plan change: Stripe prorates by default but you must reconcile your local subscription state. Failed payments: exponential retry via Stripe Smart Retries plus a dunning email sequence.

Expect these follow-ups

  • Your usage metering service has a bug and undercharges customers by 30% for a whole month. How do you handle billing corrections?
  • How do you prevent Stripe's webhook from being replayed after your server crashes mid-processing?
system-designbillingstripepaymentswebhooks

As asked

Design a deployment pipeline for a containerised Node.js API with a Postgres database that achieves zero downtime, handles database migrations safely, and can roll back within five minutes if something goes wrong.

Sample answer outline

Blue-green or rolling deploy with health checks before traffic switch. Database migrations run before the new container starts, using the expand-contract pattern so old and new code can coexist on the same schema during the transition window. Rollback: traffic switch back to old containers is fast; the database schema must remain backward-compatible so rollback does not require a schema revert. Candidate should name where the migration runs (a pre-deploy hook, not inside the app startup).

Expect these follow-ups

  • A migration takes 45 minutes because it backfills a large table. How do you deploy the app code without waiting?
  • Your canary deployment shows a 2% error rate increase. What is your automated rollback trigger?
system-designdeploymentzero-downtimeci-cddatabases

As asked

Your product integrates with five third-party APIs: Salesforce, HubSpot, Slack, GitHub, and an AI provider. Design the integration layer so that when one external API is down, it does not degrade the rest of your product and retries happen automatically.

Sample answer outline

Each integration should be isolated: a separate worker or queue per integration so a Salesforce outage does not clog the Slack queue. Circuit breaker pattern per integration to fail fast when a provider is consistently down. Outbox pattern for guaranteed at-least-once delivery even if the third-party is unavailable at request time. Token refresh (OAuth) centralized in a shared credentials store with automatic rotation.

Expect these follow-ups

  • Salesforce has a 10,000 API call per day limit. How do you prevent your background jobs from burning through it?
  • How do you test your integration layer without hitting real third-party APIs in CI?
system-designintegrationsresiliencecircuit-breakerapi-design

As asked

Your monolith has grown to a point where you are extracting two services: a billing service and an AI processing service. Design the API gateway layer that handles authentication, routing, rate limiting, and request logging without becoming its own maintenance burden.

Sample answer outline

For a small team, a thin reverse proxy (Caddy, Nginx, or a lightweight custom Express gateway) beats a full API management platform. Auth is verified at the gateway level using a shared secret or JWT validation before forwarding to services. Rate limiting at the gateway means it is enforced consistently across services. Candidate should warn against the gateway becoming too smart, encoding business logic that should live in services.

Expect these follow-ups

  • How do you propagate the authenticated user identity from the gateway to downstream services without re-validating the JWT?
  • Your gateway is a single point of failure. How do you make it highly available without over-engineering?
system-designapi-gatewaymicroservicesarchitecturesecurity

As asked

A customer's legal team requires a tamper-evident audit log of every action taken by any user within their account. Design the audit log system including storage, query interface, and how you prove to an auditor that records have not been deleted or altered.

Sample answer outline

Core design: an audit_events table with a serial ID, event type, actor, target resource, timestamp, and a JSON payload. Make it append-only by revoking DELETE and UPDATE permissions at the database role level. Tamper evidence: hash chain where each row stores SHA-256(previous_hash + current_row_content), verifiable by re-computing the chain. Query interface: filter by actor, resource, time range with cursor pagination. Long-term retention: archive to immutable S3 object storage with object lock.

Expect these follow-ups

  • A customer deletes their account. GDPR requires you to delete their personal data. How do you reconcile that with an append-only audit log?
  • How do you query the audit log for all actions on a specific resource across 50 million events without a full table scan?
system-designaudit-logcompliancepostgressecurity