Express Checkout with Stripe: set up, offer, check
How to offer Apple Pay, Google Pay and Link as an express purchase: set up the Stripe module, enable shipping methods, understand the notice that replaces the button and check restored orders.
At a glance
- Express purchase: The customer pays in the payment window of their wallet and skips the address entry, the shipping selection and the order review of the shop.
- Setup: The Stripe module with keys and express purchase allowed, Stripe enabled for the shipping methods, your domain registered with Stripe.
- Notice instead of the button: If the cart needs a step of the regular checkout, such as consent in the order review, the shop shows a notice and the customer orders via the regular checkout. from 4.10.0
- Unclear payment status: If the payment status of a wallet payment is unclear, the shop accepts no second Stripe payment in this session. from 4.10.0
- Restoration: If a paid purchase has no order, the shop creates the order by itself. Check such orders before you send the customer the order confirmation.
- Availability: Features with this label come with the update; no add-on module is needed. from 4.10.0
In this guide
How express checkout with Stripe works
With the express button, the customer pays directly in the payment window of their wallet. They skip the address entry, the shipping selection and the order review of the shop.
- Button: In the cart, the customer chooses a payment method, for example Apple Pay or Google Pay.
- Wallet: In the payment window, they choose the delivery address and the shipping method. The shop then calculates the shipping costs and the total.
- Check: After the payment, the shop asks Stripe whether the money has arrived.
- Order: Only then does it create the order. If the customer does not return after paying, the shop creates the order later by itself.
Where the button appears
In the off-canvas cart, on the cart page and on the login page, there only with items in the cart. Above it is the label “Express Checkout”, on the login page “Express checkout”. Product pages have no Stripe express button.
Which payment methods
Apple Pay, Google Pay and Link (Stripe’s own payment feature) as well as PayPal and Amazon Pay, depending on the selection in the Stripe module. Stripe decides for each device and browser whether a button actually appears.
Other express buttons
The buttons of the separate modules Amazon Pay and PayPal Checkout do not belong to Stripe. They lead back to the order review of the shop.
Set up express checkout
You set it up in two places: in the Stripe module of your shop and in the dashboard of your Stripe account.
In the shop
- Open the module: Under Settings → Checkout → Payment methods, edit the module “Stripe”.
- Activate: Switch on “Payment by Stripe” and enter the “Public key” and the “secret key” from your Stripe account.
- Choose payment methods: The table “methods of payment” with the help text “Select here which payment methods you want to offer via Stripe.” defines which of the five payment methods listed in the overview below may appear in the express button. The same table also determines the Stripe payment methods in the regular checkout. Several rows are possible, for example “Credit cards, ApplePay, GooglePay” and “PayPal”.
- Allow express purchase: “Allow Stripe checkout (express purchase)” stays switched on; that is the default. When it is off, no button appears in any of the three places.
- Enable shipping methods: In the “Shipping and Payment” tab of the module, enable Stripe for the shipping methods the wallet should offer, and also for the module “FREE SHIPPING!”, even if you do not offer this shipping method at all. If Stripe is not enabled for “FREE SHIPPING!” or for the shipping method chosen in the cart (without a choice, the cheapest one), no button appears. Do not enable Stripe for the shipping methods under “Shipping costs determined after the order (shipping modules)” (Settings → Checkout → Shipping/packaging): for them, the wallet would collect the total without shipping.
- Save: When you save, the shop creates or updates its webhook endpoint at Stripe. Through the webhook, it learns about payments even if the customer does not return to the shop.
| Row in the table “methods of payment” | Payment methods in the express button |
|---|---|
| “Credit cards, ApplePay, GooglePay” (default) | Apple Pay, Google Pay and Link |
| “PayPal” | PayPal |
| “AmazonPay” | Amazon Pay |
| “All payment methods” | Apple Pay, Google Pay, Link, PayPal and Amazon Pay |
At Stripe
- Register your domain: In the Stripe Dashboard, register every domain on which the buttons appear, including subdomains such as www, and for tests also in test mode. This is mandatory for Apple Pay. Stripe also lists the registration for Google Pay, Link, PayPal and Amazon Pay. You register on the “Payment method domains” page (Stripe’s instructions). The shop has no function of its own for this.
- Activate payment methods: Which buttons Stripe shows also depends on which payment methods are active in your Stripe account. Some of them have to be activated there first.
- Klarna: The table “methods of payment” does not control Klarna in the express button. If Klarna is active in your Stripe account, Stripe can show it there in addition. The order is then probably only created through the restoration, as with PayPal.
- Customer’s device: A wallet button only appears if the browser, the device and the currency support the payment method and the customer has set it up. For example, Stripe shows no Google Pay button if Google Pay is not set up.
When the shop does not offer express checkout
If the cart needs a step of the regular checkout, a notice replaces the Stripe button. In other cases, the button is missing without a notice.
Notice instead of the button
On the express path, the customer skips the steps of the regular checkout, including the order review with its consents. In the off-canvas cart, on the cart page and on the login page, a notice therefore takes the place of the Stripe button. from 4.10.0
The customer then orders via the regular checkout. These six reasons trigger the notice:
| Reason | When | Why |
|---|---|---|
| Service | An item is marked as “Service product”, and under Settings → Checkout → General both “Right of withdrawal in the order process on/off” and “Exclusion from the right of revocation for digital goods and services” are switched on. | The order review obtains the consent that the service begins before the withdrawal period ends (Section 356(5) BGB). |
| Digital content | The same two switches, plus “Enable download of products” under Settings → Checkout → Download and an active download of the type “Purchase download” on the item with a description in the customer’s language. | The order review obtains the consent that the provision begins before the withdrawal period ends (Section 356(6) BGB). |
| B-stock goods | An item is marked as “Second-hand goods/defective copy (B-goods)”. Always applies. | The order review obtains the express confirmation for B-stock goods (Section 476 BGB). |
| Age limit | An item carries “FSK 18”. Always applies. | The express path has no age verification. |
| File upload | An item requires “Upload required (when purchasing)”, and the file is still missing at this cart position. | The file must be available before the order. |
| Download without an account | An item with a purchase download is in the cart, and the buyer is not signed in with a customer account. Applies regardless of “Enable download of products”. | Without a customer account, the buyer could not get to their file. The regular checkout therefore requires an account. |
- Reason no longer applies: Once the customer signs in with their customer account, “Download without an account” no longer applies. Once they upload the required file, “File upload” no longer applies. The button appears again as soon as no reason is left.
- Personalized goods: They do not trigger the notice.
- Check in the shop: The shop decides before it knows which wallets the device offers. The notice therefore also appears where the device would not offer a wallet at all.
- Cart changed later: If the cart only needs a check after the button has loaded, the shop rejects the payment before charging and shows the notice at the top of the cart page.
- Other express buttons: Amazon Pay and PayPal Checkout remain because they lead back to the order review.
No button and no notice
In these cases, the place of the Stripe button stays empty:
- Module: “Payment by Stripe” is off, no “Public key” is entered, or “Allow Stripe checkout (express purchase)” is off.
- Shipping and Payment: Stripe is not enabled for “FREE SHIPPING!” or not for the shipping method chosen in the cart (without a choice, the cheapest one).
- Payment method not allowed: Stripe is not allowed as a payment method for the customer group or the individual customer.
- Minimum order: The “Minimum order” under Settings → General → Minimum values is not reached.
- Stock: “Check the stock” under Settings → Checkout → Inventory is switched on, and an item is not available.
- Attributes: An attribute combination in the cart cannot be ordered.
- Amount: The cart total is 0.
- Device: Stripe offers none of the enabled payment methods on the device.
Legal text at the button
Because the customer does not see the order review on the express path, a short legal text with links appears below the Stripe button. from 4.10.0
With both switches on, it reads:
Which parts it names follows from two switches under Settings → Checkout → General. The sentence on the obligation to pay and the link to the privacy policy are always there.
| “GTC in the order process on/off” | “Right of withdrawal in the order process on/off” | The notice links to |
|---|---|---|
| on (default) | on (default) | terms and conditions, cancellation policy and privacy policy |
| on | off | terms and conditions and privacy policy |
| off | on | cancellation policy and privacy policy |
| off | off | only the privacy policy |
Where the links lead
- Terms and conditions: to the “Alternative Terms of Service PDF file” if it is in the
files/folder, otherwise to the CMS page of your terms, by default “General Terms and Conditions”. - Cancellation policy: to the “Alternative revocation PDF file”, otherwise to the CMS page “Right of revocation”.
- Privacy policy: always to the CMS page “Privacy”.
These are the same targets as in the order review, and all links open in a new tab. You set the two PDF files under Settings → General → Basic settings.
- Visibility: The legal text only appears once Stripe offers at least one payment method on the device. Where the notice about the required check replaces the button, the legal text is missing.
- Your own wording: Under Tools → xoLanguage, you can override the text with your own value (
TEXT_EXPRESS_CHECKOUT_LEGAL_HINTand the variants with_TERMS,_WITHDRAWALand_PRIVACY). The placeholders%1$s(terms),%2$s(cancellation policy) and%3$s(privacy policy) stand for the links and must be kept. Check the legal text below the button after every change: if a placeholder is missing, the matching link is missing, and swapped placeholders link to the wrong pages. Write a percent sign as%%; a single%can hide or garble the legal text.
Customer data from the wallet
If the customer is not signed in, the shop takes the email address and the delivery address from the wallet. Signed-in customers keep the email address and the billing address of their account; only the delivery address comes from the wallet.
Signed-in customers
They order in their customer account. The address from the wallet is added to their address book as the delivery address; the billing address of the account stays.
Not signed in
Express checkout never signs in to an existing customer account. A guest record is created, even if the email address belongs to an account. Customers who want to order in their account sign in before paying.
- Customer account instead of guest: If “Obligation to register during the ordering process” under Settings → Checkout → Customer details is set to
always_accountoralways_account_and_guest_checkbox, express checkout creates a customer account and sends the access data by email. This only applies if no customer account exists for the email address yet. - Telephone number: The wallet only asks for it if “Telephone number is required field” under Settings → Checkout → Customer details is set to
mandatory.
Shipping method and amount in the wallet
In the payment window, the customer chooses the delivery address and the shipping method. The shop calculates the amount itself.
- Shipping methods: When the customer chooses an address in the wallet, the shop calculates its shipping methods. If the customer is not signed in, it uses the postcode, city and country of this address; for signed-in customers, it uses the delivery address from the customer account. Only the shipping methods for which Stripe is enabled under “Shipping and Payment” are offered; the wallet shows the name and the price.
- Preselection: The shipping method from the cart is preselected, otherwise the first one in the order of your shipping modules.
- Amount: The shop calculates as it does for the booking, with shipping, surcharges, discounts, fees and taxes. It recalculates with every change of shipping method.
- No suitable shipping method: If there is no shipping method for the address or the total cannot be calculated, the wallet rejects the address. The message comes from the wallet, not from the shop.
Reconciliation after booking
After creating the order, the shop compares the amount collected with the order. If the payment does not cover the order, it gets the status from “Order Status (Paid Asynchronously)” or, without this setting, your default status instead of the status from “Order Status (Paid Immediately)”, plus an internal note.
If the amount differs by more than 1 cent or the order contains no items, the shop also sends you an email, see operator email. from 4.10.0
Pickup
- Choosing a branch: If “Location selection” in the module “Pick up” (Click & Collect) is set to
required, the wallet does not offer pickup until the customer has chosen a branch in the shop beforehand. from 4.10.0 - Payment methods of the branch: If a branch has its own payment methods without Stripe, pickup is not offered in the wallet either.
You set up shipping methods under Settings → Checkout → Shipping methods; see the guide Shipping & Delivery.
Unclear payment status: protection against paying twice
If the shop cannot confirm a wallet payment as paid right away, it does not create the order immediately and accepts no second Stripe payment in this session. from 4.10.0
The payment status is unclear in these cases:
- Stripe reports the payment as processing or only as authorized.
- The status cannot be checked right now, for example due to a network problem or a disruption at Stripe.
- The order completion fails after the money has already been collected.
- Money was collected for the payment without an order being created, for example after a redirect to PayPal or Amazon Pay or when the tab was closed.
What the customer sees
If the payment breaks off in the payment window, the customer lands on the cart page. One of these messages appears at the top:
| Situation | Message in the cart |
|---|---|
| Payment on its way | “We have received your payment, but it could not yet be matched to this order automatically. Please do not pay again – you would otherwise be charged a second time. Please get in touch with us and we will complete your order manually.” |
| Status cannot be checked | “We could not verify the status of your payment just now. As a precaution, please do not pay again and get in touch with us – we will check the transaction and complete your order.” |
| Not paid | “The payment could not be completed. Please select your payment method again.” |
| Order exists | “We have already received your order for this payment, so your shopping cart is now empty. Please do not pay again.” The shop empties the unchanged cart for this and shows the message once. |
After a redirect to PayPal or Amazon Pay, the customer does not return to the cart page. Signed-in customers see the matching message on the “Payment Information” page; guests land on the login page without a message. For them, the message appears as soon as they want to pay with Stripe again.
How the block works
- No second Stripe payment: The shop rejects a new express attempt before charging. The regular checkout with Stripe leads back to the cart with the message instead of to the payment page of Stripe.
- Checked payment: If an express payment is paid and checked but not yet booked, a new attempt leads directly to the order completion instead of a second payment.
- End of the block: The block ends when Stripe reports the payment as not paid, when an order exists for the payment, or after 24 hours at the latest.
- Scope: The block applies to Stripe in the customer’s session. It does not block other payment methods or other devices.
Restored orders
If the customer does not return to the shop after a successful payment, the shop creates the order by itself. For this, it needs the Stripe webhook.
- Message: Stripe reports a successful payment for which the shop has no order. The shop stores the message.
- Waiting time: The order is created no earlier than after the time set in “Order restoration - delay (minutes)”. The default is 30 minutes; 5 to 180 are allowed. The waiting time prevents a duplicate order if the customer returns right away.
- Trigger: The shop processes stored messages when the next webhook from Stripe arrives. In quiet periods, this can therefore take considerably longer than the waiting time you set.
- Order: The basis is the cart snapshot. When the customer pays, the shop stores the content and totals of the cart in it.
A later payment confirmation from Stripe only sets a Stripe order to the status from “Order Status (Paid Immediately)” if Stripe confirms the charge and the amount covers the booked total. An underpaid order keeps its status.
What you see in the order
- Internal note: Every restored order carries a note in its history that the customer does not see. It begins with “Diese Bestellung wurde automatisch vom XONIC Shopsystem restauriert” (displayed in German) and asks you to check the order for accuracy and duplicates before you send the customer an order confirmation.
- No order confirmation: The restoration does not send the customer an order confirmation, so they have not received anything from the shop yet. After your check, send it promptly yourself.
What you do
- Compare: For orders with a note, compare the amount, items, refund and dispute with the payment in the Stripe Dashboard.
- Check for duplicates: If a regular order already exists for the same cart, check in the Stripe Dashboard whether two payments have arrived. Only then is the restored one a duplicate. Set it to a cancellation status; with “Automatic chargeback” switched on in the Stripe module, the shop refunds its payment.
- Complete: Add missing items in the order editor, see Process orders.
- Finish: Only then set the status and send the order confirmation: in the order editor, switch on “New order confirmation?” and click “Update”.
Switch-over to the Express Checkout Element
From XONIC 4.10.0, Stripe express checkout always uses the Express Checkout Element from Stripe. The setting “Express Checkout Implementation” is dropped.
- What is dropped: The setting chose between
legacy, the older Payment Request Button from Stripe, andnew, the Express Checkout Element. - What the update does: It sets the setting to
newby itself, also where individual domains in a multishop have their own value. You do not need to change anything in the setting itself. - Shops with
legacy: They show the Express Checkout Element after the update, as do older installations without this setting. Depending on the selection in the Stripe module, Link, PayPal and Amazon Pay appear in addition to Apple Pay and Google Pay. - PayPal and Amazon Pay: If your shop ran with
legacyand the table “methods of payment” has a row with “PayPal”, “AmazonPay” or “All payment methods”, for example for the payment page of Stripe, these payment methods appear in the express button for the first time after the update. There is no separate selection just for the express button. Test these payment methods after the update, see Pitfalls. - Custom templates: They need no adjustment.
The settings at a glance
You find the switches of the module “Stripe” under Settings → Checkout → Payment methods, the others in the places named.
- Payment by Stripe
MODULE_PAYMENT_STRIPE_STATUS - Switches on the module. Without the module, there is no express button.
- Public key
MODULE_PAYMENT_STRIPE_PUBLIC_KEY - From your Stripe account. Without it, no button appears.
- secret key
MODULE_PAYMENT_STRIPE_SECRET_KEY - From your Stripe account. The shop uses it to create the webhook endpoint when you save.
- Table “methods of payment”
MODULE_PAYMENT_STRIPE_PAYMENTS - Defines the Stripe payment methods in the regular checkout and in the express button, see Setup. Default: “Credit cards, ApplePay, GooglePay”.
- Allow Stripe checkout (express purchase)
MODULE_PAYMENT_STRIPE_EXPRESS_CHECKOUT - Express button in the off-canvas cart, in the cart and on the login page. Default: on.
- Webhook Secret
MODULE_PAYMENT_STRIPE_WEBHOOK_SECRET - The shop uses it to verify the signature of the messages from Stripe. When it creates the webhook endpoint anew, it enters the secret by itself.
- Order restoration - delay (minutes)
MODULE_PAYMENT_STRIPE_RESTORE_DELAY_MINUTES - Waiting time until the restoration. Default 30, allowed 5 to 180.
- Order Status (Paid Immediately)
MODULE_PAYMENT_STRIPE_ORDER_STATUS_ID - Status of confirmed payments. Default: “Receipt of payment”.
- Order Status (Paid Asynchronously)
MODULE_PAYMENT_STRIPE_ORDER_STATUS_ID_ASYNC - Status while a payment does not count as paid. Without a value, your default status applies. A status of your own makes these orders easy to find, see Restoration.
- Automatic chargeback
MODULE_PAYMENT_STRIPE_AUTO_REFUND - Refunds the payment of a Stripe order as soon as you set it to a cancellation status. Default: on.
- Telephone number is required field
REQUIRED_FIELD_TELEPHONE - Under Settings → Checkout → Customer details. Only with
mandatorydoes the wallet ask for the telephone number. - Obligation to register during the ordering process
ACCOUNT_MODE - Under Settings → Checkout → Customer details. With
always_accountoralways_account_and_guest_checkbox, express checkout creates a customer account. - GTC in the order process on/off
DISPLAY_CONDITIONS_ON_CHECKOUT - Under Settings → Checkout → General. Controls the terms part of the legal text. Default: on.
- Right of withdrawal in the order process on/off
DISPLAY_WITHDRAWAL_ON_CHECKOUT - Under Settings → Checkout → General. Controls the withdrawal part of the legal text and counts for the notice on services and downloads. Default: on.
- Exclusion from the right of revocation for digital goods and services
CONFIRM_VIRTUAL_WITHDRAWAL - Under Settings → Checkout → General. Counts for the notice on services and downloads. Default: on.
- Enable download of products
DOWNLOAD_ENABLED - Under Settings → Checkout → Download. Counts for the notice on downloads. Default: off.
- Infomail Supporttickets
SUPPORT_EMAILS_TO - Under Settings → General → Tickets & Tasks. Recipients of the operator email when the booking differs. from 4.10.0
- Location selection
MODULE_SHIPPING_PICKUP_LOCATION_SELECTION - Under Settings → Checkout → Shipping methods in the module “Pick up”. With
required, the wallet only offers pickup once the customer has chosen a branch. from 4.10.0
Pitfalls
What to watch out for
- No button despite an active module: Stripe is not enabled under “Shipping and Payment” for “FREE SHIPPING!” or for the shipping method chosen in the cart. A typical case is “Pick up”: by default, only “Cash Payment” is enabled for it.
- Apple Pay is missing: The domain is not registered with Stripe, or the browser and device do not support Apple Pay.
- Notice for an ordinary cart: An item is marked as a service, as B-stock goods or with “FSK 18” by mistake, or it carries a purchase download or a required upload.
- Shipping method missing in the wallet: Stripe is not enabled for this shipping method under “Shipping and Payment”.
- Order appears late or not at all: The restoration only runs with the next webhook after the waiting time. Check the webhook in the health check.
- Test keys in the live shop: The Stripe module has only one pair of keys. As long as the test keys are entered, real customers cannot pay with Stripe, and when you save, the shop takes over the “Webhook Secret” of test mode. After switching back to the live keys, it therefore rejects all messages from Stripe without the health check reporting it. Remedy: clear “Webhook Secret”, save and choose “Re-create endpoint + capture secret” in the health check.
- No operator email: There is no valid address under “Infomail Supporttickets”.
- Second payment without an order: If the restoration finds a Stripe order of the same customer for the same amount shortly before or after the payment, it does not create a second one. If the customer really paid twice, the second payment has no order. So reconcile your Stripe payments with the orders regularly.
- PayPal and Amazon Pay via Stripe: Both redirect to the provider. The order is then probably only created through the restoration, that is after the waiting time. After the return, signed-in customers see the message “We have received your payment …”, and guests land on the login page. Check the process with a test payment before you select these payment methods in the Stripe module or, if they are already selected, right after the update.
- Klarna in the express button: If Klarna is active in your Stripe account, Stripe can show it in the express button, even if the table “methods of payment” does not list Klarna.
Checklist: set up and test express checkout
- Check the version – under Tools → xoUpdate, top right after “Shop:”. The notice instead of the button, the legal text and the lock for an unclear payment status are available from XONIC 4.10.0.
- Set up the module – “Payment by Stripe”, both keys, payment methods and “Allow Stripe checkout (express purchase)”.
- Enable shipping methods – in the “Shipping and Payment” tab, including “FREE SHIPPING!”, without shipping methods whose costs are determined after the order.
- Register the domain – in the Stripe Dashboard, also with www.
- Check the webhook – the health check reports nothing about Stripe. However, it does not detect a wrong “Webhook Secret”.
- Enter the info email – a valid address under “Infomail Supporttickets”.
- Test purchase – with the test keys from Stripe only in a test installation, never in the live shop, see Pitfalls. In the live shop, test with a real payment that you refund afterwards. The amount in the wallet equals the order total, also after changing the shipping method, and the order has the status from “Order Status (Paid Immediately)”, by default “Receipt of payment”.
- Test the notice – a cart with an item marked as B-stock goods shows the notice instead of the button; then delete the test data.
Frequently asked questions
Why does the cart show a notice instead of the express button?
Why does no express button appear at all?
Which shipping methods does the wallet offer?
What happens if the customer pays but does not return to the shop?
Why does an express order not count as paid?
Why was the order created as a guest although the customer has an account?
Can a customer accidentally pay twice?
Do I need to change anything after the update?
legacy and “PayPal”, “AmazonPay” or “All payment methods” is selected in the Stripe module, these payment methods then appear in the express button for the first time. Test them after the update and take a look at the express button in the cart once.Is the legal text at the button legally sufficient?
Further guides
We set up express checkout with you
We support you with the Stripe module, shipping methods, domain registration and checking restored orders.
Contact support now