What This Reference Covers
This comprehensive guide provides everything you need to handle payment statuses correctly:- Status lifecycles: The complete flow from creation to terminal states
- The pending threshold: Why
pendingstatus is the point of no return - Failed vs reversed: Critical distinction between pre-funding and post-funding failures
- ACH return codes: All R-codes and S-codes with their meanings and timing
- Status reasons: Complete catalog of 20+ failure reasons and their sources
- Implementation patterns: Code examples for monitoring and handling status changes
Payment Lifecycle Overview
The happy path for payments follows this progression:1
Created
Payment successfully created and awaiting verification
2
Scheduled
Payment passed verifications and risk scoring, queued for processing
3
Pending
Payment sent to network - CANNOT BE STOPPED
4
Paid
Payment successfully funded
Status Values
Complete Status Reference
| Status | Description | Can Modify? | Terminal? |
|---|---|---|---|
created | Payment created, awaiting verification | ✅ | No |
scheduled | Verified and queued for processing | ✅ | No |
pending | Sent to network | ❌ | No |
on_hold | Paused for review | ✅* | No |
paid | Successfully funded | ❌ | No† |
failed | Declined/returned before funding | ❌ | Yes |
reversed | Returned after funding completed | ❌ | Yes |
cancelled | Terminated before network submission | ❌ | Yes |
†Can still transition to
reversed if return occurs post-funding
Understanding Failed vs Reversed
| Status | When It Occurs | Money Movement | Example |
|---|---|---|---|
failed | Before funding completes | No money moved | NSF during processing |
reversed | After funding completes | Money moved, then returned | Dispute filed after payment |
Status Reasons
Complete Reason Reference
| Reason Code | Description | Typical Source |
|---|---|---|
ok | Normal/successful status | system |
insufficient_funds | Customer’s account has insufficient funds | bank_decline |
closed_bank_account | Bank account is closed | bank_decline |
invalid_bank_account | Account cannot be located or is invalid | bank_decline |
invalid_routing | Invalid ACH routing number | bank_decline |
frozen_bank_account | Account frozen or OFAC hold | bank_decline |
owner_deceased | Account owner is deceased | bank_decline |
disputed | Customer notified bank payment was unauthorized | customer_dispute |
payment_stopped | Customer placed stop payment order | bank_decline |
risk_review | Payment under review by Straddle | watchtower |
fraudulent | Declined due to suspected fraud | watchtower |
payment_blocked | Watchtower rule prevented origination | watchtower |
invalid_paykey | Paykey blocked due to previous failures | watchtower |
amount_too_large | Exceeds maximum allowed amount | system |
too_many_attempts | Daily transaction limit exceeded | system |
duplicate_entry | Duplicate transaction detected | system |
internal_system_error | Internal system error | system |
user_request | User-requested action | user_action |
other_network_return | Other network return codes | bank_decline |
payout_refused | Receiver refused credit | bank_decline |
Status Sources
Sources identify where status changes originate:| Source | Description | Examples |
|---|---|---|
system | System-generated status | Normal processing, limits |
watchtower | Internal fraud/risk system | Risk holds, fraud detection |
bank_decline | Bank or network declined | NSF, closed account |
customer_dispute | Customer disputed payment | Unauthorized claim |
user_action | Manual user action | User-initiated holds |
ACH Return Codes
Standard ACH Returns (R-Codes)
| Code | Reason | Message | Pre/Post Funding |
|---|---|---|---|
| R01 | insufficient_funds | The customer’s account has insufficient funds | Both |
| R09 | insufficient_funds | Uncollected funds | Both |
| R02 | closed_bank_account | The bank account is closed | Both |
| R03 | invalid_bank_account | The bank account could not be located | Pre |
| R04 | invalid_bank_account | Bank account number invalid (missing digits) | Pre |
| R13 | invalid_routing | Invalid ACH routing number | Pre |
| R20 | invalid_bank_account | Account not eligible for transaction activity | Pre |
| R05 | disputed | Debit to consumer account using corporate consent | Post |
| R07 | disputed | Authorization revoked by customer | Post |
| R10 | disputed | Customer advises not authorized | Post |
| R11 | disputed | Check truncation entry return | Post |
| R29 | disputed | Corporate customer notified bank unauthorized | Post |
| R08 | payment_stopped | Customer placed stop payment order | Both |
| R14 | owner_deceased | Representative payee deceased | Both |
| R15 | owner_deceased | Beneficiary/account holder deceased | Both |
| R16 | frozen_bank_account | Account frozen or OFAC hold | Both |
| R23 | payout_refused | Receiver refused credit | Pre |
| R24 | duplicate_entry | Duplicate entry | Pre |
| R06+ | other_network_return | Various other return reasons | Both |
Straddle Internal Codes (S-Codes)
| Code | Reason | Message | When Applied |
|---|---|---|---|
| S01 | payment_blocked | Invalid routing number | Pre-origination |
| S02 | payment_blocked | Known bad account number | Pre-origination |
| S10 | payment_blocked | Invalid account number | Pre-origination |
| S11 | payment_blocked | Previous R02, R03, R04, R16, or R20 | Pre-origination |
| S12 | payment_blocked | Previous R05, R07, R08, R10, R11, or R29 | Pre-origination |
| S13 | payment_blocked | Invalid ODFI credentials | Pre-origination |
Status Details Structure
Every payment includes detailed status information:Handling Status Changes
Monitoring for Status Changes
Handling Specific Failure Reasons
Common Scenarios
Successful Payment Flow
created- Payment initializedscheduled- Verification passed, risk approvedpending- Sent to ACH networkpaid- Funds successfully transferred
NSF Before Funding
created→scheduled→pending- Bank returns with R01
- Status changes to
failedwithinsufficient_fundsreason - No money moved
Dispute After Funding
created→scheduled→pending→paid- Customer disputes with their bank
- Bank sends R10 return
- Status changes from
paidtoreversed - Money was moved, then returned
Risk Hold and Release
created- Payment initialized- Watchtower flags for review
on_holdwithrisk_reviewreason- Manual review in dashboard
- If approved:
on_hold→scheduled→ normal flow - If declined:
on_hold→cancelled
Best Practices
Monitor Pending Status
Once pending, payments cannot be stopped. Plan accordingly.
Check Status Details
Always examine
status_details for specific reasons and codes.Handle Failed vs Reversed
Different workflows for pre-funding failures vs post-funding reversals.
Track Return Codes
Log ACH return codes for reconciliation and pattern analysis.