On this page
No Headings
Last updated: June 10, 2026
Detect and respond to payment failures using PayPal's Orders v2 API and Subscriptions API. This guide explains common failure reasons, how to surface errors to buyers, best practices for retrying or recovering failed payments, and how to leverage PayPal's intelligent retry mechanism.
Here are some of the most frequent failure reasons and how to handle them:
| Error Code / Issue | What It Means | What To Do |
|---|---|---|
INSTRUMENT_DECLINED | Payment method was declined. | Prompt the buyer to select a different payment method. Restart the payment flow using actions.restart(). |
CARD_EXPIRED | Card is expired. | Inform the buyer and ask for a new card. |
AMOUNT_MISMATCH, ITEM_TOTAL_MISMATCH | Totals do not add up. | Fix item or amount totals in your API request and retry. |
CURRENCY_NOT_SUPPORTED | Unsupported currency. | Use a supported currency or update your PayPal account settings. |
ORDER_NOT_APPROVED | Buyer did not approve the order. | Redirect the buyer to approve the order again. |
MAX_NUMBER_OF_PAYMENT_ATTEMPTS_EXCEEDED | Too many failed attempts. | Ask the buyer to use a different payment method or contact PayPal support. |
REDIRECT_PAYER_FOR_ALTERNATE_FUNDING | Funding source failed, alternate source needed. | Prompt the buyer to choose a different payment method. |
VALIDATION_ERROR, UNPROCESSABLE_ENTITY | Invalid or missing data. | Show a clear error, ask the buyer to correct the information, and retry. |
PAYMENT_DENIED | The payment was denied by PayPal. | Investigate the reason for denial and contact PayPal support if needed. Prompt the buyer to use a different payment method. |
PAYER_CANNOT_PAY | The payer is unable to pay using the selected payment method. | Prompt the buyer to select a different payment method or contact PayPal support. |
CANNOT_BILL_PAST_DUE_BALANCE | The subscription is suspended because the past due balance exceeds the maximum allowed. | Contact PayPal support to resolve the suspension or prompt the buyer to pay the outstanding balance. |
REJECTED_DUE_TO_RISK_REVERSAL | The payment was rejected due to a risk reversal, such as a chargeback or dispute. | Investigate the reason for the reversal and contact PayPal support if needed. |
TRANSACTION_REFUSED | The transaction was refused by the processor. | Prompt the buyer to use a different payment method or contact their bank. |
INVALID_ACCOUNT_STATUS | The payer's account is in an invalid state, such as locked or inactive. | Prompt the buyer to contact PayPal support to resolve their account issue. |
INVALID_REQUEST | The request was malformed or missing required parameters. | Review the request parameters and ensure they are valid. |
AUTHENTICATION_FAILURE | Authentication failed due to invalid credentials. | Verify your API credentials and ensure they are correct. |
NOT_AUTHORIZED | You are not authorized to perform this action. | Check your account permissions and ensure you have the necessary privileges. |
RESOURCE_NOT_FOUND | The requested resource was not found. | Verify the resource ID and ensure it exists. |
UNPROCESSABLE_ENTITY | The request was well-formed but could not be processed due to semantic errors. | Review the request data and ensure it is valid and consistent. |
See the Orders v2 API Troubleshooting Guide and the Subscriptions API documentation for a more comprehensive list of error codes.
Example: Handling a Declined Payment in JavaScript (Orders API)
paypal
.Buttons({
onApprove: (data, actions) => {
return actions.order
.capture()
.then((details) => {
// Payment successful
})
.catch((err) => {
// Handle payment failure
if (err.name === "INSTRUMENT_DECLINED") {
// Restart the payment flow to let buyer choose another method
return actions.restart();
} else {
// Show a generic error message
alert("Payment could not be completed. Please try again.");
}
});
},
})
.render("#paypal-button-container");actions.restart() restarts the payment flow so the buyer can select a different funding source.PayPal's intelligent retry mechanism automatically attempts to recover failed subscription payments.
Orders API
PAYMENT.CAPTURE.COMPLETED: Indicates a successful payment capture.PAYMENT.CAPTURE.DENIED: Indicates a failed payment capture.Subscriptions API
BILLING.SUBSCRIPTION.PAYMENT.FAILED: Indicates a failed subscription payment.BILLING.SUBSCRIPTION.PAYMENT.SUCCEEDED: Indicates a successful subscription payment.Configure your webhook listener to receive these events and take appropriate action (e.g., notify the buyer, update your database).
In addition to intelligent retries, you can also manually retry failed subscription payments.
actions.restart() in the Smart Buttons integration (for Orders API).With these steps, you can handle payment failures smoothly, helping buyers complete their purchase, ensuring smooth subscription renewals, and reducing lost sales.