If you have an Express Checkout integration, PayPal recommends upgrading to PayPal Checkout using the JavaScript SDK. The JavaScript SDK has the following benefits:
Visit the Eligibility Page to learn more about the countries, currencies, and card brands that PayPal Checkout supports.

If your current integration is Express Checkout, you must upgrade to PayPal Checkout. You can use your site’s branding with PayPal Checkout, allowing customers to pay with PayPal, Pay Later options, Venmo, and alternative payment methods.
Locate the endpoint URLs in your code that manage starting, reviewing, and completing paymetns. Check the API requests for the following METHOD parameter values:
SetExpressCheckout, GetExpressCheckoutDetails, CreateRecurringPaymentsProfile, DoExpressCheckoutPayment, DoReferenceTransaction
Review the core API calls from your current integration and make a list of the parameters, such as L_BILLINGTYPE.
Map these parameters to the new API using our parameter mapping tool in our PayPal API Transformer.
If you don't already have one, sign up for a PayPal developer account.
Follow this onboarding document to get a client ID and secret, access token, and your sandbox account credentials.
Follow this account configuration document to set up your sandbox account and test purchases before going live in your live account.
Set up your front end to use PayPal subscription buttons. The JavaScript SDK handles displaying the subscription button and managing the customer consent flow.
Add the PayPal JavaScript SDK to your web page with the vault parameter to enable subscription functionality:
12345678910
Replace YOUR_CLIENT_ID with your actual client ID from the PayPal Developer Dashboard.
Note: For production, ensure you're using your live client ID, not your sandbox client ID.
Add a container element where the PayPal subscription button will render:
12345678910
12345678910
This replaces the legacy Express Checkout flow where customers were redirected to PayPal's site. The SDK keeps customers on your site with a seamless popup experience.
If you have an Express Checkout integration, you must set up server-side processing. You'll need to generate a client token, upgrade your NVP/SOAP API integraiton to the Payments v1 API, and set up a listener to handle API responses.
The Subscriptions API requires three core components:
Before creating billing plans, you must first create a product in the catalog. A product represents the actual goods or services being offered.
API Endpoint: POST /v1/catalogs/products
12345678910
12345678910
Save the returned id (Product ID) for use when creating billing plans.
A billing plan defines the subscription pricing, billing frequency, and payment schedule. This is the "blueprint" that replaces your legacy CreateRecurringPaymentsProfile logic.
API Endpoint: POST /v1/billing/plans
12345678910
12345678910
Key billing cycle configurations:
Payment failure handling:
The payment_failure_threshold defines how many consecutive payment failures trigger automatic suspension. PayPal automatically attempts payment recovery for failed payments.
Save the returned id (Plan ID) for use when creating subscriptions.
After a customer approves the subscription through the JavaScript SDK, your server receives the subscription ID. Use this to verify and activate the subscription.
API Endpoint: GET /v1/billing/subscriptions/{subscription_id}
12345678910
12345678910
Store the subscription ID in your database associated with the customer account.
The following table shows how Express Checkout recurring payment calls map to the Subscriptions API:
| NVP/SOAP API | Payments v1 REST API |
METHOD=SetExpressCheckout (with L_BILLINGTYPE) |
POST /v1/billing/plans |
METHOD=CreateRecurringPaymentsProfile |
POST /v1/billing/subscriptions |
METHOD=CreateBillingAgreement |
JavaScript SDK subscription flow |
METHOD=DoReferenceTransactiont |
Automated by PayPal based on plan |
METHOD=DoReferenceTransaction (variable amounts) |
POST /v1/billing/subscriptions/{id}/revise |
| Manual charge for outstanding | POST /v1/billing/subscriptions/{id}/capture |
| Profile status management | POST /v1/billing/subscriptions/{id}/suspendPOST /v1/billing/subscriptions/{id}/activatePOST /v1/billing/subscriptions/{id}/cancel |
To help you construct the request body to support the Payments v1 format, copy and paste your NVP/SOAP reqeuset body into our API Transformer tool.
THe NVP/SOAP integration uses the DoExpressCheckoutAPI to process both order updates and capture order requests. When you need to change the order details, such as the address or amount, after your original SetExpressCheckout call, you can make a single DoExpressCheckout call to simultaneously change the order details and capture the payment.
To change the order details between request and capture using PayPal Checkout, you need to make 2 calls to the Payments v1 API: an Update order PATCH request to update the order, and a Capture payment for order request to finalize the checkout flow.
Create a handleResponse function to set up a listener that returns an HTTP status code from the API response.
handleResponse function to make a POST call to the /api/payments endpoint and return an HTTP status code response.errorMessage object to show an error message when handleResponse returns an error code.For more information about Payments V1 error scenarios, see Payments v1 Error Messages page.
This example shows a handleResponse() function:
12345678910
Replace IPN(Instant Payment Notification) to webhooks for asynchronous event processing.
/webhook) to receive events.
PAYMENT.CAPTURE.COMPLETED).
PAYMENT.CAPTURE.COMPLETED).
See the Payments v1 API reference to configure the details of your integration.
Before going live, test your integration in the sandbox environment. Learn more about card testing, simulating successful payments using test card numbers and generating card error scenarios using rejection triggers.
Note: Use the credit card generator to generate test credit cards for sandbox testing.
Follow this checklist to take your application live:
See Move your app to production for more details