Hermes Wiki
Architecture/CaseStudies/airbnb-multi-product-data-architecture

Airbnb: Evolving Data Architecture for a Multi-Product World

Problem + constraints

Airbnb's data architecture had spent over a decade shaped around a single product: Homes. With a major app redesign that relaunched Experiences and debuted a new Services product line, the data platform suddenly had to serve multiple genuinely different product types through the same core systems — messaging, payments, and reporting all needed to work across Homes, Experiences, and Services without fragmenting into three parallel stacks. The failure mode Airbnb was actively trying to avoid was tight coupling between a "Homes-shaped" data model and every downstream consumer: messaging threads that assumed a booking was always a home stay, or payment tables structured only for a nightly-rate reservation, would have to be rebuilt (or worked around) for every new product line, indefinitely.

Solution

Airbnb's data and analytics engineers built a framework organized around a "shared core with product-specific extensions at the edges" pattern. Core, cross-cutting concerns got monolithic tables that live in a global namespace and stay product-agnostic by design — payments is the clean example: the payment data model handles transactions, refunds, and payouts as product-agnostic concepts, so onboarding a new product type (Services) required minimal changes to the payments layer itself. Product-specific tables, by contrast, live in dedicated per-product namespaces rather than being crammed into the shared core, so a Homes-specific concept doesn't leak into Experiences' schema (or vice versa) just because they share infrastructure. Messaging was a deliberate exception to hard per-product isolation: because a single message thread can span a guest-host stay conversation, a guest-support conversation, and even guest-to-guest exchanges, forcing a per-product split there would have fragmented conversations that need to stay unified from a user's point of view — so messaging stayed monolithic by design, not by oversight. The overall framing Airbnb settled on: keep shared definitions at the core, push product-specific variation to the edges, and treat any exception to that split (like messaging) as a deliberate call, not a shortcut.

What to steal

  • "Shared core, product-specific extensions at the edges" is a generalizable pattern for any platform outgrowing its original single-product assumption — not just Airbnb's case. The hard part is correctly classifying which concerns are genuinely cross-cutting (payments) vs. which need real per-product boundaries (product-specific attributes).
  • Not every domain should be forced into the same coupling decision. Airbnb deliberately kept messaging monolithic against the general pattern because the user-facing unit (a conversation) doesn't map cleanly onto a single product — a reminder that "apply the pattern uniformly" is often the wrong instinct; the domain's actual usage shape should drive the boundary, not architectural tidiness.
  • Namespacing (global namespace for shared core, per-product namespace for extensions) is a lightweight, low-ceremony way to enforce this kind of boundary without needing separate physical infrastructure per product line — worth reaching for before jumping to full service/database-per-product splits.

Principal Engineer Lens

This is a multi-tenancy problem in disguise — instead of tenants being customers, the "tenants" are product lines sharing common infrastructure, and the same design questions apply: what's genuinely shared, what needs isolation, and where do you draw that line as new tenants (products) arrive. The most senior judgment call in this case study is the messaging exception — recognizing that a clean architectural principle ("split by product") doesn't apply uniformly everywhere, and being able to articulate in a review exactly why one subsystem got an exception while others didn't. That's a stronger signal of Principal-level thinking than rigid consistency would be. The pattern itself — and the org-complexity pillar it sits in — maps directly onto any Fintech or BigTech platform absorbing new product lines onto shared payment, identity, or notification infrastructure.

Reel Script

Setup: Airbnb's data architecture had a decade of assumptions baked in around a single product, Homes — then a redesign added Experiences and a brand-new Services product line, and the data platform had to serve all three without fragmenting.

Concept walkthrough: Explain the "shared core, product-specific extensions" pattern — cross-cutting concerns like payments get a product-agnostic model in a global namespace, product-specific concerns get their own per-product namespace, so new product types onboard onto the shared core cheaply while keeping product-specific variation contained.

Real example tie-in: Walk through payments as the clean example of the pattern (product-agnostic core, minimal changes needed to onboard Services), then messaging as the deliberate exception — a single thread can span multiple products and even multiple conversation types, so forcing a per-product split there would have fragmented something users experience as one continuous conversation.

Tradeoffs & alternatives: Compare against a fully product-isolated architecture (separate schemas/stacks per product) — cleaner isolation but massive duplication and no shared source of truth for cross-product concerns like payments or user identity. Also compare against Airbnb's status quo before this redesign — a Homes-shaped model that would have required bespoke rework for every new product launched.

Principal Engineer takeaway: When a platform outgrows its original single-product assumption, the right question isn't "how do we isolate every product" or "how do we share everything" — it's classifying each concern individually, and being willing to defend a deliberate exception (like messaging) against an otherwise-consistent architectural principle.

Sources:

Hermes Wiki