Portfolio — Case Study
Travel & Transport · Web PlatformPrivate airport transfers — booked and paid online.
A full-stack online booking and payment platform for a private airport transfer operator on the Costa del Sol. Customers search, book, and pay in a single flow — no phone calls, no manual invoicing. The operator receives confirmed bookings with Stripe payment, ready to dispatch.
129
Database Tables
14
WPML Languages
Stripe
SCA / 3DS Payments
Azure
Cloud Hosting
The Challenge
The business was managing bookings manually through phone calls, WhatsApp messages, and cash on delivery. This capped capacity, created booking errors, and made scaling impossible. International tourists — the core customer base — expected to book and pay online, immediately.
The solution needed to serve 14 languages — Spanish, German, French, Dutch, Russian, Scandinavian markets and more — integrate with the operator's existing vehicle and driver dispatch system via the iVcardo API, and handle Stripe card-not-present payments compliantly across the EU.
Every element of the old workflow had to be replaced by software: availability checking, vehicle selection, pricing, payment, confirmation, and operator notification.
What We Delivered
Technology Stack
CMS / Language
Database
Hosting
Payments
Transport API
Multilingual
SEO
Performance
Key Features
Customers enter pickup location (airport or address), destination, date and time, and passenger count. The system queries iVcardo in real time for available vehicles, presents options with prices and capacities, and guides the booking through to Stripe payment — entirely without staff involvement. No phone tag, no invoice chasing, no manual confirmation. A tourist landing at Malaga Airport books their transfer in under two minutes, in their own language, and receives a confirmed itinerary by email before they collect their luggage.
WPML powers complete translations of the booking flow, confirmation emails, error messages, and all website content across 14 languages. For a Costa del Sol transfer business whose customers are primarily international tourists — German, French, Dutch, Russian, Scandinavian — this is not optional; it is the difference between a conversion and a bounce. Every booking step reads correctly in every language, including right-to-left considerations and locale-specific date formats.
All EU card transactions meet Strong Customer Authentication requirements. 3D Secure is enforced on every payment. Bookings are not confirmed until payment succeeds — the operator never needs to chase payment or send manual invoices. Stripe webhooks handle the confirmation trigger: payment success fires the booking confirmation workflow automatically, with no polling and no race conditions.
Real-time connection to the operator's vehicle and driver dispatch system. Vehicle availability, passenger capacity, and live pricing are always current — not cached from a stale price list. Confirmed bookings feed directly into the dispatch workflow without manual re-entry, eliminating the double-keying that caused errors in the old manual process.
On successful Stripe payment, the platform dispatches a formatted confirmation email to the customer with full trip details, and a notification to the operator with everything needed for dispatch. Zero manual steps from booking to confirmed dispatch. The operator wakes up to a queue of confirmed, paid bookings — no WhatsApp messages to chase, no cash to collect.
Each of the 14 language variants has its own AIOSEO-managed meta title, description, and schema markup. XML sitemaps cover all language versions with correct hreflang tags so search engines serve the right language version to the right audience. The site ranks in Google across the language markets that actually convert — Spanish, German, and English searches for Costa del Sol airport transfers. WP Rocket ensures each language variant serves from cache, so time-to-first-byte stays consistent regardless of language load.
System Architecture
The platform is architected around a clear separation of concerns: the presentation layer handles language and customer experience, the application layer manages the booking state machine and API orchestration, and the payment layer is Stripe — isolated behind webhooks so no booking is ever confirmed optimistically.
Azure Web Apps provides managed Linux hosting with automatic OS patching. Azure Database for MySQL Flexible Server handles the database layer with automated backups and point-in-time recovery. WP Rocket sits in front of PHP, serving cached HTML for all public pages, which means most visitor requests never hit PHP or the database at all.
The iVcardo API connection is handled server-side only. Customer browsers never have direct access to the transport system — all vehicle and pricing data is retrieved by PHP on the server, preventing rate-limit abuse and keeping credentials off the client.
Customer browser (14 languages via WPML)
→ Azure Web Apps (WordPress + PHP)
→ Booking form
→ iVcardo API
(vehicle availability + pricing)
→ Payment form
→ Stripe (SCA/3DS card-not-present)
→ Stripe webhook
→ booking confirmed
→ Confirmation email
→ customer
→ Operator notification
→ dispatch queue
→ Admin dashboard
→ booking management + reporting
MySQL 8.0 (Azure Database for MySQL)
— all bookings, payments, customers,
vehicles, languages (129 tables)
WP Rocket
— page cache: static HTML per URL per lang
— no PHP/DB hit per public page request
AIOSEO Pro
— multilingual SEO meta per language
— XML sitemap per language variant
— hreflang tags across all 14 locales
Platform Scale
129
Database Tables
WordPress core + WPML + booking system + plugin data — all on a managed Azure MySQL instance.
14
Active Languages
Full booking flow translated: Spanish, German, French, Dutch, Russian, Swedish, and eight more. Every string, every email, every error message.
100%
Automated
Zero manual steps between a customer paying online and the operator having a confirmed booking ready to dispatch.
SCA
Stripe Compliant
Every EU card transaction passes Strong Customer Authentication. 3DS enforced. PSD2-compliant from day one.
How We Approached It
Phase 1
The first question was not "what booking form do we need" but "what does the dispatch system need to receive, and in what format." The iVcardo API defined the data contract. Everything else was built to produce output that iVcardo could consume without transformation.
Phase 2
Stripe was configured with webhook-driven booking confirmation rather than client-side redirect. This means a booking is only ever marked confirmed by the server receiving a payment_intent.succeeded event from Stripe directly — not from a browser redirect that could be faked or missed on a poor connection.
Phase 3
WPML was installed before a single line of front-end content was written. Every string went into the translation system from day one rather than being retrofitted later. This meant translation coverage of the booking flow was structural, not cosmetic — error messages, validation text, and email templates all included.
Phase 4
Azure Web Apps was configured with persistent storage mounted via the Azure Files share and MySQL connection pooling tuned for WordPress workloads. WP Rocket was configured to generate separate cache files per language, so a German visitor never gets served a cached Spanish page. AIOSEO's hreflang output was verified against Google's Search Console international targeting report before launch.
Common Questions
Interested in a booking and payment platform for your transport or hospitality business? These are the questions we hear most.