Portfolio — Case Study

Travel & Transport · Web Platform

Ride Transfer Direct

Private 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.

View live site → Build something similar

129

Database Tables

14

WPML Languages

Stripe

SCA / 3DS Payments

Azure

Cloud Hosting

The Challenge

A manual bookings operation that couldn't scale.

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

Zero manual steps, from search to dispatch.

  • Full online booking flow: origin/destination, vehicle selection, date/time, passenger count, Stripe payment
  • iVcardo API integration for real-time vehicle availability, capacity, and pricing
  • WPML multilingual: 14 languages covering the full booking flow and website content
  • Stripe card-not-present payment with SCA/3DS compliance for EU transactions
  • Automated booking confirmation emails to customer and operator on payment success
  • Admin booking management dashboard with reporting
  • Azure Web Apps hosting with MySQL 8.0 on Azure Database for MySQL
  • AIOSEO Pro for multilingual SEO — meta titles, descriptions, and sitemaps per language variant
  • WP Rocket caching across all language versions for consistent performance
  • Custom WordPress theme optimised for conversion rate

Technology Stack

Every layer chosen for the problem, not the familiarity.

CMS / Language

WordPress PHP

Database

MySQL 8.0 Azure Database for MySQL

Hosting

Azure Web Apps (Linux)

Payments

Stripe (SCA/3DS)

Transport API

iVcardo API

Multilingual

WPML 14 languages

SEO

AIOSEO Pro

Performance

WP Rocket

Key Features

Six layers that replaced a manual operation with a running platform.

End-to-End Booking Flow

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.

14-Language Support

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.

Stripe SCA Payment Processing

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.

iVcardo API Integration

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.

Automated Confirmation Workflow

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.

Multilingual SEO with AIOSEO Pro

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

Every layer serves a specific purpose in the booking pipeline.

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.

rtd-architecture.txt
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

Numbers that define what "complete" means for a booking platform.

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

Working backwards from the operator's dispatch workflow, not forwards from a template.

Phase 1

Dispatch-first requirements

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

Payment architecture

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

Multilingual as infrastructure

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

Performance and SEO on Azure

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

About this project and building something similar.

Interested in a booking and payment platform for your transport or hospitality business? These are the questions we hear most.

Can you build something like this for a different type of transport business?
Yes. The booking engine, Stripe payment layer, and multilingual framework are all separable from the iVcardo integration. We can substitute a different transport API or build a custom availability and pricing system if your operation doesn't use a third-party dispatch platform. The same architecture works for minibus hire, yacht charters, excursion operators, and similar businesses.
Does it need to be WordPress, or can you build it on another stack?
WordPress was the right choice here because of WPML's maturity for this scale of multilingual content and the operator's need to manage content themselves without developer involvement. For a booking platform without the content-management requirement, we can build on a custom PHP stack, a Node.js API, or a Python FastAPI backend. The choice of framework depends on the operational requirements, not the other way around.
How long did the build take?
Approximately 14 weeks from requirements sign-off to live launch. The multilingual requirement added substantial time — 14 languages of booking flow content and email templates is not a quick translation job. The iVcardo API integration required significant testing against the staging environment before the payment layer could be connected. Stripe SCA testing alone took a full week of edge-case validation against EU card test scenarios.
What does Azure hosting cost for a site like this?
Azure Web Apps on a B2 plan (2 vCores, 3.5 GB RAM) plus Azure Database for MySQL Flexible Server on a General Purpose tier runs approximately €80–€120 per month depending on region and backup retention settings. This is materially more expensive than shared hosting but provides SLA-backed uptime, managed patching, and the ability to scale vertically in minutes if traffic surges.
Do you handle ongoing maintenance for RTD?
Yes. We provide ongoing WordPress maintenance: plugin updates, security monitoring, uptime checks, and quarterly performance audits. The iVcardo API integration requires periodic review when the dispatch system releases breaking changes to their API specification. Stripe SDK updates are applied promptly whenever a new version is released to maintain PCI DSS compliance.
Ready to build?

Need a booking platform that runs itself?

Whether you need a multilingual booking engine, a Stripe payment integration, or a full platform like RTD built from scratch — we'll start with a clear requirements call and give you a fixed price before we write a line of code.

Start the conversation → See our web services