Language

Bank transfer workflow

Transfer failures

There are several reasons bank transfers can fail, a few of which are outlined below. When a transfer fails it is usually a result of an ACH failure which is assigned an ACH return code after being rejected from the financial institution. A few common failure cases include:

  • Insufficient Funds (R01): Pending transfers can fail due to insufficient funds from the source bank account.
  • No Account/Unable to Locate Account (R03): The recipient of a transfer has closed their bank account or has incorrectly entered their bank account/routing number when attaching their funding source.
  • Customer Advises Not Authorized (R10): The owner of a bank account has told their bank that this transfer was unauthorized.

What occurs in the Dwolla system when a bank transfer fails?

When a bank transfer failure occurs there are a subset of systematic actions Dwolla may take on the Customer and/or Funding Source based on the ACH return code. It is recommended to have an active webhook subscription, which is used to listen for events relating to any Customer or Funding Source state change. Please refer to the table below to understand the systematic actions that Dwolla may take for Customer and Funding Source resources, as well as the events that are created.

Customer actionFunding Source action
none
deactivated - customer_deactivated
none
unverified - customer_funding_source_unverified
removed - customer_funding_source_removed
unverified - customer_funding_source_unverified and removed - customer_funding_source_removed

Retrieving the reason for a failed bank transfer

When a bank transfer fails its status will be updated to failed. If your application is subscribed to webhooks, you’ll receive either the transfer_failed event if the transfer belongs to a Dwolla account or the customer_transfer_failed/customer_bank_transfer_failed(Verified Customer only) event if the transfer belongs to an API Customer. The event contains a links to the associated account as well as the transfer resource. To obtain more information on the transfer failure, you’ll first retrieve the transfer by its ID. The response from the API when retrieving the transfer should contain a "failure" link that your application will follow to retrieve the transfer failure reason. Upon success, the response will contain information on the ACH return code and description, as well as _links to the Funding Source and Customer that triggered the bank transfer failure.

Request and response (view schema in ‘raw’)

GET https://api-sandbox.dwolla.com/transfers/8997ebed-69be-e611-80ea-0aa34a9b2388/failure
Accept: application/vnd.dwolla.v1.hal+json
Authorization: Bearer pBA9fVDBEyYZCEsLf/wKehyh1RTpzjUj5KzIRfDi0wKTii7DqY

{
    "_links": {
        "self": {
            "href": "https://api.dwolla.com/transfers/8997ebed-69be-e611-80ea-0aa34a9b2388/failure",
            "type": "application/vnd.dwolla.v1.hal+json",
            "resource-type": "failure"
        },
        "failed-funding-source": {
            "href": "https://api.dwolla.com/funding-sources/285ea6f4-c45d-4e15-ad33-21f51461f437",
            "type": "application/vnd.dwolla.v1.hal+json",
            "resource-type": "funding-source"
        },
        "customer": {
            "href": "https://api.dwolla.com/customers/be2d2322-fdee-4361-8722-4289f5601604",
            "type": "application/vnd.dwolla.v1.hal+json",
            "resource-type": "customer"
        }
    },
    "code": "R03",
    "description": "No Account/Unable to Locate Account",
    "explanation": "The account number does not correspond to the individual identified in the entry or a valid account."
}
transfer_url = 'https://api-sandbox.dwolla.com/transfers/8997ebed-69be-e611-80ea-0aa34a9b2388'

# Using DwollaV2 - https://github.com/Dwolla/dwolla-v2-ruby
failure = app_token.get "#{transfer_url}/failure"
failure.code # => "R1"
<?php
$transfer = '8997ebed-69be-e611-80ea-0aa34a9b2388';

$TransfersApi = new DwollaSwagger\TransfersApi($apiClient);

$failureReason = $TransfersApi->failureById($transfer);
print($failureReason->code); # => "R01"
?>
transfer_url = 'https://api-sandbox.dwolla.com/transfers/8997ebed-69be-e611-80ea-0aa34a9b2388'

# Using dwollav2 - https://github.com/Dwolla/dwolla-v2-python (Recommended)
failure = app_token.get('%s/failure' % transfer_url)
failure.body['code'] # => 'R1'
var transferUrl = 'https://api-sandbox.dwolla.com/transfers/8997ebed-69be-e611-80ea-0aa34a9b2388';

appToken
  .get(`${transferUrl}/failure`)
  .then(res => res.body.code); // => 'R1'

List of possible return codes and descriptions

Return CodeDescription
R01Insufficient Funds
R02Account Closed
R03No Account/Unable to Locate Account
R04Invalid Account Number Structure
R05Unauthorized Debit to Consumer Account Using Corporate SEC Code
R06Returned per ODFI’s Request
R07Authorization Revoked by Customer
R08Payment Stopped
R09Uncollected Funds
R10Customer Advises Not Authorized, Improper, or Ineligible
R11Check Truncation Entry Returned
R12Account Sold to Another DFI
R13Invalid ACH Routing Number
R14Representative Payee Deceased or Unable to Continue in that Capacity
R15Beneficiary or Account Holder (Other Than a Representative Payee) Deceased
R16Account Frozen
R17File Record Edit Criteria
R18Improper Effective Entry Date
R19Amount Field Error
R20Non-Transaction Account
R21Invalid Company Identification
R22Invalid Individual ID Number
R23Credit Entry Refused by Receiver
R24Duplicate Entry
R25Addenda Error
R26Mandatory Field Error
R27Trace Number Error
R28Routing Number Check Digit Error
R29Corporate Customer Advises Not Authorized
R30RDFI Not Participant in Check Truncation Program
R31Permissible Return Entry (CCD and CTX only)
R32RDFI Non-Settlement
R33Return of XCK Entry
R34Limited Participation DFI
R35Return of Improper Debit Entry
R36Return of Improper Credit Entry
R37Source Document Presented for Payment
R38Stop Payment on Source Document
R39Improper Source Document/Source Document Presented for Payment
R40Return of ENR Entry by Federal Government Agency
R41Invalid Transaction Code
R42Routing Number/Check Digit Error
R43Invalid DFI Account Number
R44Invalid Individual ID Number/Identification Number
R45Invalid Individual Name/Company Name
R46Invalid Representative Payee Indicator
R47Duplicate Enrollment
R50State Law Affecting RCK Acceptance
R51Item Related to RCK Entry is Ineligible or RCK Entry is Improper
R52Stop Payment on Item Related to RCK Entry
R53Item and RCK Entry Presented for Payment
R61Misrouted Return
R67Duplicate Return
R68Untimely Return
R69Field Error(s)
R70Permissible Return Entry Not Accepted/Return Not Requested by ODFI
R71Misrouted Dishonored Return
R72Untimely Dishonored Return
R73Timely Original Return
R74Corrected Return
R75Return Not a Duplicate
R76No Errors Found
R80IAT Entry Coding Error
R81Non-Particpant in IAT Program
R82Invalid Foreign Receiving DFI Identification
R83Foreign Receiving DFI Unable to Settle
R84Entry Not Processed by Gateway

Financial institutions play an important role in the Dwolla network.

Dwolla, Inc. is an agent of Veridian Credit Union and Compass Bank and all funds associated with your account in the Dwolla network are held in pooled accounts at Veridian Credit Union and Compass Bank. These funds are not eligible for individual insurance, including FDIC insurance and may not be eligible for share insurance by the National Credit Union Share Insurance Fund. Dwolla, Inc. is the operator of a software platform that communicates user instructions for funds transfers to Veridian Credit Union and Compass Bank.