Bank Rejects
Learn how to monitor and handle bank account payment rejections
Bank account payments can be rejected by the receiving bank several days after they were initially processed. Rejections occur for various reasons including insufficient funds, closed accounts, or invalid account numbers. Understanding how to monitor and respond to bank rejects is essential for maintaining accurate financial records and minimizing losses.
Bank rejects are different from payment declines. Declines occur immediately during payment processing, while rejects happen days later after the payment has already been marked as processed. Disputed transactions & chargebacks are covered in the Disputes article.
Prerequisites
Before handling bank rejects, it's helpful to learn about the following topics.
Learn about payment processing
Understand how payments are processed, including authorization, settlement, and clearing flows.
Learn about transaction webhooks
Monitor transaction lifecycle events and status changes through webhook notifications.
Understanding Bank Rejects
Bank rejects occur when a bank account payment that was initially processed successfully is later returned by the receiving bank. This typically happens 3-5 business days after the payment was processed, once the bank transfer network completes its settlement and verification process.
How Bank Rejects Work
- Initial Processing: Payment is processed and marked as
processed - Settlement: Payment enters the bank transfer settlement process
- Bank Verification: Receiving bank verifies account status and available funds
- Rejection: Bank returns the payment with a rejection code
- Status Update: Transaction status changes from
processedtorejected - Fund Reversal: Original funds are reversed from your processing account
Common Reject Reasons
Bank rejects happen for several reasons:
Insufficient Funds (NSF)
- Customer's account lacks sufficient balance
- Most common rejection reason
- Status code:
insufficient_bal
Invalid Account Number
- Account number is incorrect or doesn't exist
- Account has been closed
- Status code:
invalid_account_number
Timing Impact: Because rejects occur days after initial processing, you may have already shipped products or delivered services before discovering the payment failed. Implement validation strategies and monitor for rejects actively.
Querying Rejected Transactions
Monitor rejected transactions by querying for payments with rejected status.
This example demonstrates querying rejected transactions:
- Filter transactions by
status.value='rejected' - Optionally filter by date range using
rejected_date - Retrieve transaction details including rejection code
- Access
status.codeto determine specific rejection reason - Use
status.messagefor human-readable rejection details
Query results include all relevant rejection information, allowing you to analyze patterns, track rejection rates, and identify problematic accounts.
Handling Rejection Webhooks
Receive immediate notifications when payments are rejected by registering a webhook.
This example shows webhook handling:
- Register a webhook for the
rejecttrigger - Receive POST request when transaction rejects
- Parse webhook payload to extract transaction details
- Check
status.codeto determine reject reason - Take appropriate action based on rejection type
- Update internal systems and notify customer
Webhooks provide real-time notification of rejections, enabling immediate response to failed payments.
Webhook Security: Always verify webhook signatures to ensure requests are authentic. See Webhooks for details on webhook verification and security best practices.
Responding to Rejected Payments
Take appropriate action when payments are rejected based on the rejection reason.
Handle NSF rejections
When a payment rejects due to insufficient funds, attempt recovery or mark the account for follow-up.
This example handles NSF rejections:
- Check if rejection code is
insufficient_bal - Notify customer of failed payment
- Optionally schedule retry after a few days
- Update account status to track NSF occurrences
- Consider suspending service or requiring alternative payment
Multiple NSF rejections from the same account may indicate chronic insufficient funds. Consider requiring upfront payment or alternative payment methods for these customers.
Handle invalid account rejections
When an account number is invalid or closed, update your records and request new payment information.
This example handles invalid account rejections:
- Check if rejection code is
invalid_account_number - Mark payment method as invalid in your system
- Disable the payment method to prevent future charges
- Notify customer to update payment information
- Request new bank account details
Invalid account rejections are unlikely to succeed on retry. Remove the payment method from your system and collect new payment information.
Analyzing Rejection Patterns
Track rejection rates and identify patterns to improve payment success rates.
This example analyzes rejection patterns:
- Query all rejected transactions for a date range
- Group rejections by status code
- Calculate rejection rate by payment method
- Identify accounts with multiple rejections
- Generate reports for analysis
Regular analysis helps identify problematic payment methods, detect fraud patterns, and improve payment validation strategies.
Testing Bank Rejects
Test rejection handling in test mode before production deployment.
Simulating Rejections
Use test account numbers to trigger specific rejection scenarios:
In test mode, specific account numbers trigger different rejection codes:
- Test NSF rejections with account ending in
0001 - Test invalid account with account ending in
0002 - Test general reject with account ending in
0003
Verify Handling Logic
Test your rejection handling workflows:
- Confirm webhook endpoints receive rejection notifications
- Verify status updates propagate correctly
- Test customer notification emails
- Validate retry logic executes properly
- Ensure UI reflects rejection status
Test Mode: In test mode, rejections occur immediately instead of waiting 3-5 days. This allows rapid testing of rejection workflows without production delays.
Rejection Codes Reference
Common bank rejection status codes:
insufficient_balinvalid_account_numbergeneral_rejectSchema Reference
The following fields are relevant for handling bank rejects:
Transaction Fields
statuscodeapproved, card_expired, duplicate_attempt, exceeded_limit, general_decline, insufficient_bal, invalid_card_code, invalid_card_number, invalid_zip, invalid_address, invalid_account_number, suspicious_activity, too_many_attempts, processing_issue, issue_reading_card, not_supported, general_reject, general_adjustment, payment_stopped"Undocumented"messagevalueprocessing, authorized, processed, declined, rejected, voided, adjustedrejected_date"Undocumented"For complete transaction field documentation, see the Transaction API Reference.
Next Steps
Enhance bank reject handling and payment operations
Prevent Rejections
Manage Payment Methods to validate and update bank account details, use Payment Method Verification to confirm account ownership, and leverage Plaid for instant account verification.
Handle Payment Issues
Respond to Payment Declines for immediate payment failures, process Voids and Refunds to cancel and reverse payments, and resolve Disputes for customer disputes and chargebacks.
Monitor Payment Health
Set up Webhook Events for real-time rejection notifications, track metrics with Reporting Overview, and analyze transaction data using Build Report Queries.
Related articles
- Payment API - Process and manage payment transactions
- Transaction Webhooks - Monitor transaction events
- Transactions API Reference
- Webhooks - Configure rejection notifications