Understanding ACH returns

Understand ACH returns in the Rainforest ecosystem

An ACH return is a type of payment and is the movement of funds from a merchant.

An ACH return is initiated when an ACH payin is rejected. It is the ACH payment equivalent of a card decline or chargeback. Administrative returns, where the ACH return is due to incorrect information or insufficient funds, are processed within 2-3 days. Disputes, similar to card chargebacks, can be processed up to 90 days after the payin is initiated.


Return codes


An ACH payin can be returned for a variety reasons, the most common include insufficient funds, incorrect account information, or if the customer asks their bank to place a stop payment on the transfer. A return code is provided with the ACH return to provide an explanation of why the ACH return was created.

Most common return codes

CODEDESCRIPTION
R01Insufficient Funds
R02Account Closed
R03No Bank Account/Unable to Locate Account
R04Invalid Account Number
R05Unauthorized Debit to Consumer Account Using Corporate SEC Code
R06Returned per ODFI's Request
R07Customer Revoked Authorization
R08Payment Stopped
R09Uncollected Funds
R10Originator not known and/or not authorized to Debit Receiver’s Account

Refunds on ACH payins


In order to prevent a refund from being initiated on an ACH payin that ultimately will result in an ACH return, Rainforest does not allow refunds on ACH payins for T+4 from processing time, where T equals the first banking day after processing and 4 equals the number of banking days until the payin is eligible for a refund. For example, an ACH payin processed on Monday would be eligible for a refund on Friday. This allows for the ACH return to be processed prior to the payin being available for a deposit for most of the common return reasons.


Money movement


When an ACH return is created, the ACH payin could be in the status of Succeeded or Processing depending on if it has been deposited to the merchant or not.

ACH payin and ACH return in separate deposits

When the payin has already been funded in a previous deposit, the payin stays in Succeeded and the ACH return will be deducted from the merchant's next deposit along with any return fees.

Example

In the example below, the merchant's billing profile is configured with a $0.30 ACH payin fee, $5.00 ACH return fee, and $0.20 deposit fee. The $100 ACH payin was deposited in deposit dep_***FeNvi2. The payin was later returned and the $100 + $5 return fee was owed by the merchant and deducted from the merchant's next deposit.

ACH payin and ACH return in the same deposit

When the payin is in a Processing status and is within the T+X deposit time frame and not currently available for a deposit, the payin will move to Returned when the ACH return is created. This means the merchant will never receive the funds for the payin, but will be billed for the fees associated to the ACH payin and the ACH return in the next deposit.

When a payin moves to Returned, the payin resource will include the following fields in the payin.returned webhook and the get payin endpoint.

FieldTypeDescription
has_ach_returnbooleanBoolean indicating that the payin has an ACH return.
ach_returnobjectThe ACH return details including the ach_return_id and return_code.

Example

In the example below, the merchant's billing profile is configured with a $0.30 ACH payin fee, $5.00 ACH return fee, and $0.20 deposit fee. The $100 ACH payin was returned before it was deposited to the merchant. The $100 between the payin and the ACH return net to $0 in the deposit and only the processing fees of $0.30 for the ACH payin and $5 for the ACH return was owed by the merchant and deducted from the merchant's next deposit.


Listen to webhooks


Listen to the ACH return webhooks to know when an ACH return has been created and receive more details.

ACH payin and ACH return in separate deposits

If the ACH payin has already been funded in a previous deposit, the only webhook received will be ach_return.created.

ACH payin and ACH return in the same deposit

If the ACH payin was in Processing status and has not been funded in a previous deposit, then two webhooks will fire:

  • ach_return.created
  • payin.returned

The payin.returned webhook will include the following indicators to let you know the details of the ACH return.

FieldTypeDescription
has_ach_returnbooleanBoolean indicating that the payin has an ACH return.
ach_returnobjectThe ACH return details including the ach_return_id and return_code.

Simulate an ACH return in sandbox


You can simulate an ACH return on a payin in sandbox. The payin must be in the status of Processing or Succeeded in order to initiate a return. Once an ACH return has been created, you can simulate a merchant deposit to see how the return and fees will be deducted from a deposit.