Skip to content

Platform architecture

One Booking Platform, Different Venue Rules

A better booking grid should not quietly import another venue’s prices, time increments or membership rules. I separated interface capabilities from business policy.

3 min read

Senior AI Engineer · M.S. Computer Science, Tsinghua University · See the products I built

In this article · 6 sections
GolfJoy Play desktop booking interface with dates and bays
In the product. Product context: a shared booking platform. A venue can adopt a different presentation while keeping its own time, membership and checkout rules.Open full size ↗

The engineering decisions

  • Keep venue identity, presentation choices and business rules explicit.
  • A shared component does not imply a shared booking policy.
  • Validate both the requested change and the existing behavior that must remain intact.

The request sounded like a UI change

A pilot venue had a clearer booking grid and checkout summary. Bringing that presentation to another venue sounded like component reuse. The risk was that the pilot also had different booking increments, a longer reservation window and a multi-room cart. Copying the experience wholesale could import those business assumptions.

I treated presentation and policy as separate choices. The target venue could use the new grid without adopting the pilot’s 15-minute steps, customer-selected membership minutes, rental-club add-ons or four-week window. Those were local requirements, not implicit upgrades for every customer.

Make capability selection explicit

The implementation introduced a venue booking configuration registry. It selected the presentation capabilities and referenced the appropriate rules for that venue. Unregistered venues retained the existing guided interface. A new entry extended the platform without editing a global default.

The target venue kept 30-minute start and grid increments, durations of 30, 60, 90 or 120 minutes, a two-hour maximum, a 14-day window and one bay per booking. Membership benefits remained automatically calculated. Server-authoritative quoting and the established checkout path also stayed in place.

A shared booking renderer takes presentation capability and venue business policy as separate inputs, while the server enforces quoting and checkout
How it works. The UI may choose a grid or guided view. The venue policy still supplies the booking limits and commercial rules. Neither choice authorizes a client-supplied price.Open full size ↗

Reuse the interaction, not the desktop geometry

The desktop experience used rooms across the grid and times down the page, with a persistent booking summary. On a phone, shrinking that table would have made the choices harder to scan and tap. The mobile view instead grouped bay cards by time.

The date selector exposed the full 14-day window through seven-day pages. Changing the day retained the existing client cache and prefetch behavior. A visible redesign was not a reason to discard the performance work already supporting date navigation.

Mobile GolfJoy Play booking interface
In the product. Public mobile product context. The implementation principle is to adapt the presentation to the available width while preserving the same venue policy.Open full size ↗

Test the non-change as part of the change

The booking-rule checks gained venue-isolation assertions: the target venue could change presentation without changing its business rules. I also checked the page against a temporary database, including the reservation window, pagination, desktop grid and phone layout. That work did not write to an operating venue’s data.

The important negative checks are product-specific. Enabling a grid must not enable a multi-bay purchase. Reusing a summary must not let the customer choose membership minutes if the venue calculates them automatically. Those constraints belong in the integration boundary, where configuration becomes behavior.

Keep a failing baseline visible

The record reports type checks, lint, build and public-copy checks passing. The broader acceptance run completed the booking, pricing, waiver, reservation-window and relevant coaching checks before stopping at an existing OAuth test-account login failure. It reproduced on the second run.

I kept that as a separate baseline issue rather than claiming the whole suite passed or changing the authentication system to make a UI task look green. This article describes the implementation and the recorded local verification. It does not turn the temporary-database check into evidence of a production rollout.

Local requirements should remain local

A configurable platform is easier to extend when it is explicit about what is shared: rendering primitives, interaction patterns and tested rule interfaces. Prices, time windows and commercial permissions are inputs to those interfaces. Keeping that distinction visible let me improve a customer flow without redefining another venue’s contract.

Project context and evidence

Written from my August 2026 GolfJoy Play venue-configuration implementation and verification records. Public links below support the product and attribution context. Internal project records are summarized, with customer records, credentials, and employer source code omitted.

All articles ↗