Journey Overview
Preconditions
- Member has attempted a payment
- Payment was declined or failed
- Member has access to update payment method
Journey Flow
Detailed Steps
1
Payment Failure Detection
System detects payment failure via:
- Stripe webhook:
payment_intent.payment_failed - Stripe webhook:
invoice.payment_failed - Real-time checkout error
- Timestamp
- Amount
- Failure reason (Stripe error code)
- Attempt number
- Payment method used
2
Immediate Notification
Member receives immediate notification:In-App:
- Banner on dashboard: “Payment failed - Action required”
- Modal if currently in checkout
3
Dunning Sequence (Subscriptions)
For subscription renewals, automated retry schedule:
4
Member Updates Payment Method
Member clicks recovery link:
- Directed to payment update page
- Current (failed) method shown
- Option to:
- Update existing card details
- Add new card
- Use saved alternative card
- Try digital wallet (Apple/Google Pay)
- New card validated with $0 authorization
- New card set as default
5
Retry Payment
After updating payment method:Automatic Retry:
- System immediately retries failed payment
- Uses new default payment method
- Member sees processing indicator
- Member clicks “Retry Payment”
- Full checkout flow with new card
6
Success Confirmation
On successful payment:
- Success message displayed
- Confirmation email sent
- Invoice generated
- Membership/access restored
- Failure record marked resolved
- Dunning sequence cancelled
Payment Failure Types
Recovery UI States
- Payment Update Form
Smart Retry Logic
System implements intelligent retry:Escalation Path
If automated recovery fails:- Day 7: Support team notified
- Day 10: Member account flagged
- Day 14: Account manager outreach (if applicable)
- Manual options:
- Phone payment
- Invoice/bank transfer
- Payment plan arrangement
Related Entities
Related Journeys
Acceptance Criteria
Frontend
- Payment failure banner on dashboard
- Payment update page with current card shown
- Stripe Elements for new card entry
- Error messages in plain language (not codes)
- Retry button with loading state
- Success confirmation on resolution
- Email links deep-link to recovery page
Backend
-
POST /api/payments/update-method- Update payment method -
POST /api/payments/retry- Retry failed payment -
GET /api/payments/failures- Get pending failures - Webhook:
payment_intent.payment_failed - Webhook:
invoice.payment_failed - Scheduled dunning job
Permissions
- Member can only resolve their own failures
- Support can manually resolve on behalf
Business Rules
- Maximum 4 auto-retries before stopping
- Grace period access during recovery window
- Hard declines (fraud, stolen) not retried
- Payment method update resets retry counter
Error Handling
- All failure reasons mapped to friendly messages
- Stripe error codes logged for debugging
- Support notified of repeated failures