Labs

System lab · medium · 27 min

BookMyShow: Ticket booking

Seat holds that expire, payments that may fail, and no seat sold twice.

Ticket booking has one rule that can't bend: a seat is sold once. Everything else, from browsing films to choosing showtimes, is a normal read-heavy app. In this lab you'll design a ticketing system from a blank page, modelled on a product like BookMyShow. Most of your effort will go into a few minutes in a user's life: from tapping a seat to seeing "booking confirmed".

The brief

People browse films and events in their city, pick a show at a cinema, choose seats on a seat map, pay, and get a ticket. Cinemas list their screens and shows. The busy times are Friday evenings and, much more dramatically, the moment tickets open for a huge film or a stadium concert.

In scope:

  • Browsing cities, films, cinemas and showtimes.
  • The live seat map for a show.
  • Holding seats while the user pays.
  • Payment and confirmation.
  • Handling a big launch where hundreds of thousands of people want the same show.

Out of scope:

  • Reviews, ratings and recommendations.
  • Food and drink add-ons.
  • Cinema-side admin tools beyond creating shows.
  • Refunds and cancellations (mentioned, not designed).

Requirements

Functional

  • Users can find shows by city, film, cinema and date.
  • Users see a seat map showing which seats are available, held and sold.
  • A user can select up to 10 seats and hold them for a few minutes while paying.
  • If payment succeeds in time, the seats become theirs. If not, the seats go back on sale.
  • The user gets a confirmation and a ticket (QR code).

Non-functional

  • Never double-sell. Two people must never both hold or own the same seat. This is the requirement that shapes the design.
  • Never charge without a ticket. If money is taken, the user gets their seats or their money back, automatically.
  • Fair under a rush: at a big launch, people should be served roughly in arrival order, and bots shouldn't win.
  • Browsing stays fast (under 300 ms) even during a rush on one show.
  • Seat map freshness: a seat taken by someone else should show as unavailable within a few seconds.