--- title: "Add shuttle transfer bookings to WordPress: a plugin you can build today" description: "Amelia and Bookly handle everything except what you actually need: a form for fixed routes at set prices. This plugin closes that gap." source: https://steem.dev/blog/wordpress-shuttle-transfer-booking-plugin published: 2026-09-05 updated: 2026-09-05 alternative_to: Amelia site: Steem — AI WordPress plugin generator --- # Add shuttle transfer bookings to WordPress: a plugin you can build today Amelia, Bookly, and WP Appointment Booking are built for service businesses with variable staff availability, multi-location calendars, and per-service pricing rules. If you run airport transfers or city-to-city shuttles with a handful of fixed routes and set departure times, none of that applies to you, and the setup time runs to hours before a visitor can select anything. A transfer operator with four routes and two departures each needs three things: somewhere to define those routes, a form visitors can use to book one, and a place in the admin to see what has come in. The plugin built here delivers exactly that. It adds a settings page for defining routes and their departure times, a shortcode that renders the booking form anywhere on the site, and an admin table showing every submission with all the details. Here is the prompt. ## What one build covers - Settings page to define routes with From, To, price, and departure times - Booking form shortcode with route selector, departure time dropdown, date, passengers, name, and email - Bookings saved as a custom post type and listed in an admin table - Admin email notification with full booking details on each submission - Confirmation message displayed to the visitor after a successful submission ## What it does not cover - Seat capacity limits: the plugin does not block a departure when it is fully booked - Payment at booking: no WooCommerce or payment gateway integration - Customer accounts or booking history for returning visitors - Variable pricing by date, season, or passenger count - Multi-vehicle or driver assignment ## The prompt ```text Build a WordPress plugin for fixed-route shuttle and transfer bookings. Add a top-level admin menu with the label 'Shuttle Bookings'. Under it add a Settings page and a Bookings page. On the Settings page, allow the admin to define routes using a repeatable set of fields saved with update_option: each route has a From location, a To location, a price, and a list of departure times stored as a comma-separated string. Provide an Add Route button that appends a new row of fields using JavaScript, and a Remove button on each row. Register a custom post type called shuttle_booking with the label Bookings, not publicly queryable, with show_in_menu set to the Shuttle Bookings menu slug. On the Bookings page, list all shuttle_booking posts in a table ordered by date descending, showing columns for Route, Departure Time, Travel Date, Passengers, Customer Name, Customer Email, and Date Submitted, with values pulled from post meta. Register a shortcode shuttle_booking_form that outputs a booking form. The form must include: a select element for route populated from saved settings with From and To as the label, a select element for departure time showing the times for the chosen route updated via JavaScript when the route changes, a date input, a number input for passenger count with a minimum of 1, a text input for customer name, and an email input. On POST submission, validate that all fields are present, create a shuttle_booking post with post_status publish, save all values as post meta using the keys route, departure_time, travel_date, passengers, customer_name, and customer_email, send a plain-text email to get_option admin_email with all booking details, and display a success message in place of the form. Register all hooks inside a function attached to plugins_loaded. ``` ## Why booking plugins are overkill for fixed routes The general booking plugins are designed for businesses where availability depends on which staff member is free, which location is being used, and how long each appointment type runs. Before a visitor can pick a time, you need to configure services, staff profiles, working hours, buffer times, and often a payment gateway. A shuttle operator does not have that problem. The routes are fixed. The prices are fixed. The departure times are fixed. The only unknown is whether someone wants to travel on a given date and how many seats they need. A form that captures those four things and sends you an email is the entire product. The mismatch between what the general tools do and what a transfer service actually needs is why people end up with contact forms, WhatsApp links, or nothing at all. A purpose-built plugin covers the gap without the setup overhead. ## What the plugin does A settings page under a new Shuttle Bookings admin menu lets you define as many routes as you need. Each route has a From field, a To field, a price, and a list of departure times entered as a comma-separated string. The settings are saved with update_option and persist across updates. A shortcode places the booking form anywhere on the site. The form shows a route selector, a departure time dropdown that updates when the route changes, a date picker, a passenger count field, and fields for the customer's name and email address. All fields are required. When a visitor submits the form, the booking is saved as a custom post type entry in your database, an email goes to your site admin address with the full booking details, and the form is replaced by a confirmation message. All submissions are visible in a Bookings table in the admin, ordered by date, showing route, departure time, travel date, passengers, customer name, and email. ## Who this is for Airport transfer and shuttle operators with a defined set of routes. If your business runs a set number of pickup-to-destination pairs at fixed prices, this plugin matches your model exactly. Tour operators who offer transfers between a small number of fixed points as part of a package. The booking form sits on a page, visitors submit a request, and you confirm manually. Any service with fixed routes and prices that wants a booking form without signing up for a scheduling platform or configuring staff calendars that do not exist. ## Who should use a different approach If you need real-time seat availability, where a departure slot closes when it is full, this plugin does not track capacity. Every submission goes through regardless of how many others have already come in for the same slot. Amelia's free tier handles capacity limits if that matters to you. If you need payment at the point of booking, this plugin collects the request and notifies you. Payment happens outside the plugin, by invoice, bank transfer, or a confirmation link you send manually. WooCommerce with a simple product per route is an alternative if you need upfront payment. If your pricing varies by date, season, or number of passengers, the fixed price per route that this plugin stores will not work without modifying the plugin file. Variable pricing requires more logic than one prompt delivers. ## How to build it Paste the prompt below into Steem. The plugin downloads as a zip and installs under Plugins > Add New > Upload Plugin. Once active, go to Shuttle Bookings > Settings to add your routes, then place the [shuttle_booking_form] shortcode on any page. Two useful follow-ups: 'add a special requests text area to the booking form, stored with the booking and included in the admin email' adds a field most transfer operators want. 'Send the customer an email confirmation when their booking is received, including the route, departure time, date, passenger count, and a booking reference number' closes the loop with the visitor without any manual reply. ## Questions ### Does this stop a departure from being booked when it is full? No. The plugin saves every submission without tracking how many seats have been taken. If you need capacity enforcement, you would need to extend the plugin to count bookings per departure slot and disable that option in the form once the limit is reached. ### Can customers pay when they book? No. The plugin collects the booking request and notifies you by email. Payment is handled outside the plugin: by invoice, bank transfer, or a payment link you include in a manual confirmation email. ### Where are bookings stored? In your WordPress database as a custom post type. You can view them in the Bookings admin table, or export them using a plugin like WP All Export to get a spreadsheet of all post meta fields. ### Can I change the email address that receives booking notifications? The plugin sends to the WordPress admin email, which you can update under Settings > General. To send to a different address without editing the plugin file, add a wp_mail filter to your theme's functions.php. ### Can I add a special requests field? Not out of the box, but it is a short follow-up prompt: tell Steem to add a textarea labeled Special Requests to the form, save it as post meta, and include it in the admin email. It takes one message. --- Source: https://steem.dev/blog/wordpress-shuttle-transfer-booking-plugin Build this plugin: https://steem.dev/app