← Airbnb Interview Insights

Airbnb·Software Engineer·Onsite - System Design / Architecture·Senior

SeniorPrefer not to say
Apr 2026

Summary

Airbnb system design round, and they threw the full notification platform problem at me. Breadth was insane: APIs, queuing, retries, compliance, multi-region, the works. Left feeling like I'd covered maybe 60% of what they wanted.

Questions Asked (9)

Q1

Design a multi-channel notification system supporting email, SMS, push, and in-app delivery. Walk through the full architecture including producers, dispatchers, worker pools, and provider adapters.

System DesignAPI & Integrations
Author's notes

I started with the producer API and worked outward, which felt right in the moment but meant I spent too long on the front-end contract before touching the queue topology.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements (scale, latency, reliability, channels) and then present a high-level architecture with producers, a dispatcher, worker pools, and provider adapters. Dive into each component, discussing trade-offs like queuing, retries, idempotency, and failure handling, and conclude with monitoring and scaling considerations.

Pro tip: Emphasize idempotency and deduplication at the dispatcher level to prevent duplicate notifications, and discuss how to handle provider-specific rate limits and failures with circuit breakers and fallback mechanisms.

1. Clarify Requirements and Scope

Ask about expected volume, latency requirements, delivery guarantees, and channel priorities. Define functional and non-functional requirements to guide the design.

2. High-Level Architecture

Sketch the main components: producers (services generating notifications), dispatcher (routes and enqueues), worker pools (process and send), and provider adapters (integrate with external services). Explain data flow.

3. Deep Dive into Components

Detail each component: producers use APIs or message queues; dispatcher handles routing, deduplication, and prioritization; worker pools scale horizontally and manage retries; adapters abstract provider APIs and handle rate limits.

4. Reliability and Scalability

Discuss how to ensure at-least-once delivery, idempotency, retry policies, dead-letter queues, and circuit breakers. Explain scaling strategies for each component and handling of provider outages.

5. Monitoring and Trade-offs

Cover monitoring (metrics, logging, tracing), alerting, and how to handle failures. Summarize key trade-offs made (e.g., consistency vs. availability, latency vs. throughput).

Key Points to Mention

  • Use of message queues (e.g., Kafka, RabbitMQ) for decoupling producers and workers, ensuring scalability and fault tolerance.
  • Idempotency and deduplication mechanisms to avoid duplicate notifications, especially with retries.
  • Worker pool design: dynamic scaling, concurrency control, and handling of long-running tasks.
  • Provider adapters: abstraction layer for different providers (e.g., SendGrid, Twilio, APNs, FCM), with rate limiting, retries, and fallback.
  • Delivery guarantees: at-least-once vs. exactly-once, and how to achieve them with idempotent consumers.
  • Monitoring and observability: metrics (success rate, latency), logging, tracing, and alerting for failures.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q2

How would you model user notification preferences, including per-channel settings, per-category opt-outs, and quiet hours?

Data ModelingSystem Design
Author's notes

This part I actually felt okay about.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying requirements and scale, then propose a normalized data model with separate tables for user preferences, channel settings, category opt-outs, and quiet hours. Discuss how to efficiently evaluate whether a notification should be sent, considering caching and denormalization for read-heavy paths.

Pro tip: Mention that quiet hours must be stored with the user's timezone and that you'd handle DST transitions carefully—this shows attention to real-world edge cases. Also, suggest a fallback to default preferences when specific settings are missing, which simplifies the model and improves performance.

1. Clarify requirements and scale

Ask about expected number of users, notification volume, and whether preferences are global or per-notification-type. Understand if real-time updates are needed and how often preferences change.

2. Design core entities and relationships

Define tables: User, Channel (email, push, SMS), Category (promotions, reminders, social), and UserPreference linking user, channel, and category with opt-in/out flags. Include a separate table for quiet hours with start/end times and timezone.

3. Optimize for read-heavy evaluation

Since notifications are sent frequently, consider denormalizing preferences into a single document per user (e.g., JSON blob) or using a cache like Redis. Discuss trade-offs between normalization for writes and denormalization for reads.

4. Handle quiet hours and timezones

Store quiet hours as local times with the user's timezone. When evaluating, convert to UTC or compare in user's local time, accounting for DST. Consider allowing multiple quiet hour ranges per day.

5. Define evaluation logic and fallbacks

Outline the algorithm: check global opt-out, then channel-specific, then category-specific, then quiet hours. Use default preferences when no explicit setting exists. Discuss how to handle conflicts (e.g., category opt-in but channel opt-out).

Key Points to Mention

  • Normalized schema with separate tables for users, channels, categories, and preferences to avoid data duplication.
  • Use of a composite key (user_id, channel_id, category_id) for granular opt-in/out settings.
  • Quiet hours stored with timezone and handling of daylight saving time transitions.
  • Caching or denormalization (e.g., Redis, JSON column) to speed up notification eligibility checks.
  • Default preference fallback hierarchy: user-specific > global default > system default.
  • Consideration of frequency capping or throttling as an extension to the model.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q3

How do you handle idempotency and deduplication for notifications, and what are the trade-offs between exactly-once and at-least-once delivery semantics?

System DesignTechnical Trade-offs
Author's notes

Blanked for a second on the exactly-once framing.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by defining idempotency and deduplication in the context of notifications, then explain how you would implement them using idempotency keys and deduplication stores. Compare exactly-once and at-least-once delivery semantics, highlighting trade-offs in terms of complexity, latency, and reliability, and conclude with a practical recommendation for a system like Airbnb's.

Pro tip: Emphasize that exactly-once delivery is often a distributed systems myth; instead, focus on achieving effectively-once processing through idempotent consumers and deduplication, which balances reliability and simplicity.

1. Define Idempotency and Deduplication

Clarify that idempotency ensures repeated operations have the same effect, while deduplication prevents processing the same message multiple times. Explain their importance in notification systems to avoid spamming users.

2. Implement Idempotency and Deduplication

Describe using unique idempotency keys per notification and a deduplication store (e.g., Redis or database) to track processed keys. Mention TTL for keys to manage storage.

3. Compare Delivery Semantics

Explain at-least-once (messages may be duplicated but not lost) vs exactly-once (no duplicates, no loss). Discuss how exactly-once is hard to achieve in distributed systems and often approximated with idempotency.

4. Analyze Trade-offs

Discuss trade-offs: at-least-once is simpler and more reliable but requires deduplication; exactly-once reduces duplicates but adds complexity, latency, and potential failure points. Consider cost, scalability, and user experience.

5. Recommend an Approach

Suggest a pragmatic solution: use at-least-once delivery with idempotent consumers and deduplication to achieve effectively-once processing. Highlight how this balances reliability and complexity for notification systems.

Key Points to Mention

  • Idempotency keys: unique identifiers for each notification to ensure repeated processing doesn't cause duplicate sends.
  • Deduplication store: a fast, persistent store (e.g., Redis) to track processed keys, with TTL to avoid unbounded growth.
  • At-least-once vs exactly-once: at-least-once guarantees delivery but may duplicate; exactly-once is ideal but impractical in distributed systems.
  • Trade-offs: exactly-once requires coordination (e.g., two-phase commit) leading to higher latency and lower availability; at-least-once is simpler and more scalable.
  • Effectively-once processing: combining at-least-once delivery with idempotent consumers to achieve the illusion of exactly-once.
  • Real-world examples: how companies like Airbnb handle notifications with idempotency and deduplication to prevent spam and ensure reliability.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q4

Describe how you'd implement templating and localization for notification content across different channels and languages.

System DesignAPI & Integrations
Author's notes

Kept it pretty high level.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements: which channels (email, push, SMS, in-app), languages, and scale. Then propose a decoupled architecture with a templating service that manages versioned templates and a localization layer that handles translations, pluralization, and formatting. Walk through the end-to-end flow from trigger to delivery, highlighting key design decisions and trade-offs.

Pro tip: Emphasize the importance of separating content from code and using a translation management system (TMS) to enable non-engineers to update copy. Also, discuss how to handle dynamic content and fallbacks gracefully to avoid broken notifications.

1. Clarify Requirements and Constraints

Ask about the channels, languages, scale, and any compliance requirements. Understand the types of notifications and personalization needs.

2. Design the Templating System

Propose a template engine that supports placeholders, conditionals, and loops. Store templates in a versioned repository with metadata for channel and locale.

3. Implement Localization

Use a localization framework (e.g., ICU MessageFormat) to handle pluralization, gender, and date/number formatting. Integrate with a TMS for translations and manage fallback locales.

4. Orchestrate Rendering and Delivery

Design a service that fetches the appropriate template and locale data, renders the content, and passes it to channel-specific adapters for delivery.

5. Address Scalability and Maintenance

Discuss caching, versioning, A/B testing, and monitoring. Ensure the system can handle high throughput and allow easy updates without code deploys.

Key Points to Mention

  • Separation of concerns: templating engine vs. localization data vs. channel adapters
  • Use of industry-standard formats like ICU MessageFormat for pluralization and gender
  • Integration with a Translation Management System (TMS) for translator workflows
  • Caching strategies for templates and translations to reduce latency
  • Fallback mechanisms for missing translations or template errors
  • Versioning and A/B testing of templates to optimize engagement

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q5

How would you design scheduling, retry logic with exponential backoff, and rate limiting including per-recipient throttling?

System DesignTechnical Trade-offs
Author's notes

This was the meatiest part and I ran short on time.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the requirements and scale (e.g., number of recipients, message types, latency expectations) to frame the design. Then propose a high-level architecture with separate components for scheduling, retry handling, and rate limiting, and dive into each with specific algorithms and trade-offs. Finally, discuss how these components interact and handle edge cases like failures and overload.

Pro tip: Emphasize idempotency and observability from the start—design retries to be safe and include metrics for queue depths, retry rates, and throttle hits. This shows you think about production readiness, not just theoretical design.

1. Clarify Requirements and Scale

Ask about the volume of messages, number of recipients, latency requirements, and whether scheduling is one-time or recurring. Understand the delivery guarantees needed (at-least-once, exactly-once) and any compliance constraints.

2. High-Level Architecture

Propose a distributed system with a scheduler service, a queue (e.g., Kafka, SQS), worker pools for sending, and a rate limiter component. Explain how messages flow from scheduling to delivery and where retries and throttling fit in.

3. Scheduling Design

Describe how to store scheduled jobs (e.g., database with time-based indexes, or a dedicated scheduler like Quartz). Discuss how to handle time zones, recurring schedules, and scaling the scheduler horizontally without duplicate triggers.

4. Retry Logic with Exponential Backoff

Explain the retry mechanism: use a dead-letter queue for failures, implement exponential backoff with jitter to avoid thundering herds, and set a maximum retry limit. Ensure idempotency to prevent duplicate sends.

5. Rate Limiting and Per-Recipient Throttling

Design rate limiting at multiple levels: global, per-provider, and per-recipient. Use token bucket or sliding window algorithms, and store per-recipient counters in a fast data store (e.g., Redis). Discuss how to handle distributed rate limiting and avoid race conditions.

Key Points to Mention

  • Idempotency: Ensure that retries and duplicate messages don't result in multiple sends to the same recipient.
  • Exponential backoff with jitter: Prevents synchronized retries and reduces load on downstream services.
  • Distributed rate limiting: Use a centralized store like Redis with atomic operations, or a decentralized approach with consistent hashing.
  • Per-recipient throttling: Maintain counters per recipient to enforce limits like max N messages per hour, and consider using a sliding window for accuracy.
  • Observability: Instrument metrics for queue sizes, retry counts, throttle rates, and alert on anomalies.
  • Trade-offs: Discuss consistency vs. availability in rate limiting, and latency vs. throughput in scheduling.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q6

How do you track delivery status across providers and surface that data to upstream services?

System DesignData Modeling
Author's notes

Webhook callbacks from providers writing into a status store, with a metadata table per notification event.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scope: which providers, what delivery statuses, and how upstream services consume the data. Then propose a normalized event-driven pipeline that ingests provider webhooks, reconciles with polling, and exposes a unified status API with idempotent updates and clear data contracts.

Pro tip: Emphasize idempotency and eventual consistency: provider webhooks can be duplicated or out of order, so design status updates as idempotent events with versioning or timestamps to resolve conflicts. Also mention the need for a dead-letter queue and reconciliation job to handle missed events.

1. Clarify Requirements and Scope

Ask about the number of providers, expected throughput, latency requirements, and how upstream services need to consume the data (e.g., real-time vs batch).

2. Design Ingestion Layer

Propose a unified ingestion service that receives provider webhooks and polls provider APIs as a fallback, normalizing payloads into a common event schema.

3. Model and Store Status Data

Define a canonical delivery status model (e.g., created, picked_up, in_transit, delivered, failed) and store events in an append-only log or database with idempotency keys.

4. Expose to Upstream Services

Provide a read API (REST or GraphQL) and/or publish events to a message bus (e.g., Kafka) for upstream services to subscribe to, ensuring low latency and scalability.

5. Handle Failures and Reconciliation

Implement retries, dead-letter queues, and a periodic reconciliation job to detect and correct missed or inconsistent status updates.

Key Points to Mention

  • Idempotency and deduplication of provider events using unique event IDs or idempotency keys.
  • Event-driven architecture with a message queue (e.g., Kafka) for decoupling and scalability.
  • Canonical data model that normalizes disparate provider statuses into a unified set of states.
  • API design for upstream services: REST endpoints with pagination and filtering, or GraphQL subscriptions.
  • Reconciliation and backfill strategies to handle missed webhooks or provider outages.
  • Monitoring and alerting on delivery status lag, error rates, and data consistency.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q7

How would you ensure multi-region reliability and handle failures in this notification system?

System DesignTechnical Trade-offs
Author's notes

Talked about active-active with regional queues and a global metadata store for dedup.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the system's requirements and constraints, then outline a multi-region architecture that ensures high availability and fault tolerance. Discuss trade-offs between consistency, latency, and cost, and describe failure handling mechanisms like replication, failover, and graceful degradation.

Pro tip: Emphasize idempotency and exactly-once processing to avoid duplicate notifications during failover, and mention how you'd monitor and test failure scenarios with chaos engineering.

1. Clarify Requirements and Constraints

Ask about scale, latency requirements, consistency needs, and budget to tailor your design. This shows you understand that reliability strategies depend on business context.

2. Design Multi-Region Architecture

Propose an active-active or active-passive setup with data replication across regions. Consider using a global load balancer to route traffic and ensure low latency.

3. Implement Failure Detection and Recovery

Describe health checks, circuit breakers, and automatic failover. Explain how you'd handle partial failures, such as a single region outage, without affecting the entire system.

4. Ensure Data Consistency and Idempotency

Discuss replication strategies (e.g., synchronous vs asynchronous) and how to handle conflicts. Highlight idempotent operations to prevent duplicate notifications during retries or failovers.

5. Monitor, Test, and Iterate

Mention observability tools, alerting, and chaos engineering to validate reliability. Explain how you'd use metrics to continuously improve the system.

Key Points to Mention

  • Active-active vs active-passive multi-region deployment and trade-offs
  • Data replication strategies (synchronous, asynchronous) and consistency models
  • Failure handling: circuit breakers, retries with exponential backoff, dead-letter queues
  • Idempotency and exactly-once processing to avoid duplicate notifications
  • Monitoring, alerting, and chaos engineering for reliability testing
  • Cost and latency trade-offs in multi-region setups

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q8

What compliance considerations matter here, specifically around unsubscribe handling and data retention under GDPR and CCPA?

System DesignTechnical Trade-offs
Author's notes

Honestly the question I was least prepared for in a system design context.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by clarifying the scope of the system (e.g., marketing emails, user data deletion) and then systematically address GDPR and CCPA requirements for unsubscribe and data retention. Discuss how you would design the system to meet these requirements, including trade-offs between compliance, performance, and user experience.

Pro tip: Demonstrate awareness that compliance is not just a legal checkbox but a system design constraint that affects data models, APIs, and background jobs. Mention that you would collaborate with legal and privacy teams early to translate requirements into technical specifications.

1. Clarify scope and requirements

Ask clarifying questions to understand what data is collected, how it's used, and which regulations apply. Identify specific compliance obligations for unsubscribe and data retention under GDPR and CCPA.

2. Design unsubscribe handling

Outline a mechanism for users to unsubscribe from communications, ensuring it's immediate, persistent, and propagated across all systems. Consider GDPR's consent withdrawal and CCPA's opt-out of sale.

3. Implement data retention policies

Define retention periods for different data types, automate deletion or anonymization, and ensure data is not kept longer than necessary. Address GDPR's storage limitation and CCPA's deletion rights.

4. Address technical trade-offs

Discuss trade-offs such as soft vs. hard deletes, synchronous vs. asynchronous processing, and the impact on system performance and user experience. Consider how to handle data in backups and logs.

5. Ensure auditability and compliance verification

Describe how you would log consent changes, track deletion requests, and provide audit trails. Mention the need for regular compliance audits and testing.

Key Points to Mention

  • GDPR requires explicit consent for data processing and offers a right to withdraw consent (unsubscribe) at any time; CCPA gives consumers the right to opt out of the sale of personal information.
  • Unsubscribe must be honored promptly (e.g., within 10 days for CCPA) and should be propagated to all downstream systems, including third-party processors.
  • Data retention policies must specify retention periods based on business need and legal requirements; GDPR's storage limitation principle prohibits keeping data indefinitely.
  • CCPA provides a right to deletion, with exceptions for legal compliance, security, or completing transactions; GDPR's right to erasure is broader but also has exceptions.
  • Technical implementation: use a centralized consent management system, event-driven architecture for propagating changes, and automated data purging jobs.
  • Trade-offs: balancing data deletion with data integrity (e.g., referential integrity), performance impact of cascading deletes, and the need for soft deletes for audit purposes.

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.

Q9

How would you evolve this system to support A/B testing of notification content or send-time optimization, and how would you control costs at scale?

A/B Testing & ExperimentationProduct Strategy
Author's notes

Saved this for the end and ran out of time, so I gave a one-minute answer.

Create a free account to read the full note

AI HintsAI Generated

Suggested Approach

Start by outlining the current notification system architecture, then describe how you would introduce an experimentation layer with user bucketing, variant assignment, and metrics tracking. Finally, discuss cost controls such as batching, throttling, and using cheaper channels, while emphasizing statistical rigor and guardrail metrics.

Pro tip: Tie your answer to Airbnb's business goals by mentioning how A/B testing can improve key metrics like bookings and host engagement, and always include a plan for measuring long-term effects and avoiding novelty effects.

1. Understand the Current System

Briefly describe the existing notification system, including how notifications are triggered, personalized, and sent. Identify where experimentation hooks can be added.

2. Design the Experimentation Layer

Propose a service that assigns users to variants (e.g., different content or send times) using consistent hashing or a feature flag system. Ensure it integrates with the notification pipeline and logs exposure events.

3. Define Metrics and Guardrails

Specify primary metrics (e.g., click-through rate, conversion) and guardrail metrics (e.g., unsubscribe rate, cost per send). Set up statistical analysis to detect significant differences.

4. Implement Cost Controls

Discuss strategies like batching notifications, throttling high-frequency users, using cheaper channels (e.g., email vs. push), and leveraging send-time optimization to reduce wasted sends.

5. Monitor and Iterate

Explain how you would monitor experiment health, analyze results, and roll out winning variants. Mention the importance of automated rollback if guardrails are breached.

Key Points to Mention

  • User bucketing and consistent assignment to avoid contamination
  • Statistical significance and power analysis for reliable results
  • Send-time optimization using machine learning models
  • Cost-aware experimentation: balancing learning with operational costs
  • Guardrail metrics to prevent negative user experience
  • Integration with existing data pipelines and real-time monitoring

AI-generated suggestions, not part of the candidate's original notes. May be inaccurate — verify before relying on them.