Skip to content
Travel & tourism · Case study

Bristol Adventure: a booking platform for a Dubai tour operator

A complete booking platform for desert safaris, city tours, attraction tickets and cruises in Dubai — a multi-service trip cart, secure online payment, a blog and a full admin panel.

Client
A travel & tourism company in United Arab Emirates
Industry
Travel & tourism
Year
2026
Duration
About 1 month to go-live
Location
United Arab Emirates
Bristol Adventure — cover image
The challenge

The tour operator sold safaris, private city tours, tickets and cruises through messages and phone calls. Customers could not book several experiences in one go, availability was tracked by hand, and nothing stopped two people from booking the last seats at the same time. They needed a website that sells every service online, holds seats fairly while a customer pays, takes card payments safely and gives the team one place to manage bookings, content and reviews.

What we built

We built the platform with a Next.js frontend and an Express and MySQL API. • Twenty services across desert safaris, private city tours, attraction tickets and cruises. • A "My Trip" cart that combines several services, with a 15-minute inventory hold while the customer checks out. • Stripe hosted checkout with webhooks that are safe to receive twice, so a booking is never confirmed or charged double. • Pickup locations on Google Maps, a blog CMS, and sync of Google and TripAdvisor reviews. • A role-based admin panel with audit logs and two-factor sign-in (TOTP).

Results

  • 20Services onlineSafaris, city tours, tickets and cruises.
  • 15 minSeat hold at checkoutPrevents overbooking while a customer pays.
  • 2FAAdmin sign-inTOTP second factor plus audit logs.

Fair availability

When a customer adds a tour to the trip, the seats are held for 15 minutes. If payment does not complete, the hold expires and the seats return to sale — no overbooking, and no seats stuck in abandoned carts.

Payments that cannot double-charge

Checkout runs on Stripe's hosted page, so card data never touches our servers. Payment confirmations arrive by webhook; each one is processed exactly once even if Stripe sends it again, which keeps bookings and payments in step.

Run by the team, not by us

Staff manage services, prices, bookings, blog posts and reviews themselves. Every admin action is logged, roles limit who can change what, and admin sign-in requires a second factor.

Server, domains and go-live

We set up and run the production server ourselves: a VPS with Nginx in front of the Next.js site and the API, both kept alive by PM2 and restarted automatically if they stop. We moved the client's DNS over, issued SSL certificates for both domains and handled the cut-over, so the switch from the old site happened without the client touching a server.

Live

Public launch follows once the client connects their live payment account and the review integration.

Free discovery call

Have a similar problem? Let's solve it.

Tell us what you need. We'll come back within 24 hours with an approach, a timeline and a number.