Contents
Stripe - Plugixa Car Rental
Stripe PRO is a payment method that sends the customer to Stripe Checkout, the payment page hosted by Stripe, and brings them back to their booking once they have paid. Card details are typed on Stripe’s page and never reach your site. Customers see it as Card (Stripe): “Pay now by card on Stripe’s secure page. Your booking is confirmed as soon as the payment goes through.”
Set it up under Plugixa Car Rental -> Settings -> Stripe. Everything on Payments about the payments ledger, refunds and payment statuses applies to Stripe payments too.
Stripe is an app, on by default in Pro. If the Stripe section is missing from Settings, switch it on in the App manager.

Setting it up
1. Save your secret key
The first card is Card payments by Stripe: “The customer pays by card on Stripe’s own checkout page and is brought back to their booking, which is confirmed as soon as the payment goes through.”
| Field | Notes |
|---|---|
| Offer card payment by Stripe | The switch that offers Stripe to customers. Off by default. Saved with the page’s Save button. |
| Secret key | “Starts with sk_. A test key (sk_test_) takes no real money.” Saved with the card’s own Save keys button. |
Copy the secret key from the developers section of your Stripe dashboard. No publishable key is needed: the payment page is Stripe’s own.
Stripe is offered to customers only when the switch is on and a secret key is saved. With the switch on and no key, the screen warns: “Stripe is switched on but has no secret key, so customers are not offered it yet.”
2. Add the webhook
The second card is Webhook. It explains: “Lets Stripe confirm a payment even when the customer closes the page before coming back, and tells the site about delayed payments, refunds made in the Stripe dashboard and disputes.”
-
Copy the Endpoint address shown on the card with the copy button beside it. It is built from your site’s own address and ends in
/payment/webhook/stripe. Always copy it from this screen rather than typing it, so it is right for your site and permalink settings. -
In the Stripe dashboard, add a webhook endpoint with that address.
-
Select the events listed under Events to send on the card. The field holds the whole list, comma separated, ready to copy:
Event What the plugin does checkout.session.completedRecords the card payment. A delayed method such as a bank debit completes unpaid, and is only announced as processing checkout.session.async_payment_succeededRecords a delayed payment once the money arrives checkout.session.async_payment_failedRecords a Failed row; the booking stays unpaid checkout.session.expiredNothing recorded; announced refund.created,refund.updatedRecords a refund made in the Stripe dashboard once it has succeeded refund.failedNothing recorded; announced charge.dispute.created,charge.dispute.closedNothing recorded; announced “Announced” means the action
plugixa_car_rental_payment_noticefires withpayment_processing,checkout_expired,refund_failed,dispute_openedordispute_closed, so a snippet can alert you. See Hooks. -
Copy the endpoint’s signing secret from Stripe and paste it into Signing secret (“Starts with whsec_.”), then press Save keys.
3. Save and test
Press Save for the switch. Use your Stripe test key first, make a booking through the booking form and pay with one of Stripe’s test cards. Then replace the test key and the test endpoint’s signing secret with the live ones.
There is no separate test mode switch. The mode follows the key: an
sk_test_ key works against Stripe’s test data, an sk_live_ key takes real
money. Test and live endpoints have different signing secrets.
How the keys are kept
The secret key and the signing secret are encrypted before they are stored and are never sent back to the browser. Once one is saved, its field is empty with a “Stored” placeholder showing a hint of the key, and a Remove button beside it. Type into the field and press Save keys to replace a key.
If the server cannot encrypt (OpenSSL is missing), the screen says so and no key can be stored. Ask your host to enable OpenSSL.
What the customer sees
- On the details step of the booking form the customer chooses Card (Stripe) among the payment methods you offer. If Pay part now PRO is on, they also choose how much to pay now.
- The booking is saved first, as Pending, and the car is held for 35 minutes. Then the customer is sent to Stripe Checkout.
- The Checkout page shows one line, “Car rental” followed by the booking reference, for the amount due now. The customer’s email address is filled in and the page follows the customer’s language.
- After paying, the customer comes back to your site and sees “Thank you. Your payment for booking ADR-2026-0001 was received; the confirmation is on its way by email.”
The Checkout session closes after about 30 minutes, a little before the car’s hold runs out, so a customer cannot pay for a car that has been released.
If the payment cannot be started, the booking form shows “The card payment could not be started. Please try again, or choose another way to pay.”
If the customer leaves Stripe’s page with its back link, they return to see “You left the payment page, so nothing was charged and booking ADR-2026-0001 is not confirmed.” The booking stays pending and unpaid until its hold runs out.
How a payment is confirmed
A payment is recorded in two independent ways, and either is enough:
| Route | What happens |
|---|---|
| The customer’s return | Stripe sends the browser back with the Checkout session’s id. The plugin asks Stripe, with your secret key, whether that session is paid, and records the payment only if Stripe says so. |
| The webhook | Stripe posts checkout.session.completed to your endpoint. The plugin checks the signature with your signing secret, then records the payment. |
Both normally arrive. The payment is still recorded once: it is identified by
Stripe’s payment intent id (pi_...), and a payment already in the ledger is
not written again.
The amount recorded is the amount Stripe reports it collected, never a figure from the browser. Once the payment is recorded, a pending booking is Confirmed and its payment status becomes Paid or Partially paid.
If the customer took so long that the car was booked by somebody else in the
meantime, the money is still recorded, because it was taken, and the booking
is left for you to refund or rebook. The action
plugixa_car_rental_payment_unplaced fires so a snippet can alert you.
Without a signing secret
The signing secret is optional, but leave it empty and every webhook is ignored: nothing can be verified, so nothing is believed. Payments are then recorded only when the customer comes back to your site, and a customer who pays and closes the tab leaves a booking that is paid at Stripe and unpaid on your site. Set the signing secret.
A webhook with a wrong signature, one signed more than five minutes ago (a replay), or for an event not in the list, is ignored and still answered with success so Stripe does not keep retrying. An event that was accepted but could not be written at that moment is answered with an error, and Stripe sends it again.
Webhooks keep being accepted while the secret key is saved, even with the switch off, so a payment begun before you switched Stripe off still lands.
Refunds
A refund of a Stripe payment made from the booking’s payments panel is sent to
Stripe first and recorded with Stripe’s refund id (re_...). If Stripe refuses
it, nothing is recorded and Stripe’s message is shown, or “Stripe did not make
the refund.” Stripe then reports the same refund to the webhook, and it is
recognised and not recorded twice.
A refund made in the Stripe dashboard arrives by webhook and is recorded against the booking whose payment it refunds, once it has succeeded.
Amounts and currencies
- The currency is the booking’s own: your store currency, or the currency the customer chose if Currencies PRO is set to charge in it. It must be a currency your Stripe account accepts.
- Amounts are sent in the currency’s smallest unit: multiplied by 100, except for these zero-decimal currencies, which are sent as whole numbers: BIF, CLP, DJF, GNF, JPY, KMF, KRW, MGA, PYG, RWF, UGX, VND, VUV, XAF, XOF, XPF.
What is sent to Stripe
The plugin talks to Stripe’s API from your server only when a customer starts a card payment or comes back from one, when a dispute arrives, or when you refund a Stripe payment. There is no Stripe script on your pages.
| When a payment starts | |
|---|---|
| Amount and currency | The amount due now |
| Booking reference | As the line’s name, the client reference and metadata |
| Booking id and payment type | As metadata |
| Customer email | When the booking has one |
| Return and cancel addresses | On your site |
A refund sends the payment intent id, the amount, and the booking and payment ids as metadata. No name, phone number, address, licence or card data is sent by the plugin. See Privacy and uninstall.
Developers can adjust the Checkout session with the
plugixa_car_rental_stripe_checkout_params filter, for example to add a
statement descriptor. The amount, metadata and addresses cannot be changed
that way.