피드로 돌아가기
Every Stripe decline code, what it actually means, and whether retrying will help
Dev.toDev.to
Backend

decline_code 기반의 5단계 분류 체계를 통한 결제 복구율 최적화

Every Stripe decline code, what it actually means, and whether retrying will help

Mike Badger2026년 6월 13일4intermediate

Context

단순 code 필드에 의존한 일괄적인 Smart Retries 적용으로 인한 복구 기회 손실 발생. 무분별한 재시도가 카드 네트워크 페널티를 유발하거나 고객 액션이 필요한 케이스를 방치하는 아키텍처적 한계 노출.

Technical Solution

  • code 대신 세분화된 decline_code를 분석 지표로 채택한 의사결정 로직 설계
  • 결제 실패 원인을 Auto-recoverable, Customer Action, Lost Cause, Hard Decline, Structural 5개 버킷으로 분류하는 라우팅 체계 구축
  • SCA(Strong Customer Authentication) 대응을 위해 authentication_required 발생 시 재시도 대신 확인 링크를 전송하는 워크플로우 도입
  • 카드 네트워크 페널티 방지를 위해 fraudstolen_card 코드 식별 시 즉시 재시도를 중단하는 Hard Stop 메커니즘 구현
  • currency_not_supported 등 구조적 결함을 식별하여 개별 결제 처리 대신 체크아웃 설정 자체를 수정하는 피드백 루프 생성

- 결제 실패 로그를 `decline_code` 기준으로 그룹화하여 실제 복구 가능한 비율 분석 - 재시도 로직에 `insufficient_funds` 등 특정 코드별 맞춤형 타이밍(예: 급여일 근처) 적용 - EU 지역 서비스의 경우 `authentication_required`에 대해 Retry가 아닌 3DS 인증 링크 전송 프로세스 검토 - 카드 네트워크 정책 준수를 위해 `lost_card`, `fraud` 코드에 대한 재시도 금지 필터링 구현

원문 읽기