
A single location can survive on manual booking, a phone call, a spreadsheet, a staff member checking availability by hand. Multiple locations can’t. Every additional site multiplies the same manual process, and multiplies the chance something gets double-booked or simply missed.
We built a booking platform with real-time, location-based inventory, live availability, integrated payment processing and automated confirmation the moment a booking completes. Customers reserve a unit entirely on their own, with no staff member needed in the loop.
The business stopped managing bookings manually and started running a system that manages them automatically, at any number of locations, without adding operational overhead every time Blue Bear opens a new site.


The customer journey is intentionally simple: choose a location, select an available unit, enter your details and pay. The engineering complexity sits behind those steps.
Availability changes continuously. Pricing depends on the selected location and unit. Payment completes outside the application’s process. Releases must not interrupt customers who are partway through a booking.
We built the platform to handle these constraints explicitly.
Application architecture
The booking application was built with Next.js and React.
React manages the interactive parts of the multi-step journey, including navigation, input validation, unit selection and customer progress. Next.js provides routing, server-side execution and control over how each part of the application is rendered and cached.
We kept transactional rules outside the form components. The frontend collects input and presents state, while the server validates availability, calculates the current price and controls booking transitions. Values submitted by the browser are never treated as authoritative simply because they came from an earlier step.
The journey is modelled as a sequence of explicit stages:
- Select a location
- Retrieve available units
- Select a unit
- Collect customer details
- Start payment
- Confirm the reservation
Each stage defines its inputs, validation rules and failure behaviour. This allows the flow to handle customers navigating backwards, refreshing the page, submitting twice or leaving during payment.
Live availability and caching
Availability cannot be treated as ordinary website content.
Location descriptions and unit metadata change infrequently and can be cached with controlled revalidation. Inventory is short-lived operational data. It is requested for the selected location and checked again before the transaction is completed.
The storage management system remains the source of truth. The booking platform does not maintain a second independently editable inventory.
Caching is applied according to the consistency requirements of the data:
- Static assets and supporting content receive longer cache lifetimes.
- Location and unit metadata use controlled revalidation.
- Availability is refreshed at transaction boundaries.
- Customer, booking and payment data is excluded from shared caches.
This keeps the journey responsive without presenting cached inventory as guaranteed availability.
Performance
The main performance decision was to keep unnecessary work out of the browser.
Stable content can be rendered and cached by Next.js. Interactive JavaScript is limited to the parts of the booking journey that require it. Inventory is loaded once the location context is known rather than retrieving data for every facility upfront.
We also reduced duplicate requests and unnecessary React renders by assigning clear ownership to form and server state. The same value is not copied across several components, and data fetching is separated from presentation logic.
The objective was not to maximize a synthetic performance score. It was to keep the booking flow responsive on mobile connections while preserving the consistency required by a transactional system.
Containerized runtime
The application and supporting services run in Docker containers. This gives us one defined runtime that can move through development, testing and production.
Application code and runtime dependencies are built into a versioned image. Configuration and secrets are supplied separately for each environment. The image tested by the delivery pipeline is the same artifact promoted to production.
This makes deployments reproducible and gives every running instance a traceable application version.
Delivery pipeline
Changes pass through an automated delivery pipeline before they can reach production.
The pipeline performs:
- Static analysis and type checking
- Automated tests
- A production application build
- Container image creation
- Security and dependency checks
- Deployment to the inactive production environment
- Health and readiness verification
- Production traffic switching
A failed check prevents promotion. Releases are tied to versioned container images, making it possible to identify exactly which code is running and which release introduced a regression.
Blue-green deployments
Production uses a blue-green deployment model.
Two equivalent environments are maintained: one serves production traffic while the other receives the new application version. The new environment is started and checked without affecting active customers.
Before traffic is moved, the deployment is validated through health checks and application-level readiness checks. These confirm more than whether the container process is running; they verify that the application can start correctly and reach the dependencies required to serve booking requests.
Once the new environment is ready, traffic is switched at the routing layer. The previous environment remains available during the initial observation period.
If monitoring shows elevated errors or a failed critical journey, traffic can be directed back to the previous version without rebuilding or redeploying it. This gives us a much faster rollback path than replacing a release in place.
Blue-green deployment also affects application design. Releases must tolerate a period in which two application versions exist at the same time. API and database changes are therefore introduced in a backward-compatible sequence rather than assuming every instance changes simultaneously.
Release verification
After production traffic moves to the new environment, we observe both technical and business-level signals.
Technical checks show whether the application is responding normally. Booking metrics show whether customers are still able to complete the actual journey. A release can return successful HTTP responses while failing at unit selection, payment initiation or confirmation.
This means deployment verification includes the behaviour the system exists to provide, not only the health of its containers.
The result
The platform replaced a staff-mediated reservation process with a booking flow customers can complete independently.
Next.js, React and Docker are implementation choices, not the outcome. The important engineering work was establishing clear transactional boundaries, treating availability according to its consistency requirements, making repeated requests safe, and building a release process that can be verified and reversed.
Monitoring, structured logs and booking-level metrics make the platform operable after deployment. Blue-green releases make changes safer to introduce while customers are actively using it.
Together, these decisions allow one booking platform to support additional demand and locations without reproducing either the original manual process or unnecessary operational risk.
Pillars used: Technology & AI
Have a problem worth solving?
We don’t have a sales team. Tell us what you’re working on and we’ll tell you honestly if we’re the right fit.











