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
pending
status 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
Critical Understanding: Once a payment reaches
pending
status, it has been submitted to the payment network and cannot be stopped, held, or cancelled. The payment must complete its network processing.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
failed
withinsufficient_funds
reason - No money moved
Dispute After Funding
created
→scheduled
→pending
→paid
- Customer disputes with their bank
- Bank sends R10 return
- Status changes from
paid
toreversed
- Money was moved, then returned
Risk Hold and Release
created
- Payment initialized- Watchtower flags for review
on_hold
withrisk_review
reason- 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.