Overview

ACH is a one-stop shop for a variety of payment use cases. From recurring payments and payroll deposits to online purchases and bill payment, ACH offers a fast and flexible way to send money. Originally established in 1970, expanding support and innovation around ACH payments has led it to become one of the most popular online payment rails in the world.

What is an ACH Transaction?

An ACH transaction (often referred to as an ACH transfer) is an electronic, bank-to-bank money transfer processed through the Automated Clearing House (ACH) Network. You can think of the ACH Network as a postal service for ACH files. Each file can contain up to 1000 ACH entries with each entry representing a transaction being sent from one bank to another. ACH transactions can be used to facilitate Person-to-person (P2P), Business-to-consumer (B2C), and Business-to-business (B2B) payments and is a convenient alternative to card networks, wire transfers, paper checks or cash. In addition to their convenience, ACH transactions are reliable, inexpensive, fast, and most importantly, safe. Most transfers are processed and settled within 1-2 business day with zero cost to the consumer.

What are the 2 types of ACH Transactions?

Each ACH transaction involves 2 primary parties:
  1. The Originating Depository Financial Institution (ODFI) which is the bank initiating the transaction; and
  2. The Receiving Depository Financial Institution (RDFI), the bank receiving the transaction).
All transactions fall into one of two categories, debit (“pull”) or credit (“push”).

Push (Credit)

Determining if a transaction is a push or pull is always with respect to the receiving account. For example, if Tom, a customer of Bank A wants to send money to John, a customer of Bank B. Tom’s bank can originate an ACH push transaction from his account to John’s account. The term “push” is used interchangeably with “credit”. The result is a credit to John’s (the receiver) account balance and a debit to Tom’s (the sender). A real life use case for push transactions are the deposits that result from an employee signing up for payroll direct deposit. Whenever payday rolls around, the employer’s bank initiates a push/credit to the employee’s bank account.

Pull (Debit)

Alternatively, if Tom want’s to request money from John, Tom’s bank can originate an ACH pull request from his account to John’s. The term “pull” is used interchangeably with “debit”. The result is a debit to John’s account and a credit to Tom’s. This is what occurs when users of a service sign up for recurring bill payments. The service provider ends up debiting the customer’s account via an ACH pull request. This is also the case when a banking customer deposits a check made out to him/her by an account holder at another financial institution. Checks are ultimately translated into pull request on the ACH network. The check contains the account holders routing and account number which are the only pieces of information required to initiate a credit or debit from an account at another institution.
There is a difference between the direction of an ACH transaction and the direction of money flow. The direction of the transaction refers to the direction of the ACH message on the network. It always flows from the originator to the receiver while the direction of money flow relates to which account is receiving funds and which account is sending them. This means there are 2 ways to achieve the same direction of money movement.

Scenario

The desired result is to withdraw funds from an account at Bank A and deposit them into an account at Bank B
ACH Move Money

Option 1 (This is how customers fund their accounts)

Bank B sends an ACH debit / pull transaction requesting funds from the account at Bank A:
ACH Debit

Option 2

Bank A sends an ACH credit / push transaction to send funds to the account at Bank B.
ACH Credit

How does Synctera support ACH?

From the outside, the ACH workflow may seem simple, but it’s actually quite complex. This is where Synctera comes in. Synctera works with your sponsor bank to serve as your connection to the ACH network and supports sending and accepting ACH transactions from other financial institutions. In ACH terms, Synctera acts as the ODFI (Originating Depository Financial Institution) when it comes to originating transactions and the RDFI (Receiving Depository Financial Institution) when it comes to receiving them. It means that we take care of all the batch processing and file generation while ensuring that all transactions are reflected in your customer account balances.

FinTech in the Auth Flow

Synctera allows the FinTech to participate in the transaction authorization decision for Inbound ACH Direct Debit. This capability can only be enabled for linked zero balance accounts and can be used to:
  • Restrict payments to certain institutions
  • Run your own balance checks against the linked balance carrying account
If the transaction is declined by the FinTech, then an ACH return will be sent to the network. The FinTech does not have to participate unless there is an additional approval logic. If the FinTech opts not to participate in the Auth Flow, Synctera will use default authorization logic to authorize the transactions. In order to participate in Auth Flow for Pull (Debit) ACH transactions, the FinTech should support an Authorization Gateway and a corresponding Gateway Endpoint must be configured on the Synctera side.

Authorization Gateway

An authorization Gateway enables a FinTech to optionally take part in the decision of a Pull (Debit) ACH transaction’s authorization cycle. The FinTech receives an authorization request via the configured Gateway to either approve or decline corresponding ACH transactions based on the FinTech’s own business logic.
Request Body
Synctera sends such information as a POST HTTP request to the FinTech about Pull (Debit) ACH transactions that needs to be authorized:
{
  "customer_id": "2b9cc6f2-d0bd-4d9d-aa20-5e53355f9469",
  "account_id": "0221e0a7-7774-48a4-8521-e678ec09a53a",
  "transaction_id": "9b59fc80-9bf5-4749-8dd2-511f183becf2",
  "settlement_date": "2022-03-25",
  "effective_date":  "2022-03-25",
  "transaction_type": "incoming_debit",
  "dc_sign": "debit",
  "amount": 100,
  "currency": "USD",
  "network": "ACH"
}
Response HTTP code
To signal an authorization request decision, the FinTech must reply with the appropriate HTTP code:
  • HTTP code 200: approve the corresponding ACH transaction
  • HTTP code 402: decline the corresponding ACH transaction
Receiving any other HTTP code in the response will stop the processing of the corresponding Pull (Debit) ACH transaction. However, in this case the transaction will not be declined, but will be retried within 2 days until the FinTech responds with either 200 or 402 response.
Response timeout
Synctera waits for the authorization response within the timeout window which defaults to 1.5 seconds, but can be configured in the Gateway Endpoint Configuration. If the response is not received within the defined timeout window, the corresponding Pull (Debit) ACH transaction will stop being processed. But will not be declined and will be retried within 2 days until the FinTech sends the response within the defined timeout window.

Gateway Endpoint Configuration

To configure a Gateway for the FinTech, a valid publicly accessible url must be provided. Additionally, custom_headers and custom response timeout in milliseconds max_wait_ms can be configured. Also, Gateways may be disabled by setting the disabled field to true.
curl \
  -X POST \
  -H "Authorization: Bearer $apikey" \
  -H "Content-Type: application/json" \
  $baseurl/v0/ach/gateways \
  --data-binary '
  {
    "url": "https://example-fintech.com/ach/auth",
    "custom_headers": {
      "key1": ["value1", "value2"],
      "key2": ["value"]
    },
    "max_wait_ms: 1500,
    "disabled": false
  }'

How are accounts funded using ACH?

Once your customers have an account setup, they’ll need to fund their account by originating an ACH pull/debit transaction to be sent to their account at another institution. Synctera refers to this as an external account. If you have just created account B on the Synctera platform and you want to add funds to it from account A at another financial institution, its natural to assume that funding involves pushing funds from account A to account B. Instead, funding your customers account involves originating an ACH debit/pull transaction with your Synctera account in order to withdraw funds from the external account.

How do I get started with sending/receiving ACH payments?

1

Customer Creation

1.1 Create a CustomerAny individual wanting to transact on the Synctera platform must be stored as a customer in our system. Part of that includes completing the KYC process. See the Customer guide for details.
2

Account Creation

2.1 Create an AccountIn order to send and receive ACH payments you will need to create an account and associate it with your customer. Account Guide2.2 Create an External AccountIn order for your customers to fund their accounts they’ll need to debit funds from an account at another institution. You’ll need to create an external account on the Synctera platform which serves as the internal representation of the account to be debited. External Account Guide
3

Send/Receive an ACH

3.1 Send an ACH requestOnce the external account has been verified, ACH transactions (credits and debits) can be originated from your customer’s account. If you’re unsure what values to set in your API request take a look at the documentation here.3.2 Receive an ACH transactionAs long as your customer has an account that is both active and verified, there is no work required by you or your customer to receive ACH transactions. Synctera will process the incoming transaction and debit/credit the account accordingly.

What happens after I send an ACH request?

After you send a request to originate an ACH transaction, the transaction is placed in a batch which, in turn, is placed in an ACH file to be sent out over the network. Depending on the time that you originate the transaction there may be some delay between the time the transaction is created and the time the file is sent. This is done to align with the processing schedule set by the federal reserve. The date the transaction is sent will ultimately determine when funds are settled across accounts and institutions. It will also have a bearing on if and when an ACH transaction can be returned by the recipient. The responsibilities and guidelines for participants in the ACH system are determined by the National Automated Clearing House Association, better known as NACHA. NACHA operates as the rule making body for all financial institutions wanting to use the ACH system.
ACH Network

What do I need to do to receive an ACH transaction?

Nothing. Unless an incoming transaction needs to be returned (see Why would an ACH transaction be returned?), no action is required. Synctera will process all debit and credits for any ACH transactions that we receive on behalf of you or your customers. Check your Synctera dashboard to view all ACH transaction that have been sent or received. Synctera also supports webhooks to notify you of all ACH transactions.

How long does it take to process an ACH transaction?

The time it takes for the network to completely process an ACH transaction is dependent on a number of variables. The operating schedule of the federal reserve, the operating schedule of each bank, and the time of day the transaction was created are all key factors in determining when a transaction will settle. “Settle”. Integrators can influence the timing of an ACH transaction by setting the is_same_day field to true when posting a request to send a transaction. However, even when sending “same day” ACH transfers, there are a couple things to keep in mind:
  • Transactions can be returned up to 2 business days after the settlement day. This introduces risk for fintech’s who choose to make funds immediately available to account owner who have initiated a pull request. The ACH system operates on a “no news is good news” basis. The absence of a return within the 2-day timeframe typically means that the RDFI has accepted the transaction.
  • “Same day” ACH is only available within certain transmission windows set by the federal reserve. Take a look at the Fed processing schedule for more information on cut off times. In general, transactions submitted (Mon-Fri) by 4:45pm are eligible to settle on the same day. “Same day” is not available on non-banking days (weekends and holidays) and will automatically default to the next available “banking day”.
  • Submitting incorrect information may cause processing errors that result in delays. Errors may also increase the likelihood of a transaction being returned.

Why would an ACH transaction be returned?

ACH transactions can be returned for a variety of reasons. “Insufficient funds”, “invalid account number”, “account closed” are all fair game but but many of the return reasons are not so obvious. NACHA guidelines specify 85 different codes that may be associated with a returned transaction. The good news is that you and your customers are likely to see only the most common ones. Synctera will take care of processing any returned transaction and notify you of the resolution via webhooks. In the event that a returned transaction requires your immediate attention, you will be able to take action through the Synctera dashboard. The dashboard is also were you can generate returns from received ACH transactions. While most transaction failures such as insufficient funds, invalid account, etc., will result in automatic returns, you may occasionally identify transactions that were not authorized and choose to manually initiate a return.

ACH same day vs non-same day cut-off times

ACH TypeCut-off timeComments
Same day4:45 pm ET (1:45 pm PT) (Monday - Friday)Same day ACH payments with effective date of today submitted before 4:45 pm ET will be processed as ‘same day’ ACH
Non-Same day24:00 pm ET (Monday-Friday)Non same ACH payments with effective date of tomorrow or 2 days in the future submitted before 24:00 will be processed as ‘non-same day’
ACH (Debit/Credit) - External bank to Synctera account
ACH TypeFile processing timeComments
Same day10:30 am ET2:45 pm ET4:45 pm ETACH Batch files with same day payments (debits/credits/returns) directed to Synctera accounts will be processed at these times
Non same day / future dated ACH10:30 am ET2:45 pm ET4:45 pm ET8:00 pm ET *2:15 am ET *ACH Batch files with non-same day payments (debits/credits/returns) directed to the Synctera accounts will be processed at these times
Not all of our sponsor banks support 8:00 pm ET / 2:15 am ET exchange times
ACH Returns - External bank to Synctera account
Return codeDays from original transaction
R01: NSF2 Banking Days
R02: Account closed2 Banking Days
R03: No Account - Account number structure is valid, but doesn’t match individual or Open account2 Banking Days
R04: Invalid Account - Account number structure not valid, ie edit check digit or number failed2 Banking Days
R05: Unauthorized Debit to Consumer Account Using Corporate SEC Code - A Debit entry that uses a corporate SEC code was transmitted to a consumer but was not authorized by the consumer60 Calendar Days
R07: Authorization Revoked - Customer who previously authorized an entry claims, authorization has been revoked from the Originator60 Calendar Days
R08: Payment Stopped: The customer has requested the stop payment of a specific ACH Debit Entry2 Banking Days
R09: Sufficient ledger balance exists, but value of of uncollected items brings available balance below amount of debit entry2 Banking Days
R10: Customer Advises Not Authorized, Improper, Ineligible, Part of Incomplete transaction or Improperly reinitiated - Not authorized, wrong amount, debit date before authorized, incomplete transaction, improper source document or exceeds reinitiating attempt60 Calendar Days
R12: Account sold to another FI2 Banking Days
R16: Account frozen/Entry Returned Per OFAC Instruction - Access to account is restricted due to action by the bank2 Banking Days
R20: Non-transaction Account - Policies and regulations restrict activity to account indicated2 Banking Days
R24: Duplicate Entry - Entry is a duplication. The trace number, date, dollar amount ect.. match another entry2 Banking Days
R29: Corporate Customer Advises Not Authorized2 Banking Days
R31: Permissible Return Entry - Sender bank agreed on behalf of the Originator to accept a return after the deadline for an unauthorized corporate entryUndefined
R37: Source document Presented for Payment - The source document to which an ARC or BOC or POP entry relates has also been presented for payment60 Calendar Days
R38: Stop Payment of Source Document - A Stop Payment has been placed on the source document to which the ARC or BOC Entry relates.60 Calendar Days
R39: Improper Source Document/Source Document presented for payment - The RDFI determines the source document for the ARC, BOC or POP entry is not an eligible item or was presented for payments2 Banking Days
R50: State Law Affecting RCK Acceptance - RDFI is located in a state that has not adopted Revised Article 4 of the UCC or RDFI is located in a state that requires all canceled checks to be returned to the receiver2 Banking Days
R51: Item is Ineligible, Notice Not Provided, Signatures not Genuine, Item Altered or Amount of RCK Not Accurately Obtained from the Item60 Calendar Days

Example: Funding a customer account

To fund a customer account from an external bank account the Synctera API:

curl \
  -X POST \
  -H "Authorization: Bearer $apikey" \
  -H "Content-Type: application/json" \
  https://api.synctera.com/v0/ach \
  --data-binary '
    {
      "risk": {
        "client_ip": "127.0.0.1"
      },
      "customer_id": "{CUSTOMER_ID}",
      "amount": 100,
      "currency": "USD",
      "receiving_account_id": "{EXTERNAL_ACCOUNT_ID}",
      "dc_sign": "debit",
      "originating_account_id": "{ACCOUNT_ID}",
      "reference_info": "Synctera test",
      "memo": "Synctera test"
    }'
It is important to note a few things in this example:
  1. The receiving_account_id always refers to an External Account.
  2. The originating_account_id always refers to to an Account.
  3. The dc_sign is always from the perspective of the receiving account. So a debit to the receiving account results in a credit to the originating account.
  4. The amount is always in the smallest denomination of the given currency. In this case, the currency is USD, which means the amount is in cents.
  5. The customer_id indicates the person that is making the outgoing ACH request. This customer must be an account holder or authorized signer of originating_account_id