메인 콘텐츠로 건너뛰기
When a payment fails, Dodo Payments tells you why through a standardized error_code and a human-readable error_message. This guide shows how to read those fields, decide whether a retry is worthwhile, and recover the payment without exposing sensitive information to customers.

How Dodo Payments Reports a Failure

Every failed payment — whether a one-time checkout or a subscription renewal — carries the same failure fields on the payment object:
error_code and error_message are null until a payment actually fails. Always check status first, then read the error fields.

The payment.failed Webhook

The most reliable way to detect a failure is the payment.failed webhook. The event wraps the full payment object in data:
payment.failed payload
A minimal handler reads error_code and routes on it:
Always verify the webhook signature before processing. See the Webhooks guide for the full setup, including signature verification and idempotency.

Decide Whether to Retry: Soft vs. Hard Declines

The error_code tells you whether retrying the same payment method is worthwhile. The Transaction Failures reference lists the decline type and recommended action for every error_code.

Handling Failures at Checkout vs. on Renewal

How you recover depends on whether the customer is present.
The customer is actively checking out. Surface a clear message and let them retry immediately or use another card.
  • requires_payment_method — the customer never provided a payment method: they didn’t enter card details, or were prompted for one and took no action. This is usually a checkout drop-off, not a decline — re-engage the customer to complete payment (see Abandoned Cart Recovery).
  • requires_customer_action — additional authentication (such as 3DS) is needed; have the customer complete it. See 3D Secure handling.

Retrying a Failed Payment

  • Subscriptions: Enable Subscription Payment Retries to recover soft declines with no integration work. You can also trigger recovery by having the customer update their payment method via the Update Payment Method API, which charges any outstanding dues.
  • One-time payments: Resend the checkout or payment_link so the customer can try again with a different method. There is no automatic retry for one-time payments.
Do not retry hard declines against the same card. Card networks can flag repeated declines as abusive, which hurts your authorization rate.

Surface Errors to Customers Safely

Show customers a friendly message — never the raw error_code.
Customer-facing messaging
Never reveal the real reason for STOLEN_CARD, LOST_CARD, PICKUP_CARD, or FRAUDULENT. Surfacing these can tip off a fraudulent actor. Show a generic decline message and only log the specific error_code internally.

Transaction Failures

Every decline code, its type, and the recommended action.

Error Codes

API and business-logic errors that are not card declines.

Subscription Payment Retries

Automatic recovery of soft declines on subscription renewals.

Subscription Dunning

Email sequences that recover hard declines.

Payment Webhooks

Full payload schema for payment events.

Testing Failures

Test cards that simulate declines and renewal failures.
마지막 수정일 2026년 6월 26일