RideCab Documentation

Premium Taxi & Cab Booking Plugin for WordPress + WooCommerce — built by Canopus Web Agency.
Version 1.7.0 This documentation covers all features of RideCab 1.7.0. Built to professional quality standards with zero PHP notices under WP_DEBUG.
🚕
Multi-step booking form

3-step form with vehicle selection and WC checkout

💰
4 pricing engines

Per km, per hour, tiered distance (per-unit or flat fee), tiered hourly

📍
Geofence rules

Polygon-based fixed fares and surcharges per zone

🗓️
Your choice of calendar

Built-in month view, or Google Calendar for the company and each driver

1. System Requirements

ComponentMinimumRecommended
PHP7.48.2
WordPress5.86.5+
WooCommerce7.08.0+ (HPOS)
MySQL / MariaDB5.6 / 10.08.0 / 10.6
Google Maps APIRequiredRequired for autocomplete, maps & geofences
HPOS Compatibility RideCab is fully compatible with WooCommerce High-Performance Order Storage (HPOS / Custom Order Tables). Never use get_post_meta() on WC orders — always use $order->get_meta().

2. Installation

  1. Upload the plugin Go to WordPress Admin → Plugins → Add New → Upload Plugin. Select the ridecab.zip file and click Install Now.
  2. Activate Click Activate Plugin. RideCab will automatically create all required database tables.
  3. Confirm WooCommerce is active RideCab requires WooCommerce 7.0+. If WooCommerce is not active, an admin notice will appear and the plugin will not load.
  4. Activate your licence Go to RideCab → License and enter the key sent to you after purchase. Until it is activated, every feature stays disabled.
  5. Configure Settings Navigate to RideCab → Settings and complete at minimum the General and Maps tabs.
  6. Add a vehicle Go to RideCab → Vehicles → Add New. Set a name, pricing type, and rates.
  7. Embed the booking form Add the shortcode [ridecab_booking_form] to any page or post.

3. General Settings

Found at RideCab → Settings → General.

OptionDescription
Booking Number PrefixPrepended to every booking number. Default: RC- → produces RC-0001.
Booking Number LengthMinimum digit count (zero-padded). Default: 4.
Minimum Booking AdvanceHours of notice you need before a pickup. 0 = no minimum.
Maximum Booking AdvanceHow many days ahead customers may book. 0 = no limit.
Return Trip DiscountPercentage taken off the return leg when a customer books a round trip.
Apply surge before the minimum fareWhen enabled, surcharges are calculated first and the minimum fare acts as a final floor. Disabled by default.
Default Booking StatusWhether a new booking arrives as Confirmed or Pending — see Booking Management.
Passenger CapacityHides vehicles too small for the requested party. Disabled by default — see Availability & Capacity.
Fleet AvailabilityStops a vehicle type being offered once its whole fleet is booked for the slot. Disabled by default — see Availability & Capacity.
Turnaround bufferMinutes a vehicle stays occupied after a ride ends. Only applies when Fleet Availability is on.
Enable Driver ManagementShows the Drivers submenu. Disabled by default — enable only if you assign drivers.
How the advance limits are applied The booking form bounds its calendar to the window, hides time slots that fall inside your notice period, and opens on the first day a ride can actually be taken. The fare and cart endpoints check the same limits again on the server, so the rule holds even if someone calls the API directly.

4. Maps & Location Settings

Found at RideCab → Settings → Maps.

Google Maps Setup

You need two separate API keys from Google Cloud Console:

Client API Key (browser-side)

Enable these APIs in Google Cloud Console:

  • Maps JavaScript API — renders the interactive map
  • Places API — address autocomplete on pickup / drop-off inputs
  • Geocoding API — converts a typed address to coordinates
  • Directions API — draws the route and measures the real driving distance
Security: Restrict this key to your domain using HTTP referrers in Google Cloud Console. Without a restriction, anyone can use your quota.
Do not skip the Directions API Without it RideCab cannot obtain a driving route, so it falls back to a straight-line distance in order to still show a price. Fares then come out far too low — a 26 km road trip is billed as 14 km — and no route is drawn on the map. If your distances look short and the map shows no blue line, this is why.

Server API Key (backend-only)

Enable these APIs:

  • Distance Matrix API — calculates road distance and travel time for fare calculation
  • Geocoding API — server-side address-to-coordinates conversion
Security: Restrict this key to your server's IP address. This key is never sent to the browser.

Other Settings

OptionDescription
Distance UnitKilometres or Miles. Affects fare rates and all distance displays.
Default Map CenterWhere the booking form map opens before an address is entered. Search your city and fine-tune with the draggable preview.
Default Zoom1 = world view · 15 = streets · 20 = building level. Default: 12.
If your theme also loads Google Maps Many taxi themes ship their own map or booking module and load the Google Maps API themselves. Two loads on one page leave google.maps in an unpredictable state, and the form then works on one visit and not the next. RideCab 1.5.1 and later survive this, but the reliable fix is to load it once: turn the map off in your theme's settings, or remove the theme's own API key.

5. Appearance Settings

Found at RideCab → Settings → Appearance.

OptionDescription
Primary ColourMain accent colour for buttons, active step indicator, and highlights.
Secondary ColourContrast colour for button text and card backgrounds.
Custom Error MessagesOverride the default validation messages shown in the booking form.

6. Email Settings

Found at RideCab → Settings → Emails.

Automatic Emails

A single checkbox at the top of the tab, ticked by default, decides whether RideCab sends its own booking email at all.

Unticking it does two things, not one RideCab stops sending its confirmation — and it also stops silencing WooCommerce's own order emails, which it normally suppresses so a customer never receives two messages for one booking. Your customers therefore keep receiving something: the standard WooCommerce emails, which you can style and word yourself through the usual template overrides. Payment links, which WooCommerce sends on request, are never affected either way.

Untick it when you want to write your own emails, or when you drive the booking flow from WooCommerce statuses rather than from RideCab.

Company Information Fields

FieldDescription
Company LogoUpload via the WordPress media library. The logo is displayed at the top of HTML emails (max 160 × 60 px). It does not appear in plain-text emails.
Company NameBusiness name shown in bold below the logo.
AddressStreet address or full address block. Line breaks are preserved in HTML emails.
PhoneClickable tel: link in HTML emails. Spaces are stripped from the href automatically.
Contact EmailClickable mailto: link in HTML emails.
SIREN / VAT numberShown in the email company block. Hidden automatically when left empty.

The Booking Email

RideCab sends one confirmation email per booking, when the order reaches Processing or On Hold. The customer receives it, and the store admin receives the very same message as a hidden BCC — so the two can never drift apart in wording.

The admin's copy additionally carries the customer's name, email and phone; those stay hidden on the customer's own copy.

WooCommerce's New Order, Processing Order and On Hold emails are suppressed for RideCab orders while automatic emails are on, so nobody receives the same booking twice.

What Appears in the Email

  • A route map image showing pickup (A), stops and destination (B)
  • Company logo, name, address, phone, contact email and tax numbers
  • Booking reference number
  • Pickup address, any intermediate stops, and destination
  • Pickup date & time
  • Vehicle name, passenger count and luggage count
  • Estimated distance and duration
  • Total price and payment method
  • Customer notes, if entered

Template Overrides

Email templates follow the standard WooCommerce override path. Copy the files to your theme to customise them without losing changes on plugin update:

TemplateOverride path in your theme
Customer HTML emailyour-theme/woocommerce/emails/ridecab-customer-booking.php
Customer plain-text emailyour-theme/woocommerce/emails/plain/ridecab-customer-booking.php
Use a child theme Overrides placed in a parent theme are erased by its next update, silently, and your emails revert to the defaults.

Translation

All strings inside the email templates use __( '...', 'ridecab' ) and are fully translatable. RideCab bundles .mo files for Arabic, German, Spanish, and French. When a customer's WordPress locale is set, WooCommerce switches to that locale before sending the customer email, then restores the site locale — so the customer receives the email in their own language automatically.

7. Vehicles

Found at RideCab → Vehicles → Add New.

Each vehicle type has its own pricing model, limits, and display options. Common fields:

FieldDescription
Pricing TypePer km, Per Hour, Tiered Distance, Tiered Hourly — see next section.
Base FareFixed charge applied before any distance/time billing starts.
Minimum FareFloor price. If the calculated fare is lower, this value is used. 0 = no floor.
Rate per km / miYour standing tariff for this vehicle, used whenever no rule says otherwise. A surge rule can replace it for a given period — see Surge Pricing.
Price MultiplierScales the entire strategy subtotal. 1.00 = no change · 1.50 = 50% premium. Applied on top of a replacement rate too, so leave it at 1.00 if the rate you type is the price you charge.
Min / Max DistanceHard limits. Bookings outside these bounds return an error.
Per Additional PassengerExtra charge per passenger beyond the first. 0 = free.
Per SuitcaseExtra charge per piece of luggage. 0 = included.
Max PassengersHow many people the vehicle seats. Shown on the vehicle card, and used to filter search results when Passenger Capacity is enabled — see Availability & Capacity.
Max Luggage PiecesHow many bags fit. Shown on the vehicle card.
Fleet QuantityHow many physical vehicles of this type you operate. Used to prevent overbooking when Fleet Availability is enabled — see Availability & Capacity. 0 = no limit.

8. Availability & Capacity

Two independent controls that decide which vehicles a customer is allowed to pick. Both are off by default, so updating the plugin never changes how your existing form behaves — switch them on at RideCab → Settings → General.

Passenger Capacity

Without this option, every active vehicle is offered whatever the party size: a customer searching for 7 people still sees a 3-seat saloon in the results. Enable Passenger Capacity and any vehicle whose Max Passengers is below the requested number is greyed out, cannot be selected, and shows the reason — “Saloon: maximum 3 passengers.”

The card stays visible on purpose. Removing it entirely leaves the customer wondering whether you run that vehicle at all; greying it out tells them it exists but is too small for this trip.

Fleet Availability

Set Fleet Quantity on each vehicle (RideCab → Vehicles) to the number of cars of that type you actually own — 2 saloons, 1 minibus. Enable Fleet Availability and a vehicle type disappears from the offer once every one of its units is already booked over the requested time slot. The other types stay bookable: running out of saloons does not take your minibus off the market.

A vehicle left at 0 is treated as unlimited, which is what every vehicle starts as after the update. Nothing changes until you fill the field in.

How a time slot is measured

A ride holds its vehicle from the pickup time until the trip ends, plus the Turnaround buffer set in General Settings (60 minutes by default) to cover the driver getting back into circulation.

Existing bookingVehicle occupiedNew requestResult
14:00, 25 min trip14:00 → 15:2515:30Available
14:00, 25 min trip14:00 → 15:2514:40Conflict — one unit used

Cancelled bookings release their vehicle immediately. Every other status — confirmed, driver assigned, in progress, completed — keeps it held for its window.

Both checks run on the server The booking form greys out the cards, and the fare and cart endpoints apply the same two rules again before anything reaches the basket. Posting straight to the API cannot get around either limit.
Fleet Availability counts paid bookings A booking occupies a vehicle from the moment its order is paid or put on hold. Two customers filling in the form at the same second can therefore both reach checkout; the second is refused when they try to pay, not while they browse. For most operators that is the right trade-off — holding vehicles for unpaid baskets blocks slots for people who never complete. If you run high enough volume for the race to matter, get in touch.

9. Pricing Types

Per km / Per mi

Formula: base_fare + (distance × rate_per_km) + (duration_min × rate_per_minute)

The Rate per Minute field is optional (0 = disabled). Use it for time-based surcharges on top of the distance rate.

The rate on the vehicle is your everyday tariff. If it changes at weekends, over the holidays or in high season, you do not need a second vehicle: a surge rule can replace the per-km rate for those periods, and this is the only pricing type that can.

Per Hour

Formula: base_fare + (driving_minutes / 60 × per_hour_rate)

Uses the Google Maps driving time. The vehicle multiplier is applied on top.

Tiered Distance

You define distance bands, then choose in Band Calculation how they are charged. The same bands can mean two very different things:

ModeHow a band is read
Cumulative
default
Each band holds a rate per unit, and the fare accumulates across every band the trip crosses.
0–10 km = €3/km · 10–50 km = €2/km · 50+ = €1.50/km.
Flat feeEach band holds the total price of the ride. A 20 km trip landing in the 15–25 band costs that band's price, full stop — nothing accumulates.
0–15 km = €50 · 15–25 km = €60 · 25–40 km = €75.

The third column of the bands table renames itself to match the mode, so it always says what the number means.

Flat fee: base fare and rate per minute are ignored Inside a band, the band price is the fare. Surcharges, geofence rules and the minimum fare still apply on top.
Fill in the rate per unit even in flat mode Any distance no band covers — everything past the last band, and any gap you leave between bands — is priced the ordinary way instead: base fare, plus rate per unit, plus rate per minute. Leave those at zero and a long ride is quoted at zero. Make your bands meet exactly: 0–15, 15–25, 25–40, not 0–15 then 16–25.

Tiered Hourly

Each hour band has its own per-hour rate. The customer selects booked hours via a counter on the booking form. The last band applies to any duration beyond its upper bound.

Example: 1–3 h = €40/h · 3–8 h = €35/h · 8+ h = €30/h.

Booked hours UI: When a Tiered Hourly vehicle is selected in step 2, an hour counter automatically appears. This value is sent as booked_hours to the server.

10. Surge Pricing (Surcharges)

Found at RideCab → Surge Pricing → Add New.

Surcharges are applied on top of the vehicle strategy subtotal. Three trigger types:

TypeDescription
Time-basedApplies during specific hours of the day (e.g. 22:00–06:00 = night rate).
Date-basedApplies on a specific calendar date (e.g. public holiday).
Day-of-weekApplies on a specific weekday (e.g. every Saturday).

Each rule can be a flat amount (€15), a percentage (+25%), or a replacement per-km rate — see below.

Rules have a Priority field — higher numbers are evaluated first. Multiple rules can match and stack.

Use the Vehicle Application checkboxes to limit which vehicle types a surcharge applies to.

Several date ranges in one rule

A date-based rule holds as many ranges as you need. Pick a start and an end, press Add date range, repeat. The rule fires when the pickup falls inside any one of them, so a whole school-holiday calendar lives in a single rule instead of one rule per period.

The same has always been true of day-and-time rules: Add time stacks as many weekday windows as you like.

Replacing the per-km rate

Set Price increase to Replace the per-km rate and the rule stops adding to the fare: it sets the price per kilometre outright for the period it covers. You type the tariff you actually charge — 3.50 — instead of working out the percentage that gets you there from the vehicle's standing rate.

Each vehicle covered by the rule gets its own rate field, so one rule carries a whole column of your price list:

RuleWhenSaloonEstateMinibus
(vehicle's own rate)Weekdays2.502.602.70
WeekendSat + Sun3.503.603.70
Holiday weekendYour date ranges3.703.803.90

Your everyday tariff stays on the vehicle itself; you only write a rule for the periods that differ. Leave a vehicle's rate empty and the rule's own Increase value is used for it, which is handy when every vehicle shares one tariff.

Rate rules do not stack — the highest priority wins Unlike amounts and percentages, only one replacement rate applies: the first matching rule in priority order, and the search stops there. Give Holiday weekend a higher priority than Weekend and a Saturday in the holidays is charged 3.70 rather than 3.50. A rule that replaces the rate never also adds a surcharge.
Only vehicles priced per kilometre are affected A vehicle on tiered distance reads its bands from its own tier table, and a per-hour vehicle has no kilometre rate to replace. A replacement rate on either is ignored rather than guessed at. Check the vehicle's Pricing Type before writing the rule.

11. Geofence Rules

Found at RideCab → Geofence Rules → Add New.

Geofence rules override or augment the fare based on the physical location of the pickup and/or dropoff point. Each rule has two zones: Location 1 (pickup) and Location 2 (dropoff).

Geofences outrank your pricing bands A matching fixed fare rule replaces the banded price entirely, whatever the distance. Surcharge rules are added on top of it instead. Bands therefore price only the trips no rule covers — which is exactly how most operators want it: bands as the everyday tariff, geofences for airports, stations and negotiated flat fares.

Zone Types

TypeDescription
Precise locationDraw a polygon on the map. The pickup/dropoff must fall inside the polygon for the rule to apply.
AnywhereThe rule applies regardless of the location on that side. Useful for "from airport to anywhere" rules.

Price Types

TypeDescription
Fixed fareReplaces the distance-based fare entirely. The highest-priority matching fixed rule wins; lower-priority fixed rules are ignored.
Flat surchargeAdds a fixed amount on top of the calculated fare.
Percentage surchargeAdds a percentage of the calculated fare on top.

Direction

OptionDescription
Origin ⟺ Destination (both ways)The rule applies in both directions: pickup in Location 1 & dropoff in Location 2, or the reverse.
Origin → Destination (one way)Only applies when the pickup is inside Location 1 and the dropoff inside Location 2. The return trip is not affected.
Requires a Google Maps API key to draw polygons. If no key is configured in Settings → Maps, the map will not load and you cannot draw zone polygons. Add your API key first, then return to the geofence rule.
Polygon accuracy tip: Google Places returns a precise coordinate for an address — the terminal entrance of an airport, say. Draw generously, with a 200–500 m buffer around the target area, so the geocoded point always falls inside.
Geofences price, they do not refuse There is no way to reject a booking whose pickup falls outside your service area. A geofence can make such a trip expensive, but not impossible. If you need to turn work away, review each request before taking payment rather than relying on zones.

How to Create an Airport → Station Fixed Fare

  1. Set Location 1 type to "Precise location" and draw a polygon around the airport terminal area. Make it generous.
  2. Set Location 2 type to "Precise location" and draw a polygon around the train station area.
  3. Set Price type to "Fixed fare" and enter the amount (e.g. €100).
  4. Check the vehicles the rule should apply to in Vehicle Application.
  5. Set Status to Active and click Publish.

12. Booking Form

The booking form is a 3-step flow embedded via the [ridecab_booking_form] shortcode.

StepContent
Step 1Pickup & drop-off address · date · time · passengers & luggage · return trip toggle
Step 2Vehicle selection with server-calculated prices · route map · booked hours counter (tiered hourly)
Step 3Booking summary → redirect to WooCommerce checkout for payment

Time Picker (12h / 24h)

The time picker automatically detects your WordPress time format (Settings → General → Time Format).

  • If the format contains g or h (PHP 12-hour chars), the 12h picker is shown with an AM/PM selector embedded inside the hour field.
  • Otherwise the 24h picker is shown (00h–23h).
  • Slots that have passed, and slots falling inside your Minimum Booking Advance, are hidden. The calendar is bounded by both advance limits, and opens on the first bookable day.

Instant Booking Tab

When enabled on a booking form (Forms → Edit → Enable Instant Booking), a second tab appears with a simplified time-slot picker for quick same-day bookings.

13. Booking Management

Found at RideCab → Bookings. Each booking row links to a detail page with two postboxes:

  • Customer Information — name, email, phone, ride date & time.
  • Trip Details — route, vehicle, distance, duration, fare breakdown, driver assignment, admin notes.

Booking Statuses

StatusMeaning
pendingNew booking, awaiting confirmation
confirmedConfirmed by admin or auto-confirmed
driver_assignedDriver has been assigned
in_progressTrip has started
completedTrip finished successfully
cancelledCancelled by customer or admin
no_showCustomer did not appear
refundedPayment refunded via WooCommerce

The status a booking starts on

By default a booking is created as Confirmed: the order came in, the ride is on. If you vet work before committing to it, set Settings → General → Default Booking Status to Pending and every new booking waits here for you to move it on.

This does not stop the money The setting labels the ride inside RideCab; it has no effect on the WooCommerce order, whose status your payment method decides. If what you want is to receive requests without being paid yet, that is a WooCommerce gateway choice — see Taking payment only after you accept. The two work well together: the gateway leaves the order unpaid, this setting leaves the ride unconfirmed.
These are RideCab statuses, not WooCommerce statuses They are stored separately and describe the ride, not the payment. Changing one here never changes the WooCommerce order status, and never makes an order payable. Money is always handled on the WooCommerce order screen.

14. Calendar

Found at RideCab → Calendar. One menu, and a dropdown at the top of the screen chooses which calendar is in use — one at a time.

ChoiceWhat you get
Built-in calendarA month, week and day view inside WordPress. Every booking is coloured by its assigned driver, using the Calendar Colour set on the driver's profile. Click an event to open the booking. Works immediately, no setup.
Google CalendarBookings are pushed into real Google calendars — see the next section. Has to be connected first.

The choice is saved, and only the selected calendar loads: no unused menus, no unused routes.

Upgrading from an older version Sites that had already connected Google keep it selected. Everyone else starts on the built-in calendar, which needs nothing configured.

15. Google Calendar

Bookings are written to Google Calendar and kept in step: created when an order reaches Processing, On Hold or Completed, updated when the ride changes, and deleted when it is cancelled or refunded.

Who connects what

AccountReceivesConnected from
Business accountEvery booking, whoever is driving. This is your full diary.RideCab → Calendar
Each driverOnly the rides assigned to them.Their own WordPress profile page

You cannot connect a driver's account for them — each person authorises their own. Reassigning a ride moves the event from one driver's calendar to the other's automatically.

One-time setup

Google requires every site to identify itself before it may write to a calendar. The Calendar screen walks you through it; in short:

  1. Create a Google Cloud project at console.cloud.google.com, signed in with your company Google account.
  2. Enable the Google Calendar API for that project.
  3. Fill in the OAuth consent screen — type External, an app name, a contact email — then press Publish app.
  4. Create an OAuth client of type Web application, and paste in the redirect URI shown on the RideCab Calendar screen, exactly as displayed.
  5. Copy the Client ID and Client Secret into RideCab and save.
  6. Press Connect, approve, and tell your drivers to do the same from their profile.
Publish the app, or it breaks after seven days While the OAuth app stays in Testing, Google expires the connection after 7 days and only accounts listed as testers may authorise at all — that is the Error 403: access_denied people hit. Publishing fixes both. Google will then show an "unverified app" notice, which you pass with Advanced → Continue; it is harmless below 100 connected accounts.

How it behaves

  • Event contents: booking number, pickup and destination in the title, the pickup address as the location, and the customer, phone, passengers, distance and fare in the description.
  • Duration: the estimated trip time, or one hour when unknown.
  • Refresh tokens are encrypted in the database, so a database dump does not hand over access to real calendars.
  • Writes run in the background on a scheduled event: checkout is never slowed down, and a Google outage never fails an order.
  • If access is revoked on Google's side, the connection is marked disconnected and an admin notice tells you which account stopped working.
  • Recent sync failures are listed at the bottom of the Calendar screen with the exact message from Google.
Nothing appears in the calendar? Check, in this order: the dropdown is on Google Calendar; an account is actually connected; and the failures list at the bottom of the screen. Writes are queued through WP-Cron, which only fires when the site receives a visit — on a quiet site, load a public page and look again.

16. Invoices

Found at RideCab → Invoices.

Generate a printable PDF invoice for any booking. Click Generate on a booking row — a new tab opens with a formatted invoice that auto-triggers the browser's Print dialog. Use Save as PDF from the print dialog.

Invoice Settings

Found at RideCab → Invoices → Settings tab. Configure:

  • Company name, logo, address, phone, email, website
  • SIREN / company registration number and VAT/TVA number
  • Invoice number prefix and padding (e.g. INV- + 4 digits → INV-0001)
  • Primary accent colour and footer text
  • Signature image (PNG with transparent background recommended)

Templates

TemplateStyle
ClassicHorizontal logo/INVOICE header, three-column billing section
ModernColoured sidebar with company info, light main column
MinimalSerif typeface, ruled lines, no colour fill — clean & printer-friendly
CorporateDark navy header, bordered info grid, accent left-border on totals

17. Drivers

Driver management is disabled by default. Enable it at RideCab → Settings → General → Enable Driver Management.

Once enabled, the Drivers submenu appears. Each driver record links to a WordPress user account. Fields include:

  • Linked WP user (for login access)
  • License number
  • Phone
  • Calendar colour (used in the built-in calendar)
  • Status: Active / Inactive / Suspended
  • Commission rate (%)

Assign a driver on the booking detail page. The built-in calendar then shows the booking in that driver's colour, and — if Google Calendar is in use and the driver has connected their account — the ride appears in their own phone calendar.

There is no driver app RideCab does not ship a driver application, and does not connect to third-party dispatch apps. Drivers receive their assigned rides through their own Google Calendar: no app to install, works on any phone. Accepting or declining jobs, live tracking and status updates from the driver's side are not part of the plugin.

18. Licensing

Found at RideCab → License. Until a valid key is activated, RideCab loads only its Dashboard and License pages: no booking form, no admin screens, no REST routes.

QuestionAnswer
Where does the key come from?It is generated on purchase and emailed to you automatically.
How many sites?One site per copy bought. Buy three copies and the single key you receive activates on three domains.
Moving to another domain?Deactivate on the License page of the old site first — that frees one slot, and your other sites keep theirs.
Staging sites?They consume a slot like any other domain. Deactivate before deleting a staging copy.
UpdatesNew versions appear in the WordPress dashboard while the licence is valid.
Reinstalling is free Re-activating a domain that already holds a slot never consumes a second one, so a reinstall or a plugin update cannot burn your quota.

19. WooCommerce Integration

RideCab uses WooCommerce as its payment engine. The flow is:

  1. Booking form submitted — fare calculated server-side via POST /wp-json/ridecab/v1/fare/estimate.
  2. Ride added to WC cart as a virtual product with the calculated price.
  3. Customer redirected to WC checkout — all WC payment gateways (Stripe, PayPal, SumUp, bank transfer, cash on delivery, etc.) are available automatically.
  4. Server-side price recalculation on checkout submit — the price is recalculated via POST /wp-json/ridecab/v1/cart/add to prevent tampering.
  5. WC order created — all booking data stored in WC order meta with the _ridecab_ prefix.
  6. RideCab booking record created in the ridecab_bookings table.
Leave the ride product virtual, and not downloadable RideCab creates a hidden virtual WooCommerce product for the ride. Virtual removes shipping from checkout; leaving Downloadable unticked is what makes a paid order land on Processing rather than jumping straight to Completed. Tick it and your payment-received email never fires.

Taking payment only after you accept

Some operators want to vet a ride before charging for it. WooCommerce does this natively, with no code: place the order through a gateway that takes no money — Cheque renamed to something like "Booking request" — so it lands on On Hold. Review it, then switch the order to Pending payment and use Order actions → Send order details to customer. That email carries a payment link.

The status matters An On Hold order is not payable in WooCommerce, so a payment link sent on one leads nowhere. It is the switch to Pending payment that unlocks it. Beware the two similar labels: On hold and Pending payment are not the same status.

Key WC Meta Keys

Meta KeyValue
_ridecab_booking_idID in ridecab_bookings table
_ridecab_pickup_addressFull pickup address text
_ridecab_dropoff_addressFull drop-off address text
_ridecab_pickup_datetimeISO datetime of pickup
_ridecab_vehicle_type_idVehicle type ID
_ridecab_fare_breakdownJSON fare breakdown object
_ridecab_booking_statusRideCab booking status
_ridecab_driver_idAssigned driver ID

20. Shortcodes

[ridecab_booking_form]

Renders the 3-step booking form. Place on any page or post.

[ridecab_booking_form]

Use form_id to embed a specific booking form when you have several:

[ridecab_booking_form form_id="2"]

Google Maps JS is only loaded on pages that contain this shortcode — it is never loaded globally.

21. Translations

RideCab is 100% translation-ready. All strings use the text domain ridecab.

Bundled translations (in /languages/):

LanguageFile
English (default)No file needed — built into the plugin
Frenchridecab-fr_FR.mo
Germanridecab-de_DE.mo
Spanishridecab-es_ES.mo
Arabic (RTL)ridecab-ar.mo

To add a language, translate the strings with Poedit, save as ridecab-{locale}.po (e.g. ridecab-it_IT.po), compile to .mo, and upload both to the plugin's /languages/ directory. WordPress loads the right file from the site language.

22. Developer Hooks

RideCab exposes a small number of hooks so a site can change pricing or notification behaviour from a companion plugin, with no edit to RideCab's own files and nothing to redo after an update. The list is deliberately short: everything below is in use and will keep working across releases.

ridecab_fare_calculated

Filters the assembled fare breakdown just before the calculator returns it. This runs for every price the plugin produces — the live estimate in the booking form and the price charged at checkout both pass through it, so a change here cannot make the two disagree.

apply_filters( 'ridecab_fare_calculated', array $breakdown, array $params, array $vehicle )
ArgumentContents
$breakdownbase, distance, duration, extras, surcharges, discount, total, strategy, minimum_applied, surcharge_items, extras_items, coupon_valid, coupon_error, errors, currency.
$paramsThe sanitised booking parameters, including distance_km, duration_minutes, passengers, suitcases, booked_hours, pickup_datetime and the pickup / drop-off coordinates.
$vehicleThe vehicle type row, with its rates, limits and pricing_type.

Anything added to $breakdown['errors'] makes the booking form grey that vehicle out and show the message, which is how the built-in distance limits report themselves.

To reprice a ride on a distance other than the one travelled — billing a return to a fixed operating base, for instance — call the calculator again rather than redoing its arithmetic, and guard against re-entry:

add_filter( 'ridecab_fare_calculated', function ( $breakdown, $params, $vehicle ) {
    static $busy = false;
    if ( $busy ) { return $breakdown; }   // let the inner call through untouched

    $extra_km = my_distance_to_base( $params['dropoff_lat'], $params['dropoff_lng'] );
    if ( $extra_km <= 0 ) { return $breakdown; }

    $busy = true;
    $calc = new RideCab_Fare_Calculator();
    $repriced = $calc->calculate( array_merge( $params, [
        'distance_km' => $params['distance_km'] + $extra_km,
    ] ) );
    $busy = false;

    return $repriced;
}, 10, 3 );
The displayed distance is separate from the priced one The distance shown on the WooCommerce order line, in the confirmation email and on the invoice is the value posted by the booking form, not the one this filter prices on. Returning a repriced breakdown therefore leaves what the customer sees untouched. Rewriting distance_km on the REST request instead would change both.
Two things to check when repricing For vehicles priced per kilometre or per hour the booking form shows an instant estimate calculated in the browser from the vehicle's own rate, before the server's price arrives, so a repriced fare visibly changes once it lands. Tiered pricing shows a placeholder instead. The vehicle's minimum and maximum distance limits and its tiered bands also see whatever distance you price on.

ridecab_admin_booking_email_recipient

Filters the address list that receives a copy of every booking confirmation.

apply_filters( 'ridecab_admin_booking_email_recipient', string $recipient )

Accepts a comma-separated list and defaults to the WordPress admin email. Note that the “New Ride Booking (Admin)” email is not sent as a separate message: while it is enabled, these addresses are added as Bcc to the customer's confirmation. Disabling that email in WooCommerce → Settings → Emails stops the copy entirely, and this filter is then never consulted.

ridecab_booking_saved

Fires after a booking's status or driver assignment is saved from the admin screen, once the order meta has been written.

do_action( 'ridecab_booking_saved', int $booking_id )

The booking id is the WooCommerce order id. This is what moves a ride between driver calendars when an assignment changes. It does not fire when a booking is first created at checkout.

ridecab_booking_created

Both email classes listen for this action, but RideCab never fires it — the confirmation is triggered directly once the booking row exists. It is left in place so a site can send the confirmation from its own code:

do_action( 'ridecab_booking_created', $order );

Firing it for an order RideCab has already mailed sends a second copy, as the once-only guard is on RideCab's own path.

Need an extension point that is not here? Ask. Adding a filter is usually a small change and we would rather ship one than have a customer patch the plugin and lose it at the next update.

23. FAQ

The map and the address autocomplete work on some visits and not others.

Your theme is almost certainly loading the Google Maps API as well — most taxi themes ship their own map or booking module. Two loads on one page leave google.maps in whatever state the one that arrived first put it in, which is why a refresh often "fixes" it. Google says so in the console: "You have included the Google Maps JavaScript API multiple times on this page." Turn the map off in your theme's settings, or remove the theme's own API key, so it loads once.

Distances and fares are far too low, and no route is drawn on the map.

Your key is missing the Directions API. Without a driving route RideCab falls back to a straight-line distance so the form still returns a price — but a straight line is always shorter than the road, so every fare is undercharged. Enable Directions API on the same Google Cloud project as your key, and check under Credentials that the key is not restricted to a list of APIs that excludes it.

Google says RefererNotAllowedMapError.

The key is restricted to a different domain — very common after cloning a site. In Google Cloud Console → Credentials, open the key and add your domain under HTTP referrers, as both https://example.com/* and https://*.example.com/*.

The booking form shows "Please enter a valid pickup address" even after typing an address.

The form requires the customer to select a suggestion from the Google autocomplete dropdown. Typing an address without picking a result leaves the coordinates empty, and the trip cannot be measured. If no suggestions appear at all, check that the Places API is enabled on your key.

The booking form appears completely unstyled.

Update to 1.5.0 or later. The stylesheet is queued while the shortcode runs, after the page head has been printed, and WordPress is meant to catch up in the footer — several page-builder stacks drop those late styles. RideCab now emits the tag itself when nothing else will.

The fare estimate shows "—" for some vehicles.

The calculator returned an error for those vehicles. Usual causes: the trip is shorter than the vehicle's Min Distance or longer than its Max Distance, or the vehicle has no rates configured. In flat-fee band mode, also check that the rate per unit is filled in — it prices everything the bands do not cover.

My replacement per-km rate is not being applied.

Three things to check, in this order. The vehicle's pricing type — only Per km vehicles can have their rate replaced; tiered distance reads its own bands and per-hour has no kilometre rate, so the rule is ignored on both. The vehicle is ticked in the rule's Vehicle Application list, and has a rate filled in beside it. Priority — replacement rates do not stack: the highest-priority matching rule wins and the search stops there, so if an ordinary weekend rule sits above your holiday rule, the holiday rate never gets a look in. Give the more specific rule the higher number.

Also worth checking: a Price Multiplier other than 1.00 on the vehicle still applies on top, so the fare will not match your rate times the distance.

Prices are not showing in the vehicle cards at all.

The fare estimate call failed. Open DevTools → Network and look for a failed POST /wp-json/ridecab/v1/fare/estimate. Usual causes: WooCommerce inactive, the REST API blocked by a security plugin, no active vehicles, or a pickup time outside your booking-advance window.

Customers and admin stopped receiving emails after payment.

While RideCab's automatic emails are on, it suppresses WooCommerce's New Order and Processing emails and sends its own — but its own is sent once, at booking time. If you drive your flow from WooCommerce statuses and want WooCommerce to send those messages, untick Automatic Emails in RideCab → Settings → Emails. WooCommerce then takes over completely.

Can I use RideCab without WooCommerce?

No. WooCommerce is a hard dependency: it handles payment, checkout, orders and customer emails. RideCab will not load without it.

Can I have several booking forms with different settings?

Yes. RideCab → Booking Forms → Add New. Each form has its own time interval, map settings, features and colours. Embed a specific one with [ridecab_booking_form form_id="2"].

How do I offer a discount code?

Use WooCommerce coupons (Marketing → Coupons). Rides go through the WooCommerce cart, so coupons apply to them like any other product, with WooCommerce's own usage limits and expiry rules.

Can I stop customers booking pickups outside my service area?

Not automatically. Geofence rules price zones, they never refuse a trip, and the address restriction is country-level only. The practical approach is to review each request before taking payment — see WooCommerce Integration.

What data does RideCab store?

Booking data stays in your own WordPress database: customer name, email, phone, pickup and dropoff coordinates, date and time, vehicle, fare breakdown, and IP address for fraud prevention. Nothing is sent to Canopus servers. If you connect Google Calendar, booking details are also written to the Google accounts you authorise, and the refresh tokens are stored encrypted in your database.

Get the Plugin

Ready to deploy RideCab on your site?

One-time purchase — $79 USD. Instant download, lifetime updates included.

Buy RideCab — $79

RideCab 1.7.0 — Built by Canopus Web Agency