ACH (Automated Clearing House) is the system on which we process eChecks. Because eChecks have a longer process than credit card transactions, failures can occur in multiple ways. This support article is to help provide additional information on the behavior of ACH transactions when they fail at an early stage in the process, or when they fail a later stage, resulting in an ACH return.
Processors inform us of a return via SFTP files. After ingesting the file, we fire a webhook and either fail the transfer or create a new REVERSAL depending on the circumstances.
eChecks
Invalid information
eChecks can fail at multiple stages of the process. Worldpay verifies the information on an eCheck for basic validity. If an eCheck fails at this stage, it will appear as a single Transfer with a state of "FAILED" in Finix's system. As with funding instructions, you can find the error in the "messages" field of the resource. However, because this was not an eCheck return, you will see no ACH return code.
{
"id" : "TRxxxxx",
"amount" : 500,
"tags" : { },
"state" : "FAILED",
"trace_id" : "FNXxxxxx",
"currency" : "USD",
"application" : "APxxxxx",
"source" : "PIxxxxxx",
"destination" : null,
"ready_to_settle_at" : null,
"fee" : 0,
"statement_descriptor" : "xxx*BARILLAS",
"type" : "DEBIT",
"messages" : [ "Invalid Bank Routing Number" ],
"raw" : {
"id" : "FNXxxxxx",
"report_group" : "APxxxxxx",
"litle_txn_id" : xxxxxxx,
"order_id" : "FNXxxxxxxx",
"response" : "900",
"response_time" : "xxxxx",
"message" : "Invalid Bank Routing Number"
},
"created_at" : "xxxxx,
"updated_at" : "xxxxxx",
"idempotency_id" : "xxxxxxxx",
"merchant_identity" : "IDxxxxxx",
"subtype" : "API",
"_links" : {
Returns on eChecks
If an eCheck makes it through Worldpay's validation, that Transfer will be funded to the merchant in the next day's settlement (unless a merchant has implemented a delay on eCheck funding). However, it can still take up to 5 business days for the eCheck to reach the issuing bank and be verified there. If the issuing bank rejects an eCheck, there will be a return. In these cases, the original Transfer will remain in a state of "SUCCEEDED" in Finix's system, but will now have an associated "REVERSAL."
Timeline of Events:
- Payment Facilitator software creates a Transfer using the eCheck API /transfers
- eCheck is successfully sent to WorldPay
- eCheck gets funded to merchant in settlement
- There is a return or chargeback on the transfer
- Finix will import the chargeback information and create a separate Reversal transfer with the amount of the eCheck
- Thereafter, it will be marked ready to settle and the Reversal can be added to a settlement.
Example GET response on original eCheck:
{
"id" : "TRxxxxx",
"amount" : 500,
"tags" : { },
"state" : "SUCCEEDED",
"trace_id" : "FNxxxx1",
"currency" : "USD",
"application" : "Axxxxx",
"source" : "PIxxxxx",
"destination" : null,
"ready_to_settle_at" : "xxxxxx",
"fee" : xxx,
"statement_descriptor" : "XXX*BARILLAS",
"type" : "DEBIT",
"messages" : [ ],
"raw" : null,
"created_at" : "xxxxx",
"updated_at" : "xxxxxx",
"idempotency_id" : "xxxxx",
"merchant_identity" : "IDxxxxxx",
"subtype" : "API",
"_links" : {
Example GET response on REVERSAL Transfer to collect the amount of the return:
{
"id" : "TRxxxxxxxx",
"amount" : 500,
"tags" : {
"result_message_2" : "Rejected because there is 'ACH_eCheck_Returns' record in CHARGEBACK for 'FNXxxxxx' ACH transfer",
"result_message_0" : "ReasonCode: R01 ",
"result_message_1" : "ReasonDescription: Insufficient Funds"
},
"state" : "SUCCEEDED",
"trace_id" : "FNXxxxxxxxx",
"currency" : "USD",
"application" : "APxxxxxxx",
"source" : null,
"destination" : "PIxxxxxxx",
"ready_to_settle_at" : "xxxxxxx",
"fee" : 0,
"statement_descriptor" : null,
"type" : "REVERSAL",
"messages" : [ ],
"raw" : null,
"created_at" : "xxxxx",
"updated_at" : "xxxxx",
"idempotency_id" : null,
"merchant_identity" : "IDxxxxxx",
"subtype" : "SYSTEM",
"_links" : {
}
Funding Instructions
Funding instructions are processed on the ACH rails, so they exhibit much of the same behavior as eChecks. If a funding instruction gets returned, that Transfer will enter a state of "FAILED" in the Finix system, with an ACH return code in the "messages" field.
Here is an example GET response for Funding Instructions on the Transfers Endpoint /transfer.
ROC
{
"id" : "TRxxxxxx",
"amount" : 500,
"tags" : { },
"state" : "FAILED",
"trace_id" : "FNXxxxxxx",
"currency" : "USD",
"application" : "APxxxxxx",
"source" : null,
"destination" : "PIxxxxx",
"ready_to_settle_at" : null,
"fee" : 0,
"statement_descriptor" : null,
"type" : "CREDIT",
"messages" : [ "ReasonCode: R03", "ReasonDescription: No Account/Unable to Locate Account", "Declined because there is a record in FAILED_FUNDS for 'FNXxxxxxxx' transfer" ],
"raw" : {
"Return Date" : "xx/xx/2019",
"Original Date" : "xx/xx/2019",
"Attempted Funds Transfer Date" : "xx/xx/2019",
"Merchant Name" : "xxx xxxx xxxx xxx",
"Sub Merchant Business Name" : "xxx xxx xxx",
"Funding Sub Merchant ID" : "0xxxxxx",
"Funds Transfer Request ID" : "FNXxxxxx",
"Vantiv Payment ID" : "xxxxx",
"Txn Type" : "FISC",
"Funds Transfer Amount" : 500.00,
"Reason Code" : "R03",
"Reason Message" : "No Account/Unable to Locate Account",
"Routing Number" : "xxxxx",
"Account Number" : "XXxxxxx",
"Account Name" : "xxx xxx xxx"
},
"created_at" : "xxxx",
"updated_at" : "xxxx",
"idempotency_id" : null,
"merchant_identity" : "IDxxxxx",
"subtype" : "SETTLEMENT_MERCHANT",
"_links" : {
Comments
0 comments
Please sign in to leave a comment.