# ACH

## Overview

The ACH (Automated Clearing House) network facilitates transfer of funds between banks in the US. Transactions can take between 24-48 hours for transactions to complete.

Zūm Rails offers support for **Standard ACH** and **Same-day ACH**. Using either payment method, customers can send and receive funds.

## Benefits of using ACH&#x20;

* **Low-Cost**: ACH payments usually have lower fees than wire transfers or credit cards.
* **Speed**: ACH payments are processed quickly, often within 1-2 business days.
* **Security**: Highly secure with encryption and reduced risk of fraud compared to checks or cash.
* **Convenience**: Easy to set up for recurring payments like payroll, bills, and subscriptions.
* **Wide Usage**: Commonly accepted by businesses and financial institutions, both domestic and international.

## **Transaction Types**

Using ACH, you can fund or withdraw Zūm Wallet, or send or receive funds from your users. Zum Rails supports the following transaction types for ACH:

* FundZumWallet&#x20;
* WithdrawZumWallet
* AccountsPayable
* AccountsReceivable

## Transaction Limits

| Transaction Limit            | Minimum | Maximum    |
| ---------------------------- | ------- | ---------- |
| Amount limit per transaction | $0.00   | Unlimited  |
| Maximum volume per day       | $0.00   | Unlimited  |
| Transaction per day          | 0       | 99,999,999 |
| Maximum Volume Per Month     | $0.00   | Unlimited  |

## Transaction Events

Zūm Rails offers comprehensive transaction event tracking, detailing each step in a transaction's lifecycle. These events are also available as webhooks for real-time updates.

{% tabs %}
{% tab title="Standard ACH" %}

<table><thead><tr><th width="313">Event</th><th>Description</th></tr></thead><tbody><tr><td>AchTransactionAccepted</td><td>When transaction is accepted</td></tr><tr><td>AchFailedTransactionExpired</td><td>When transaction has expired</td></tr><tr><td>AchFailedReturnedOrClosedAccount</td><td>When transaction is returned due to a closed account or any other return reason</td></tr><tr><td>AchFailedRejectedWithReason</td><td>When transaction is rejected for a reason</td></tr><tr><td>AchFailedGeneralError</td><td>When transaction has failed due to general error</td></tr><tr><td>AchFailedHighRiskOrPotentialFraud</td><td>When transaction is rejected as high-risk or potential fraud</td></tr><tr><td>AchFailedDueToMerchantSetup</td><td>When transaction failed because of invalid or inactive merchant id</td></tr><tr><td>AchFailedInvalidValueForField</td><td>When transaction failed due to invalid value for field</td></tr><tr><td>AchFailedAuthorizationRevoked</td><td>When transaction failed because authorization was revoked</td></tr><tr><td>AchFailedDuplicateTransaction</td><td>When transaction failed due to duplicated transaction</td></tr><tr><td>AchFailedDueToProcessorTimeout</td><td>When transaction is not successfully processed due to processor timeout</td></tr><tr><td>AchFailedTransactionNotAllowed</td><td>When transaction is not allowed by provider</td></tr><tr><td>AchBankAccountVerificationFailed</td><td>When transaction fails because the bank account verification failed</td></tr><tr><td>AchDebitResponseReceived</td><td>When response is received for a debit transaction</td></tr><tr><td>AchCreditResponseReceived</td><td>When response is received for a credit transaction</td></tr><tr><td>AchTransactionReturned</td><td>When transaction returned from bank and will be resubmitted in the next banking cycle. Note that this does not mean the transaction failed.</td></tr><tr><td>AchTransactionResubmitted</td><td>When transaction is resubmitted for processing again</td></tr><tr><td>AchCancellationFailed</td><td>When request to cancel transaction failed</td></tr><tr><td>AchCancellationFailedDueToMerchantSetup</td><td>When request to cancel transaction failed due to merchant setup</td></tr><tr><td>AchCancellationFailedRefundGreaterThanTransactionAmount</td><td>When request to cancel transaction failed as refund amount is bigger than transaction amount</td></tr><tr><td>AchCancellationFailedTransactionAlreadyCancelled</td><td>When request to cancel transaction failed because transaction is already cancelled</td></tr><tr><td>AchFailedDueToNegativeData</td><td>When transaction failed due to negative user data</td></tr><tr><td>AchFailedIneligibleBankAccount</td><td>When transaction failed because bank account is not on ACH network</td></tr></tbody></table>
{% endtab %}

{% tab title="Same-day ACH" %}

<table><thead><tr><th width="353">Event</th><th>Description</th></tr></thead><tbody><tr><td>SameDayAchFailedGeneralError</td><td>When transaction has failed due to general error</td></tr><tr><td>SameDayAchFailedHighRiskOrPotentialFraud</td><td>When transaction is rejected as high-risk or potential fraud</td></tr><tr><td>SameDayAchFailedDueToNegativeData</td><td>When transaction failed due to negative user data</td></tr><tr><td>SameDayAchFailedDueToMerchantSetup</td><td>When request to cancel transaction failed due to merchant setup</td></tr><tr><td>SameDayAchFailedDueToProcessorTimeout</td><td>When transaction is not successfully processed due to processor timeout</td></tr><tr><td>SameDayAchFailedTransactionExpired</td><td>When transaction has expired</td></tr><tr><td>SameDayAchFailedPaymentDeclinedByUser</td><td>When transaction is declined by user</td></tr><tr><td>SameDayAchFailedTransactionNotAllowed</td><td>When transaction is not allowed by provider</td></tr><tr><td>SameDayAchFailedInvalidValueForField</td><td>When transaction failed due to invalid value for field</td></tr><tr><td>SameDayAchFailedAuthorizationRevoked</td><td>When transaction failed because authorization was revoked</td></tr><tr><td>SameDayAchFailedDuplicateTransaction</td><td>When transaction failed due to duplicated transaction</td></tr><tr><td>SameDayAchBankAccountVerificationFailed</td><td>When transaction failed because the bank account verification failed</td></tr><tr><td>SameDayAchFailedRejectedWithReason</td><td>When transaction is rejected for a reason</td></tr><tr><td>SameDayAchFailedReturnedOrClosedAccount</td><td>When transaction is returned due to a closed account or any other return reaso</td></tr></tbody></table>
{% endtab %}
{% endtabs %}

{% hint style="success" %}
For detailed instructions on initiating ACH transactions, please consult the [API Reference](https://docs.zumrails.com/api-reference/transactions).
{% endhint %}

## Testing

### Users & Bank Accounts

In sandbox, to add a bank account for a User, use any valid routing-number. The account-number can be any 5-17 digit number.

Some valid routing numbers that will work on the sandbox environment are:

* 122000661
* 026009593
* 063100277

To simulate verification statuses (for bank accounts) in sandbox, use the following routing and account numbers.

| Routing Number | Account Number | Verification Status      |
| -------------- | -------------- | ------------------------ |
| 122105278      | 999999999      | :red\_circle: Failed     |
| 122000661      | 0000000016     | :orange\_circle: Unknown |
| 122105278      | 0000000049     | :green\_circle: Verified |

### Transactions

To simulate an ACH failure, include an event name from the list above in the COMMENT field when creating a transaction. If you don't mention an event in the COMMENT, the transaction will change its status to "Completed" in the sandbox environment.

{% tabs %}
{% tab title="Simulating Success" %}

```json
{
  "ZumRailsType": "AccountPayable",
  "TransactionMethod": "Ach",
  "Amount": 123.45,
  "Memo": "This transaction will succeed",
  "Comment": "This transaction will succeed because there's no keyword",
  "UserId": "1d431e8b-...85452adb4eee",
  "WalletId": "8ebd932b-...b92633e14297"
}
```

{% endtab %}

{% tab title="Simulating Failure" %}

```json
{
  "ZumRailsType": "AccountPayable",
  "TransactionMethod": "Ach",
  "Amount": 123.45,
  "Memo": "This transaction will fail with event AchFailedRejectedWithReason",
  "Comment": "AchFailedGeneralError",   // Include event name in comment
  "UserId": "1d431e8b-...85452adb4eee",
  "WalletId": "8ebd932b-...b92633e14297"
}
```

{% endtab %}
{% endtabs %}

{% hint style="warning" %}
To simulate a late failure, mention any of the following events in the COMMENT field:

* `AchFailedRejectedWithReason`
* `AchFailedReturnedOrClosedAccount`
* `SameDayAchFailedRejectedWithReason`
* `SameDayAchFailedReturnedOrClosedAccount`
  {% endhint %}

## Additional features

* **Account Verification** -  Zūm Rails provides Account Verification services, allowing connection to a user's financial institution to retrieve account and routing numbers. This information is useful for tasks such as money transfers and account setup. Zūm Rails ensures account validation according to NACHA WEB debit rules.
* **Balance Checks** - Balance Checks allow retrieving the available balance for an end user’s financial accounts. This service provides balance details without retrieving transaction data.
* **Owner identification** - Owner Identification retrieves information about the owner of an account, such as their name, address, and contact information. This information is crucial for verifying the identity of an end user.
