Contents
Troubleshooting - Plugixa Car Rental
Most problems come from one of four places: the fleet or rates are not set up for the dates asked, a booking rule refuses the request, email delivery on the server, or another plugin standing between the booking form and your site. Work through the section that matches what you see.
The booking form does not show
| What you see | Cause and fix |
|---|---|
| The shortcode itself, as text | The plugin is not active, the shortcode is misspelt, or the Booking form app is switched off in the App Manager. The same goes for [plugixa_car_rental_account] and the Customer portal app. |
| “Loading…” that never ends, or nothing at all | The page loaded but its script did not run. A plugin that combines, minifies or delays JavaScript is the usual cause. See Caching and optimisation plugins. |
| “Please enable JavaScript to book a car online.” | The visitor’s browser has JavaScript off. The form needs it. |
| “Online booking is not open yet. Please contact us.” | No location takes pickups. A location must be Published and allow pickups. Check Locations. |
| “We could not reach the booking service. Check your connection and try again.” | The form could not reach the REST API at all, or got something back that was not JSON. See REST requests are blocked. |
| “Online booking is not available right now. Please contact us.” on the details step | No payment method is switched on. Turn on Pay at pickup or Bank transfer under Settings -> Payment methods. |
No cars are shown, or a car is missing
A search lists every vehicle model that is Published. What each model needs before a customer can book it:
- A rate for this length of rental at this location. The rate must be Published, cover the number of days the customer asked for, and be set for the pickup location or for all locations. A model with no matching rate is left out of the results entirely. With brackets of 1-2 and 3-6 days and nothing from 7, a week-long search hides the model.
- A published vehicle that can start at the pickup location. A vehicle whose Home location is another location is not offered there. A vehicle with no home location can start anywhere.
- A free vehicle for the whole rental. Other bookings, unpaid holds that have not run out, and the Turnaround time after each rental all take a car out.
When 1 is missing the model is not listed. When 2 or 3 is missing it is listed as “Not available for these dates”. When no model at all has a matching rate, the form says “No cars are available for these dates. Please try other dates.”
| Symptom | Where to look |
|---|---|
| Every search is empty | The rate brackets. Check that something covers short and long rentals, and that the rates are Published. See Rates. |
| One model is missing | That model’s status, and its rates for the pickup location. |
| Cars show as “Not available for these dates” when the yard is full of them | Their Home location, their status, and any pending bookings that hold them. A pending booking taken at the desk holds its car until somebody confirms or cancels it. |
| A car shows a sentence instead of “Not available” PRO | A Pro feature refused it for this request, for example the driver is too young for it. The sentence says why. |
A search or a booking is refused
The server checks every request again, whatever the form allowed. These are the messages a customer can meet, and the setting behind each one. Bookings taken at your desk are not bound by the minimum notice or the booking horizon.
| Message | Cause and fix |
|---|---|
| “Pickups must be booked at least 2 hours ahead.” | The pickup is sooner than Minimum notice under Settings -> Booking rules allows. The default is 2 hours. Set it to 0 to allow pickups right away. |
| “That pickup time has already passed.” | The pickup is in the past and Minimum notice is 0. |
| “Pickups can be booked at most 365 days ahead.” | The pickup is beyond the Booking horizon. |
| “Rentals are at least 1 day.” or “Rentals are at most 90 days.” | The rental is shorter than Shortest rental or longer than Longest rental. |
| “The return must be after the pickup.” | The two times are the same or reversed. |
| “Airport Terminal 2 is closed on 25/12/2026.” | The date falls in one of the location’s closures. A closure always wins, whatever the after-hours fee. |
| “City Centre is not open at that pickup time.” or “…return time.” | The time is outside the location’s opening hours, and the location has no After-hours fee. With a fee above 0, the handover is allowed and the fee is added instead. |
| “Cars cannot be picked up at that location.” or “…returned to that location.” | The location does not allow pickups, or returns. |
| “That time does not exist at this location because of a clock change. Choose another.” | The time falls in the hour skipped when clocks go forward. |
| “Sorry, there is no car of this model free for those dates.” | Somebody else took the last car between the search and the hold. |
| “Another booking for this vehicle is being made right now. Please try again.” | Two customers reached for the same car at the same moment. Trying again works. |
| “The hold on this car ran out and it has been booked by someone else. Choose another car or other dates.” | The customer took longer than the Hold time to finish, and the car went to somebody else. Raise the hold time if your form takes a while to fill in. |
| “Enter the driver’s age, from 16 to 99.” PRO | The Driver’s age field was left empty or holds an age outside 16 to 99. The form no longer fills in an age by itself, so the customer must type one. See Driver age. |
| “That coupon has been fully used since it was applied. Remove it to book at the full price.” | The coupon’s Usage limit was reached by other bookings while this one was being filled in. The customer removes the code and books at the full price, or you raise the limit. See Coupons. |
| “This request could not be processed.” | The hidden anti-spam field of the form was filled in. A browser extension that fills every field can do this. |
See Booking rules and Locations.
Emails do not arrive
The plugin sends three booking emails: a confirmation and a cancellation to the customer, and a new booking notice to your desk.
| Check | Why |
|---|---|
| Was the booking confirmed? | The confirmation and the desk notice are sent when a booking becomes confirmed, not when it is created. A customer who chooses Pay at pickup or Bank transfer is confirmed at once. A booking left Pending (for example an online payment PRO not finished, or a desk booking saved without Confirm now) gets no email until it is confirmed. |
| Is the Notifications app on? | Switched off in the App Manager, it sends nothing. |
| Is Email customers on? | Under Settings -> Booking emails. Off, customers get nothing; your desk still does. |
| Where does the desk email go? | To Desk email address, or the site’s admin email under Settings -> General when that is empty. |
| Does your site send any email? | The plugin hands every message to WordPress’s wp_mail(). If password reset emails do not arrive either, the problem is the server, not the plugin. Install an SMTP plugin and send through a real mail service. |
| Is it in spam? | Mail sent from a server with no SPF or DKIM records for your domain often is. An SMTP plugin with a proper mail service fixes that too. |
The customer’s email links to their booking page only when a published page
holds the [plugixa_car_rental_account] shortcode or the Car rental: manage
booking block, or its ID is set as Portal page ID under Settings ->
Cancellations and customer portal. See
Customer portal and
Emails.
Text messages and Telegram alerts PRO are sent by WordPress’s
scheduler just after the status change. On a site with DISABLE_WP_CRON set,
they wait until the next run of wp-cron.php. See
SMS and Telegram.
REST requests are blocked
The booking form, the customer booking page and the admin app all talk to
/wp-json/plugixa-car-rental/v1/. Open
https://example.com/wp-json/plugixa-car-rental/v1/ with your own domain. You
should see a JSON description of the routes.
| Result | Cause and fix |
|---|---|
| The web server’s own 404 page | The /wp-json/ address is not reaching WordPress. Open Settings -> Permalinks and save, which rewrites the rules. |
JSON with the code rest_no_route |
WordPress answered, but the route is not there. The plugin is not active, or the app that owns the route is switched off. Pro routes such as /reports/rentals do not exist on the free edition. |
| A login page, or a 401 or 403 that is not JSON | A security plugin or a server rule is blocking the REST API for visitors who are not signed in. |
| A 403 with a firewall page on the search or the booking step | A web application firewall is refusing the JSON the form posts. |
The routes under /wp-json/plugixa-car-rental/v1/public/ must answer visitors
who are not signed in. That is how they are designed: they use no cookies and
no login, and are protected by rate limits and a hidden anti-spam field instead.
Security plugins that offer “Disable REST API for visitors” or “Block REST API
for non-logged-in users” break the booking form. Turn the option off, or add
plugixa-car-rental/v1 to its allowed list. For a firewall, allow POST
requests with a JSON body to /wp-json/plugixa-car-rental/v1/public/.
Caching and optimisation plugins
The page that holds the booking form can be cached. Its markup is the same for every visitor, and prices and availability are loaded fresh by the form after the page has opened. You do not need to exclude the page.
What must not be cached:
- Responses under
/wp-json/. A cache or CDN rule that stores API answers (Cloudflare “Cache Everything”, for example) would show the same cars and prices to everybody. Exclude/wp-json/plugixa-car-rental/from it. - The customer booking page’s link. It carries a token in its address; most page caches skip addresses with query strings, which is what you want.
The form’s script is loaded as a JavaScript module (type="module"). Features
that rewrite scripts can break it:
| Feature | What to do |
|---|---|
| Combine or concatenate JavaScript | Exclude the plugin’s files, under wp-content/plugins/plugixa-car-rental/assets/frontend/. |
| Delay JavaScript until user interaction | Exclude the same files, or the form shows nothing until the visitor moves the mouse. |
| Defer or async every script | Usually harmless. Exclude the files if the form stays on “Loading…”. |
After changing any of these, clear the cache and test in a private window.
Rate limiting on the public routes
Each public route counts requests per visitor address, per hour. The limits are sized for a real customer with room to spare.
| Route | Requests per hour |
|---|---|
| Loading the form | 300 |
| Searching for cars | 120 |
| Holding a car | 15 |
| Reading the booking in progress | 120 |
| Checkout | 15 |
| Checking a coupon code | 20 |
| Opening the customer booking page | 60 |
| Cancelling from the customer booking page | 10 |
| Asking for the booking link again | 5 |
A visitor over a limit sees “Too many attempts. Please wait a few minutes and try again.” The counter clears an hour after the last request it let through.
Every visitor is refused at once. Your site is behind a proxy, a load
balancer or Cloudflare, so every visitor arrives from the same address and they
all share one counter. The plugin reads only the connecting address on purpose,
because a forwarded header can be forged. Tell it which header to trust with the
plugixa_car_rental_client_ip filter; there is an example on
Hooks.
You are refused while testing. Searching many times in a row from one computer reaches the search limit. Wait an hour, or test from another network.
The booking link in the email does not work
| What the customer sees | Cause and fix |
|---|---|
| No link in the email at all | The Customer portal app is off, or no published page shows the customer booking page. |
| The link opens the wrong page | Portal page ID points at a page that is not the booking page. Set it to 0 to let the plugin find the page itself. |
| “This link is not valid any more. Use “Find my booking” to get a new one.” | The link was copied incompletely, or no longer matches the booking. Under Find your booking on the same page, the customer enters the booking reference and their email address and chooses Email me the link. |
Export CSV is missing or fails
| What you see | Cause and fix |
|---|---|
| No Export CSV button on any list | The Export app is off in the App manager, or your user lacks the plugixa_car_rental_export capability. |
| No button for one staff member only | Their role lacks plugixa_car_rental_export, or a plugixa_car_rental_user_can filter refuses them. |
| “The export could not be produced.” | The request was blocked or timed out. See REST requests are blocked. |
| The file has more bookings than the list | The list was changed after the export started, or the trash view is open: the export holds the bookings outside the trash. See Bookings. |
| The file has fewer rows than the list | One export holds at most 10,000 rows. |
| Times in the file are an hour off | Times in the file are in UTC, as the column headings say. |
A customer’s bookings are not erased
WordPress’s Erase Personal Data tool anonymises only finished bookings. The request’s messages list each booking that was kept, by reference, and why: the rental is still open, or an invoice was issued for it. Run the erase again once an open rental is completed or cancelled. An invoiced booking is kept on purpose. Bookings are matched by the email address on the booking, so a customer who booked with another address needs a second request. See Privacy and uninstall.
Deleting the plugin did not remove my data
That is the default. Deleting keeps your fleet, bookings and settings unless Delete all rental data when the plugin is deleted was on under Settings -> Uninstall before you deleted it. Even then, nothing is erased while another copy of the plugin, such as Pro beside the free one, is still installed. See Privacy and uninstall.
The map does not appear PRO
The map shortcode prints nothing
visible when it cannot draw a map. View the page’s source and look for a
comment starting with plugixa-car-rental map:. It says which case it is.
| What you see | Cause and fix |
|---|---|
[plugixa_car_rental_map] as text |
Pro is not active, or the Map app is switched off in the App Manager. |
Nothing, with the comment maps are turned off in Settings |
Show maps on the site is off under Settings -> Map. It turns off the shortcode and the map in the booking form. |
Nothing, with the comment set a Google Maps API key in Settings |
No key is saved. Paste one into Google Maps API key (browser) and click Save. |
Nothing, with the comment no location has coordinates |
No published location that takes pickups or returns has both a Latitude and a Longitude. Add them on the location. |
| The list of desks appears, but the map area stays grey or shows “This page can’t load Google Maps correctly” | Google refused the key. In the Google Cloud console, check that the Maps JavaScript API is enabled for the key’s project, that billing is set up on the project, and that the key’s website restrictions include your site’s address (for example https://example.com/*). The browser’s console names the exact error, such as RefererNotAllowedMapError or ApiNotActivatedMapError. |
| A desk is missing from the map | It is unpublished, takes neither pickups nor returns, or has no coordinates. |
| A desk has no Book here button | It does not take pickups, or no published page holds the booking form. Add the form to a page, or give the map a page attribute. |
| The booking form shows no map in its first step | Show a map to choose the pickup desk in the booking form is off, or fewer than two locations that take pickups have coordinates. With a single pickup desk there is nothing to choose, so the map is left out on purpose. |
| The map is held back until the visitor accepts cookies | Your consent tool is blocking Google’s script. That is its job; the booking form still works with its Location field. |
Getting more help
When you contact support, say which edition and version you use, which step of the form shows the problem, and the exact message on screen. If the problem is a REST request, the response from the browser’s developer tools (the Network tab) is the most useful thing you can send.