The problem
Airport sedan, shuttle, and limo work is simple until it isn’t: surge windows, add-ons, affiliates, a driver who has to be assigned, a customer who started with “just a quote.” The public site and the back office were two stories. Quotes aged in inboxes. Confirmed trips hid in another list.
The approach
We made “Get a quote” and “Make a reservation” the same product with different intent. Cars, drivers, customers, discount codes, and surges share one admin. The customer never re-enters a trip the desk already priced.
The solution
A Nuxt 3 front with a Node API: reservation create/update/detail, driver assignment, add-ons, affiliates, and payment through PayPal and Braintree. Roles and permissions for who can touch which list. Static pages and config for the marketing skin without forking the app. Socket updates when a trip changes status so the desk isn’t refreshing to see if the driver accepted.
The result
A quote is a reservation that hasn’t been confirmed yet — not a parallel spreadsheet. The same cars and drivers the customer sees are the ones the desk assigns. Payments and refunds sit on the trip, not in a separate merchant tab someone might forget.
