Understand payment outcomes
After a payment attempt, your platform should inspect the Payment object to determine the result.
This is especially important when using hosted checkout, where the payment flow is managed by Paypercut.
Why payments fail
If a payment fails, you can determine the reason by inspecting the Payment object.
Paypercut always provides structured information explaining the failure.
To understand why a payment failed, inspect:
failure_codefor the programmatic reasonfailure_messagefor customer-facing messagingoutcomefor detailed processing and network-level information
Key fields
The outcome of a payment is described by the following fields:
statusoutcomefailure_codefailure_message
Where to look
Retrieve the payment:
GET /v2/payments/{id}
Payment status
The status field describes the high-level state.
Typical values include:
succeededfailedrequires_actionprocessing
Use this field for high-level flow control.
Outcome object
The outcome field provides structured information about the result of the payment.
It includes:
- processing result classification
- network-level response
- additional diagnostic context
Use the outcome object for programmatic handling, analytics, and diagnostics.
outcome.type
Indicates the high-level result of the payment attempt.
Typical values include:
authorizedissuer_declinedblockedprocessing_error
Use this field as the primary classification of the outcome.
outcome.network_status
Describes the result returned by the card network.
Example values:
approveddeclinedunavailable
Use this field for diagnostics and reconciliation.
outcome.network_decline_code
The raw response code returned by the card network.
Example:
{
"outcome": {
"network_decline_code": "51"
}
}
Use this field for detailed diagnostics.
See:
outcome.seller_message
A message intended for the platform or merchant.
This message may include more detailed context than the customer-facing message.
Do not display seller messages to end users.
authorization_code
The authorization code returned by the issuer for approved transactions.
Use this value for:
- reconciliation
- dispute handling
- communication with acquirers or issuers
Failure code
The failure_code is a short, stable identifier describing why the payment failed.
Example:
{
"failure_code": "card_declined"
}
Use this field to implement conditional logic in your integration.
Failure message
The failure_message is a human-readable description of the failure.
Example:
{
"failure_message": "Your card has insufficient funds. Please try another card."
}
This message is safe to display to the end user.
Practical examples
Successful payment
{
"status": "succeeded",
"outcome": {
"type": "authorized",
"network_status": "approved"
}
}
Recommended handling:
- Fulfill the order
- Store authorization details for reconciliation
Soft decline
{
"status": "failed",
"failure_code": "card_declined",
"failure_message": "Your card was declined. Please try again later.",
"outcome": {
"type": "issuer_declined",
"network_decline_code": "05"
}
}
Recommended handling:
- Allow retry
- Offer alternative payment method
Hard decline
{
"status": "failed",
"failure_code": "insufficient_funds",
"failure_message": "Your card has insufficient funds.",
"outcome": {
"type": "issuer_declined",
"network_decline_code": "51"
}
}
Recommended handling:
- Do not retry automatically
- Ask for another payment method
Requires action
{
"status": "requires_action"
}
- The customer must complete an additional step (for example, authentication)
- Redirect or resume the payment flow
Mapping to declines
When a payment fails due to issuer or network conditions:
failure_codemaps to a normalized decline reasonoutcomecontains additional detailsfailure_messageis safe for display
See:
Customer vs merchant messaging
Use different fields depending on the audience:
Customer
failure_message
Merchant / platform
failure_codeoutcomeoutcome.seller_message- network-level details
Do not expose raw network codes or internal messages directly to end users.
Best practices
- Always fetch the Payment object after checkout
- Use
statusfor high-level flow control - Use
failure_codefor logic - Use
failure_messagefor UI - Use
outcomefor deeper diagnostics - Log network-level data for support and reconciliation

