A Vue 3 and Nuxt platform handling departures, seat availability, deposits and guide assignments for multi-day tours.
View live demo Opens a working demo with sample content in a new tab.
On location
Guy ManPhoto: Danka & Peter (CC0)
Guy ManPhoto: Joshua Earle (CC0)
Girl WomanPhoto: Ales Krivec (CC0)
Hiking TrekkingPhoto: Joshua Earle (CC0)
Nature LandscapePhoto: Claudel Rheault (CC0)
About the Project
This tour booking platform was built for an adventure tour operator running small-group departures to mountains, coasts and rivers around the world. Bookings used to arrive by email and phone, were typed into a spreadsheet and reconciled by hand each evening. Double-bookings happened several times a season, and because the marketing site could not show live availability, every enquiry needed a member of staff to answer before a customer could commit.
We built the public website and the booking engine together in Nuxt. Itinerary and departure pages are server-rendered for search engines, while availability, seat holds, deposits and guide scheduling run inside the same application, so what a traveller sees on the page is exactly what the operations team sees in the dashboard.
About the Client
The client is an adventure tour operator offering multi-day, small-group trips led by local guides. Its departures are limited in size, which makes every seat valuable and every double-booking painful to unwind with an apologetic phone call.
Its customers research carefully, often over weeks, and book longer, higher-value trips. They want to see real dates and real availability, and many prefer to secure a place with a deposit rather than pay the full price months ahead.
Project Goals
Show live availability on every itinerary and departure page.
Let travellers book instantly online without waiting for staff.
Make double-bookings impossible, even when two people book the last seat at once.
Offer deposit-only checkout with the balance collected automatically.
Give operations a live dashboard instead of an evening reconciliation.
Project Overview
The Challenge and Our Solution
The Challenge
Bookings arrived by email and phone, were typed into a spreadsheet, and seat counts were reconciled manually each evening. Double-bookings happened several times a season, and the marketing site could not show live availability — so every enquiry needed a staff member to answer before a customer could commit.
Our Solution
We built the public site and the booking engine together in Nuxt, so itinerary and departure pages are server-rendered for search engines while availability, holds and payments run through the same application. Seats are held for the duration of checkout, deposits are taken through the payment gateway with the balance scheduled automatically, and guide assignments are checked against qualifications and rest rules before a departure can be confirmed.
Live Departure Availability on Every Page
Travellers make up their minds on itinerary pages, so that is where availability had to live. Each departure shows its date, guide and remaining seats, drawn from the same data the booking engine uses. When a seat is sold, every page reflects it straight away.
Because the pages are server-rendered with Nuxt and carry structured data, they remain fully indexable. The operator gained a site that ranks for its itineraries and converts visitors on the same page.
Seats remaining shown per departure
Server-rendered pages with structured data for SEO
One source of truth shared by site and dashboard
Server-Side Seat Holds That End Double-Bookings
Double-bookings happen when two customers reach the last seat at the same moment. In this adventure tour booking software, seats are held on the server for the duration of checkout. While a traveller enters their details and pays, nobody else can take those seats; if the checkout is abandoned the hold expires and the seats return to sale.
Since the change, double-bookings have been eliminated, and the team no longer has to make the call nobody wants to make.
Deposit Payments for Tours
Longer trips are a big commitment, so the checkout offers a deposit option. Deposits are taken through Stripe and the balance is scheduled automatically before departure, with reminders along the way. Deposit-only checkout increased completed bookings on longer, higher-value tours, because travellers could secure a place without paying everything up front.
Deposit or full payment at checkout
Balance scheduled and collected automatically
Payment reminders before the balance date
Why One Application for Site and Bookings
Many operators run a marketing website on one platform and a booking tool on another, then glue them together with embedded widgets. It works, but availability shown on the page can drift from the truth, and every design change has to be made twice. Building both in Nuxt meant one codebase, one database and one set of rules, so a departure that sells out disappears from sale everywhere at once.
It also keeps the traveller’s journey continuous. Reading an itinerary, checking dates, holding seats and paying a deposit happen on the same site with the same look and feel, which matters when someone is about to spend a significant sum on a trip they have been planning for months.
Guide Scheduling and the Operations Dashboard
A departure cannot be confirmed without the right guide. Guide assignments are checked against qualifications and rest rules before confirmation, so scheduling mistakes are caught by the system rather than discovered on the trail.
The operations team now watches a live dashboard during the day — departures filling, deposits outstanding, guides assigned — instead of reconciling seat counts every evening. The spreadsheet is gone.
Our Process
How We Delivered It
1
Understanding the Booking Desk
Reviewed how enquiries, bookings and seat counts flowed through email, phone and spreadsheets.
2
Booking Engine Design
Modelled departures, seats, holds, deposits and guides in PostgreSQL with Nuxt server routes.
3
Itinerary Pages and SEO
Built server-rendered itinerary and departure pages with structured data and live availability.
4
Payments and Guide Rules
Integrated Stripe deposits and balances, and added qualification and rest checks for guides.
5
Migration and Launch
Imported future departures and existing bookings, then switched the booking flow over in one season.
Key Features
What We Delivered
Live departure availability
Seat counts, waitlists and filling-fast indicators shown directly on itinerary pages.
Deposit & balance payments
Deposit at checkout, scheduled balance reminders and card-on-file collection.
Guide scheduling
Assignment checks for qualifications, language and rest periods before confirmation.
SEO-ready itineraries
Server-rendered pages with tour, offer and FAQ structured data for rich results.
Outcome
Results and Impact
Live availability on every itinerary page, with instant online booking.
Double-bookings eliminated by server-side seat holds.
Deposit-only checkout increased completed bookings on longer, higher-value tours.
Evening reconciliation replaced by a dashboard the operations team watches during the day.
Client Feedback
What the Client Says
★★★★★
Live availability on every itinerary ended the double-bookings that used to cost us a few thousand a season. Customers book a deposit at midnight now, which is precisely when they were previously sending us an email we would answer two days later.
Operations ManagerAdventure tour operator
Services
Services Behind This Project
The Vue.js & Nuxt, Hosting, Server & DNS Management expertise we used to build this booking platform development — and can bring to yours.
Nginx, Apache, Docker and cloud servers configured, secured and kept running — plus DNS, SSL and Cloudflare set up correctly the first time.
Learn more
FAQ
Frequently Asked Questions
Why build a custom tour booking platform instead of using an off-the-shelf tool?
Off-the-shelf tools work well for many operators. A custom platform made sense here because the operator wanted its marketing site and booking engine to share one codebase and one data source, with its own deposit rules and guide checks, and with itinerary pages fully under its control for SEO.
How do seat holds prevent double-bookings?
When a traveller starts checkout, the seats are reserved on the server for a limited time. Nobody else can buy them during that window. If payment completes, the booking is confirmed; if the traveller leaves, the hold expires and the seats return to sale automatically.
Can travellers pay a deposit and the balance later?
Yes. Checkout offers a deposit option through Stripe, and the remaining balance is scheduled automatically before departure with reminders. The operator chooses the deposit amount and balance timing per tour.
Will live availability hurt our search rankings?
It should help. Itinerary and departure pages are server-rendered by Nuxt, so search engines receive complete HTML, and they include structured data. Availability updates do not change page addresses or hide content from crawlers.
How are guides scheduled?
Guides are assigned to departures in the dashboard, and each assignment is checked against the guide’s qualifications and rest rules before the departure can be confirmed. That catches scheduling problems before they reach a trip.
What does a project like this cost?
Cost depends on how many tour types and payment rules you have, the integrations you need, how much content is migrated and the design scope. We break these down at the start so you can see where the effort goes before committing.
Similar Work
Related Projects
Case studies built with the same technologies or for similar needs.