•CASE STUDY

Global Restaurant Chain Menu Update System

4 min read·783 words·Intermediate

Asked at

1 candidate report in Nov 2025

How to use this case study

SDE-2 / Mid

Model menus with inheritance (global → country → restaurant) and explain how devices in each restaurant get the right menu

SDE-3 / Senior

  • Go deeper on publishing versions
  • Scheduled changes (breakfast/lunch)
  • Distribution to devices (push notification + pull from CDN)
  • Offline devices

Staff / Principal

  • Discuss consistency across devices in one store
  • Safe rollouts and rollback
  • Pricing and legal differences per country
  • Scale (tens of thousands of stores)

Problem RestatementProblem

Google asked: design a menu update system for a global restaurant chain (think tens of thousands of restaurants in many countries). Each restaurant has several menu-display devices: digital menu boards, self-order kiosks, POS terminals and tablets. Headquarters and regional managers publish menu and price changes, some scheduled (breakfast menu until 10:30, a new promo on Monday). Every device must show the correct, consistent menu, even if a restaurant's internet is flaky.

Deep Dive — One menu, forty thousand restaurantsDeep dive

The same burger has a different price in Germany, a different name in Quebec, an allergen line required in the EU, and is sold out at one branch right now.

Weak

A menu per restaurant

Give every restaurant its own complete menu document.

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
  GLOBAL["Marketing renames an item globally"] --> WRITE["Update 40,000 menus"]
  WRITE --> PART["Some succeed, some fail"]
  PART --> DRIFT["Menus permanently inconsistent"]
  WRITE --> SLOW["Any global change is a migration"]
  DUP["The same description stored 40,000 times"] --> COST["Storage and review cost"]

Every global change becomes a bulk rewrite that can half-succeed, so the estate drifts. And there is no way to express "this is the same item everywhere" — which is what marketing, legal and analytics all need.

Good

A global menu plus per-restaurant exceptions

Keep one base menu and let each restaurant record its exceptions.

Global changes are one write now, which is the important step. The trouble is that "exceptions" is a single flat bucket holding things that belong to different owners: a country's legal allergen text, a region's promotion and a branch's sold-out flag all land in the same place, so nobody can tell which level set a value or who may change it.

Best

Layers, resolved into an effective menu

Give each concern its own layer, and compose them in a fixed order:

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
  BASE["Global base - items, descriptions, images"] --> CTRY["Country - prices, taxes, language, allergens, legal"]
  CTRY --> REG["Region / franchise - local items, promos"]
  REG --> RST["Restaurant - sold out, permitted price tweaks"]
  RST --> DAY["Daypart - breakfast / lunch / dinner"]
  DAY --> EFF["Effective menu - resolved per restaurant, per daypart"]
  EFF --> CACHE["Cached and pushed to apps and tills"]
  • Each layer has an owner and a permission. Country teams set prices and legal text; a branch may mark an item sold out and adjust price only within an allowed band. Ownership is structural, not a convention.
  • The effective menu is derived, never edited. Resolving base plus overrides at publish time means there is exactly one source for every value, and the question "why does this restaurant show €5.90?" has an answer that names the layer.
  • Dayparts are part of resolution, not separate menus, so a breakfast item disappearing at 11:00 is a schedule on one layer rather than a second document to keep in sync.

Because the resolved menu is derived, publishing can be staged and reversible: resolve, validate, roll out to a few restaurants, then the rest — and a bad change is rolled back by re-resolving the previous layer versions rather than by editing forty thousand documents.

ArchitectureArchitecture

Architecture diagram
%%{init: {"look":"handDrawn","handDrawnSeed":7,"theme":"base","fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","themeVariables":{"fontFamily":"Virgil, \"Segoe Print\", \"Comic Sans MS\", cursive","fontSize":"16px","primaryColor":"#fff4e6","primaryBorderColor":"#1e1e1e","primaryTextColor":"#1e1e1e","secondaryColor":"#e7f5ff","tertiaryColor":"#ebfbee","lineColor":"#1e1e1e","textColor":"#1e1e1e","mainBkg":"#fff4e6","nodeBorder":"#1e1e1e","clusterBkg":"#f8f9fa","edgeLabelBackground":"#ffffff","classText":"#1e1e1e"}}}%%
flowchart LR
    ADM["HQ / regional editors"] --> MS["Menu Service - validate, version, schedule"]
    MS --> DB[("Menu layers + versions")]
    MS --> BLD["Build effective menus per store"]
    BLD --> CDN[("CDN - versioned menu bundles + images")]
    MS -->|"notify: new version"| PUSH["Push / MQTT to stores"]
    PUSH --> SG["Store gateway (edge box)"]
    SG -->|"pull bundle"| CDN
    SG --> D1["Menu boards"]
    SG --> D2["Kiosks"]
    SG --> D3["POS"]
  • Versioned bundles: after a change is published, build the effective menu per store (or per group of identical stores) as an immutable bundle (JSON + image references) with a version number, and upload it to a CDN.
  • Notify + pull: send a small "version 812 available, effective at 06:00" message to each store. The store pulls the bundle from the CDN. Periodic polling catches missed notifications.
  • Store gateway (a small edge box in each restaurant): caches the bundle locally and serves all devices in the store, so they update together and keep working offline.

Scheduling and Consistency

  • Bundles include future versions with effective times, delivered in advance. At 10:30 local time, every device switches to the lunch menu from its local copy, with no network needed at that moment.
  • The gateway tells devices to switch atomically at the effective time, so the board and the kiosk never show different prices.
  • POS pricing is the source of truth for charging, so the POS and displays use the same bundle version, and the version is included on receipts and orders for auditing.

Safety

  • Validation before publish: every item has a price in each country, images exist, required legal fields are present, and the tax setup is valid.
  • Staged rollout: pilot stores first, then a region, then global. Monitor device errors and order failures.
  • Rollback: re-point stores to the previous version (they still have it cached).
  • Offline stores: keep serving the last valid bundle, and alert HQ if a store is more than N versions behind.

Wrap-UpWrap-up

Model menus as layers (global → country → region → restaurant) with dayparts, and build an immutable, versioned effective-menu bundle per store (or store group) served from a CDN. Notify stores of new versions and let an in-store gateway pull, cache and hand bundles to all devices, applying scheduled changes locally and atomically at their effective time. Validate, stage and roll back releases safely, and keep offline stores running on the last good version.

More Case Studies

Frequently Asked Questions

What is the Global Restaurant Chain Menu Update System system design question?

Global Restaurant Chain Menu Update System is a system design interview question asked at FAANG companies. It covers distributed systems, cdn, caching, event driven and tests your ability to design scalable, production-ready systems. InterviewSkool's breakdown walks you through requirements, API design, architecture, and trade-offs.

Which companies ask the Global Restaurant Chain Menu Update System question?

Google have reportedly asked variations of this question in system design interviews. The exact wording may differ, but the core design challenges remain the same.

How should I prepare for the Global Restaurant Chain Menu Update System interview question?

Start with the problem statement and scale estimates, then design the high-level architecture. Focus on the core components, data model, and API design. InterviewSkool's breakdown covers the full solution with mermaid diagrams and trade-off analysis to help you prep efficiently.

What level is the Global Restaurant Chain Menu Update System question?

This question is suitable for SDE-2, SDE-3, and Staff engineer interviews. The level guidance on this page provides specific tips for each level — SDE-2 candidates should focus on core architecture, while Staff engineers should discuss trade-offs, monitoring, and incremental rollouts.

Practice with a Mock Interview

Apply what you learned in a live system design mock interview with InterviewSkool's AI interviewer.

Start System Design Interview →