# Express Checkout

> Express Checkout puts a payment provider's own checkout buttons, such as PayPal, on your product or basket page. The customer signs in with the provider, approv

Express Checkout puts a payment provider's own checkout buttons, such as PayPal, on your product or basket page. The customer signs in with the provider, approves a payment or a payment method, and can pick a shipping address the provider holds for them, without filling in your forms. It is meant for guest customers: a customer who is already logged in to your platform is better served by [Checkout](/platforms/embedded-payments/checkout/).

Express Checkout is delivered by [shuttle.js](/platforms/embedded-payments/shuttlejs/) 1.3 or later. The script and the API call it `authenticate` (`Shuttle.authenticate`, and the `AUTHENTICATE` features on a gateway), and older pages call it Authenticate.

## How it works

1. You load shuttle.js with your shared key and the merchant's instance key in the URL. Shuttle builds that script for the merchant, with the express checkout code of each connected payment provider that supports it.
2. You tell shuttle.js which element to use. It renders each supporting provider's buttons there, one under another. If none of the merchant's providers supports Express Checkout, nothing is rendered.
3. The customer completes the provider's flow, and shuttle.js calls your `on_success` function with the customer's details, the shipping address if you asked for one, and a `gateway_data` object.
4. Your server passes `gateway_data` to the [Payments API](/platforms/reference/operations/createpayment/) or the [Payment Methods API](/platforms/reference/operations/createpaymentmethod/). Until it does, no money moves and nothing is created in Shuttle.

## Which payment providers support it

| Payment provider | What the customer sees | Notes |
| --- | --- | --- |
| [PayPal Commerce](/payment-providers/paypal-commerce/) | PayPal buttons, with Venmo and Pay Later where PayPal offers them and the merchant has not turned them off | Returns the customer's details, a shipping address and a payment token. Saving a payment method (`TOKENISE`) needs **Enable Reference Transactions (required to save card)** on the merchant's PayPal connection: without it, PayPal shows no buttons for `TOKENISE`. |
| [Sandbox](/payment-providers/sandbox/) | A **3rd Party Express Checkout** button that opens a simulated provider window | For testing your integration without a live provider. |

## Three ways to use it

| You want to | `action` | Then your server calls |
| --- | --- | --- |
| Take a payment for a basket whose total you already know | `AUTHORISE` | [Create a payment](/platforms/reference/operations/createpayment/), for the amount the customer approved |
| Collect a payment method now, and charge it once you know the final total (after adding shipping or tax, for example) | `TOKENISE` | [Create a payment](/platforms/reference/operations/createpayment/), for the final amount |
| Save a payment method for later, with no payment now | `TOKENISE` | [Create a payment method](/platforms/reference/operations/createpaymentmethod/) |

In all three, set `payment_token` to `true` so that `on_success` returns the `gateway_data` you pay with.

With `AUTHORISE`, create the payment for the same amount and currency the customer approved. PayPal refuses a payment for a different amount, so if the total can still change, use `TOKENISE`.

## Integrating

Load shuttle.js with your keys, add an element and your options, handle the callbacks, then create the payment on your server. Each step is set out in the [Express Checkout integration guide](/platforms/embedded-payments/express-checkout-integration-guide/), and every option and callback field in [Express Checkout options](/platforms/embedded-payments/express-checkout-options/).

## Reference

* [Express Checkout integration guide](/platforms/embedded-payments/express-checkout-integration-guide/)
* [Express Checkout options](/platforms/embedded-payments/express-checkout-options/)
* [Create a payment](/platforms/reference/operations/createpayment/)
* [Create a payment method](/platforms/reference/operations/createpaymentmethod/)
* [shuttle.js versions](/platforms/embedded-payments/shuttlejs/)