VIP Transportation

We built viptransportation.mx end to end: the luxury private-transport booking site for Puerto Vallarta now running in production with live PayPal. We took a business run over WhatsApp and turned it into a bilingual 6-step flow on Next.js, PayloadCMS, and MongoDB, where the customer quotes and pays with certainty and the operator controls everything from a single admin. The heart of it is what you don't see: a pricing engine that resolves route, vehicle, round-trip, night surcharge, out-of-town tolls, promos, and CFDI-conditional IVA in USD and MXN at once, and a draft-before-charge payment pattern backed by automatic reconciliation that guarantees no PayPal charge is ever left without a booking. The proof is in the scale: 11 domain collections, 20 endpoints, 3 coexisting payment methods, and zero-downtime deploys that ship every change to production in seconds.

Category
Transportation
Status
In operation

The problem

Private airport transport in Vallarta was sold over WhatsApp and phone calls: improvised pricing, no formal confirmation, and payments the operator had to chase by hand. The international traveler never knew the final amount or the currency, and the operator never knew if a charge had actually landed. The real pain wasn't moving people from airport to hotel; it was the gap between the quote and the confirmed payment, where bookings and money quietly leaked.

The solution

  • Bilingual (es/en) 6-step booking flow for two products: airport transfer and hourly private driver, with a progress indicator and step-by-step validation.
  • Dynamic pricing engine combining route or zone, vehicle, round-trip (5% discount), night surcharge (+20% 11pm-5am), toll-road charge for out-of-town routes, add-ons, promo codes, and 16% IVA only when a CFDI is requested; computes USD and MXN at once.
  • Live PayPal Orders v2 integration with a draft-before-charge pattern: the booking is persisted as a draft BEFORE PayPal opens, so no charge ever exists without a record to bind it to.
  • Three coexisting payment methods: PayPal, bank transfer (SPEI) with receipt upload, and pay-on-arrival — with business rules that force 100% upfront on out-of-town routes.
  • Automatic reconciliation via cron that reviews pending PayPal payments and decides to finalize, cancel, or wait, closing the gap when a webhook fails.
  • Payload CMS with 11 collections (Fleet, Routes, Zones, Add-ons, Bookings, Destinations, Testimonials, FAQs, Pages, Media, Users) — the operator edits pricing and catalog from /admin with no redeploy.
  • Interactive map destination picker (MapTiler) that stores the chosen pin's lat/lng coordinates on the booking.
  • First-party transactional email over SMTP (customer confirmation, operator notification, transfer receipt) rendered with React Email, plus booking PDF generation.
  • Multilingual site with dedicated pages (airport transfers, private driver, fleet, contact, terms, privacy) served per locale via next-intl.
  • Zero-downtime deploy with a custom webhook: a push to main reaches production in seconds, with instant rollback.

How we built it

We started with the gap between the quote and the confirmed payment. Before designing screens we wrote down the pricing rules the operator applied from memory (route or zone, vehicle type, round trip, night hours, out-of-town tolls, add-ons and promotions) and turned them into an engine that prices in US dollars and Mexican pesos at once, adding VAT only when the customer asks for a tax invoice.

On top of that engine we built the six-step booking flow, in Spanish and English, for the business’s two products. Payment runs on live PayPal and follows a save-the-booking-before-charging pattern: if a payment notice is lost, an automatic reconciliation finds the charge and closes the booking. Three payment methods coexist, with rules that require prepayment on out-of-town routes.

The operator manages fleet, routes, zones, prices, bookings and content from an admin panel without touching code; confirmation emails and the booking PDF go out on their own. Every change reaches production in seconds, with no downtime.

The result

  • 11 Payload domain collections (Fleet, Routes, Zones, Add-ons, Bookings, Destinations, Testimonials, FAQs, Pages, Media, Users)
  • 20 API endpoints (booking, payments, reconciliation, PDF, receipt, pricing, contact)
  • 6-step booking flow across 2 products
  • 6 booking states (paypal_pending, pending, confirmed, paid, completed, cancelled)
  • 2 full languages (es/en) with per-locale pages
  • Production deploy in seconds per push to main (zero-downtime)
  • Live in production at viptransportation.mx with PayPal LIVE

Questions

Does this fit other businesses that quote and charge over WhatsApp?
Yes: rentals, tours, home services or classes. The flow and the pricing engine adapt to your catalog, and WhatsApp stays for customer service.
Why save the booking before charging?
So no charge is ever left without its booking: if the payment lands and the notice is lost, the reconciliation finds it and closes it.
Can it charge in both pesos and dollars?
Yes. The price is calculated in both currencies at once and the customer chooses how to pay.
How long does a system like this take?
It is built in stages; the first one (booking and payment for one product) usually runs within weeks. The exact schedule goes in the proposal.

Tech stack

  • Next.js
  • TypeScript
  • MongoDB
  • CMS headless
  • Pagos en línea