Debugging Payment Failures

When a payment attempt fails, the payment page remains UNPAID — it doesn't close. The customer can retry. This guide explains how to see what went wrong and what to do about it.

Step 1 — Enable PAYMENT_ATTEMPT_FAILED webhooks

By default, PAYMENT_ATTEMPT_FAILED is not sent. Without it, your server has no visibility into why attempts are failing.

Contact [email protected] to enable it for your account. Once enabled, every declined attempt sends a webhook with an errorCode field.

See Webhook Event Reference for the full payload shape.

Step 2 — Read the errorCode

The errorCode in the PAYMENT_ATTEMPT_FAILED payload is the merchantResultCode — the machine-readable decline reason. Use it to triage.

Issuer declines

The customer's bank rejected the transaction.

errorCodeMeaningAction
ISSUER_DECLINEGeneric bank declineAsk customer to try another card or contact their bank
INSUFFICIENT_FUNDSCard balance too lowAsk customer to use another card
EXPIRED_CARDCard past expiry dateAsk customer to update card details
INCORRECT_CARD_DETAILSWrong card number, expiry, or CVVAsk customer to re-enter details
INVALID_CARDCard number fails validationAsk customer to try another card
ISSUER_DECLINE_FRAUDIssuer flagged as suspected fraudCustomer must contact their bank
ISSUER_DECLINE_LIMITIssuer transaction limit exceededCustomer must contact their bank
ISSUER_DECLINE_RESTRICTED_CARDCard restricted by issuerCustomer must contact their bank
ISSUER_DECLINE_TRANSACTION_NOT_PERMITTEDTransaction type not permitted on this cardAsk customer to try another card
FAILED_3DS3D Secure authentication failedAsk customer to retry; if persistent, contact support

Retryability

errorCodeCan retry?
GENERIC_DECLINE_RETRYYes — ask customer to try again or use another card
GENERIC_DECLINE_ONLYNo — do not retry; ask customer to use a different card

Risk / fraud (Breeze-side)

These are declined by Breeze's risk engine, not the issuer. They indicate the transaction was blocked before it reached the bank.

errorCodeMeaning
RISK_DECLINEGeneral risk block
RISK_SOFTSoft risk flag — page may still succeed on retry
RISK_HARDHard block — payment will not succeed
RISK_HARD_RECEIVED_CHBCustomer has prior chargeback history
RISK_HARD_RECEIVED_FRAUDCustomer has prior fraud history
RISK_NAME_MISMATCHName on card doesn't match customer name
RISK_SHARED_CARDCard used across multiple accounts
RISK_ONGOING_CHECKRisk review in progress

For RISK_HARD declines, the payment will not succeed regardless of retries. Contact [email protected] if you believe a block is incorrect.

Location / compliance

These fire when the payment originates from a geography Breeze doesn't support for your account.

errorCodeMeaning
GEOLOCATION_COUNTRY_NOT_SUPPORTEDCustomer's detected location is not supported
GEOLOCATION_STATE_NOT_SUPPORTEDCustomer's detected state is not supported
RESTRICTED_LOCATIONLocation is on a restricted list
CARD_COUNTRY_NOT_SUPPORTEDCard issued in an unsupported country
BILLING_COUNTRY_NOT_SUPPORTEDBilling address country not supported
COMPLIANCE_REASONSBlocked for regulatory compliance reasons

If you're seeing location errors unexpectedly, contact support to verify your account's geographic configuration.

Card type

errorCodeMeaning
CARD_NOT_SUPPORTEDCard network not accepted
CARD_TYPE_NOT_SUPPORTEDCard type (e.g. prepaid) not accepted
RISK_CARD_TYPE_NOT_ALLOWEDCard type blocked by risk rules

System / other

errorCodeMeaning
PARTNER_ERRORError from a downstream payment partner
APPLICATION_ERRORInternal application error
SYSTEM_ERRORSystem-level error
DUPLICATE_PAYMENTDuplicate of a recent payment on this page
DUPLICATE_CONCURRENT_PAYMENTConcurrent duplicate submission

For PARTNER_ERROR, APPLICATION_ERROR, or SYSTEM_ERROR, retry once. If the error persists, contact [email protected] with the pageId and timestamp.

Step 3 — Escalation

If you can't resolve the failure from the error code:

  1. Collect the pageId, paymentId, and errorCode from the webhook payload
  2. Note the timestamp (UTC)
  3. Email [email protected] with those details

For RISK_HARD blocks that appear to be false positives, include the pageId and the customer's referenceId.