On this page
No Headings
Last updated: June 26, 2026
Alternative payment methods (APMs) allow you to accept payments from customers worldwide who use their bank accounts, wallets, and local payment methods. When a buyer pays in a currency other than yours, PayPal handles currency conversion for you and presents conversion information to the buyer during checkout.
While displaying and accepting APMs is included with the checkout integration, we recommend subscribing to the CHECKOUT.ORDER.APPROVED webhook event in case a customer accidentally closes the browser and exits the checkout process after approving the transaction through their APM but before finalizing the transaction on your site.
Note: Inform your payers that PayPal is processing the payment by implementing one of the following options:
disable-funding parameter in the JavaScript SDK call disable APMs.PayPal uses the following REST API credentials, which you can get from the developer dashboard:
You can use Postman to explore and test PayPal APIs. Learn more in our Postman guide.
APMs show up automatically and differ by country or region. The flow for completing a payment through an APM is as follows:
While the checkout integration includes APMs by default, they display only when the buyer is eligible for one of the methods and when the following default integration values are maintained:
| Parameter | Value | Description |
|---|---|---|
style.layout | vertical | Default. Buttons are stacked vertically with a maximum of four buttons. Recommended when:
|
intent | capture | The money is captured immediately while the buyer is on your site. |
commit | true | Show a Pay Now button in the Checkout flow. The final amount will not change after the buyer returns from PayPal to your site. |
vault | false | Show all funding sources. |
Because these are default values, you don't have to specify them in the JavaScript SDK call, but make sure you don't explicitly change any of them by passing a non-default value for the parameter.
Note: APMs don't work with all payment configurations because some configurations change these default values. Payment configurations that don't work with APMs because they change these default values include: authorize and capture later, subscriptions, vaulting, and shipping changes callback scenarios.
To subscribe to the CHECKOUT.ORDER.APPROVED event, copy the following code and modify it.
Tip: For a no-code option, subscribe to the Checkout order approved webhook event in your sandbox REST API app in the Developer Dashboard. Open then app you're using for development, scroll to the webhooks section, and click Add Webhook.
API endpoint used: Create webhook
curl -v -X POST https://api-m.sandbox.paypal.com/v1/notifications/webhooks \
-H "Content-Type: application/json" \
-H "Authorization: Bearer <Access-Token>" \
-H 'PayPal-Partner-Attribution-Id: <BN-Code>' \
-d '{
"url": "https://example.com/example_webhook",
"event_types": [
{
"name": "CHECKOUT.ORDER.APPROVED"
}
]
}'After you copy the code in the sample request, modify the following:
Access-Token - Your access token.BN-Code - Change to your PayPal Partner Attribution ID.url - The URL of your webhook handler that listens for webhooks you're subscribed to.A successful request results in the following:
201 Created.{
"id": "2CJ781045X895601X",
"url": "https://example.com/example_webhook",
"event_types": [{
"name": "CHECKOUT.ORDER.APPROVED",
"description": "An order has been approved by buyer."
}],
"links": [{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks/2CJ781045X895601X",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks/2CJ781045X895601X",
"rel": "update",
"method": "PATCH"
},
{
"href": "https://api-m.sandbox.paypal.com/v1/notifications/webhooks/2CJ781045X895601X",
"rel": "delete",
"method": "DELETE"
}
]
}A webhook handler is a script you create on your server that completes specific actions on webhooks that hit your listener URL. Each handler script implementation is different, but for this task, ensure you have logic in your handler script that verifies each CHECKOUT.ORDER.APPROVED event has a completed transaction in your database. An incomplete transaction might signal a dropped cart, and you'll have to capture the payment to finalize the transaction.
The following resources might be useful as you create webhook handler code:
If there are incomplete transactions that indicate a customer completed authorization with their APM but closed the window before finalizing the transaction on your site, you can capture the payments for those transactions.
To capture the payment for an authorized but incomplete transaction, copy the following code and modify it.
API endpoint used: Capture payment for order
curl -v -X POST https://api-m.sandbox.paypal.com/v2/checkout/orders/2BE65243S8119680R/capture \
-H "Content-Type: application/json" \
-H "Authorization: Bearer Access-Token" \
-H 'PayPal-Partner-Attribution-Id: <BN-Code>' \
-H "PayPal-Request-Id: 123e4567-e89b-12d3-a456-426655440040" \After you copy the code in the sample request, modify the following:
Access-Token - Your access token.CHECKOUT.ORDER.APPROVED webhook event.BN-Code - Change to your PayPal Partner Attribution ID.PayPal-Request-Id - Replace the sample ID with a unique ID you generate. This ID helps prevent duplicate captures if the API call is disrupted. See also: API Idempotency.A successful request results in the following:
201 Created.{
"id": "2BE65243S8119680R",
"purchase_units": [{
"reference_id": "default",
"shipping": {
"name": {
"full_name": "John Doe"
},
"address": {
"address_line_1": "Badensche Straße 24",
"admin_area_2": "Berlin-Wilmersdorf",
"postal_code": "10715",
"country_code": "DE"
}
},
"payments": {
"captures": [{
"id": "9XR60255JN8591232",
"status": "PENDING",
"status_details": {
"reason": "RECEIVING_PREFERENCE_MANDATES_MANUAL_ACTION"
},
"amount": {
"currency_code": "EUR",
"value": "15.00"
},
"final_capture": true,
"seller_protection": {
"status": "ELIGIBLE",
"dispute_categories": [
"ITEM_NOT_RECEIVED",
"UNAUTHORIZED_TRANSACTION"
]
},
"links": [{
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/9XR60255JN8591232",
"rel": "self",
"method": "GET"
},
{
"href": "https://api-m.sandbox.paypal.com/v2/payments/captures/9XR60255JN8591232/refund",
"rel": "refund",
"method": "POST"
},
{
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/2BE65243S8119680R",
"rel": "up",
"method": "GET"
}
],
"create_time": "2020-02-26T22:52:00Z",
"update_time": "2020-02-26T22:52:00Z"
}]
}
}],
"payer": {
"name": {
"given_name": "John",
"surname": "Doe"
},
"email_address": "buyer@example.com",
"payer_id": "PPFAH5AWAX7RS",
"address": {
"country_code": "DE"
}
},
"links": [{
"href": "https://api-m.sandbox.paypal.com/v2/checkout/orders/2BE65243S8119680R",
"rel": "self",
"method": "GET"
}],
"status": "COMPLETED"
}APMs show up automatically and differ by country based on locale and country settings. You can force APMs to show to test an APM transaction.
currency - Supported currency codeslocale - Supported locale codesbuyer-country - Supported country codes<script
src="https://www.paypal.com/sdk/js?client-id=YOUR_CLIENT_ID¤cy=EUR&locale=de_DE&buyer-country=DE">
// Required. Replace YOUR_CLIENT_ID with your sandbox client ID.
</script>Important: giropay will be sunset on June 30, 2024. PayPal will not support giropay payments starting July 1, 2024. Offer your users PayPal wallet and other alternative payment methods.
Click the pre-fill information button at the top of the checkout screen to enter test user information. In the following example, you'd select: Pre-fill button.
Enter a test email address. You can use the email address for your personal sandbox account.
Click through the flow to complete the transaction. The simulation server displays options for testing successful and failed authorizations.
Confirm the money shows up in the merchant account.
CHECKOUT.ORDER.APPROVED event fires as you expect in any of the following ways:CHECKOUT.ORDER.APPROVED webhook.