ACH Direct Debit
Last updated: December 11, 2024
The Automated Clearing House (ACH) network is an electronic funds transfer system that enables customers in the United States (US) to move money between bank accounts in a fast, secure and paperless way.
Information
To enable ACH payments on your account, contact your Account Manager or [email protected].
Model | Collecting |
---|---|
Payment flow | Direct Debit |
Payment method type | Direct |
Auto-capture payment | |
Authorization | |
Capture | |
Refund | |
Partial refund | |
Multiple refunds | |
Return | |
Recurring payment |
ACH payments follow a three-step process:
To comply with National Automated Clearing House Association (NACHA) rules, you must obtain consent from the bank account owner before you can collect ACH debit payments from their account.
The consent you present to the customer must:
- clearly set out the terms of the authorization
- explicitly state that you are obtaining consent to debit the customer's bank account for a specific transaction, or set of recurring transactions
- explain how the customer can revoke their direct debit authorization
You must also:
- include NACHA-mandated language in the terms and conditions section
- enable your customer to view and print a receipt after the payment has been successfully submitted.
- If you are managing recurring payments, the receipt must have full details of the schedule (payment amount, frequency, start date, end date, and number of payments), along with a confirmation number and date for any transaction processed as part of the schedule
- email a receipt to your customer, with a copy to yourself
- notify your customer in advance of any change to the scheduled payment amount, payment range or payment date
To process ACH payments, you must validate your customer's bank account. For this validation, you must contract directly with one of NACHA's third-party validation service vendors listed on the Account Validation Resource Center.
For ease of integration, we recommend using Plaid Link due to our built-in support for their Balance and Auth APIs.
Plaid Link provides you with instant account validation and eliminates the need to transmit sensitive bank routing and account numbers.
To use Plaid in your account validation process:
- Create a Plaid account.
- Create a sandbox API key on the Keys page and make a note of your Plaid client ID.
- Select Checkout.com on the Plaid Integrations page.
- Call the
/link/token/create
endpoint to create a Link token. - Initialize Link, open a consent window, and obtain a public token.
- Call the
/item/public_token/exchange
endpoint to obtain an access token. - Call the
/processor/token/create
endpoint to obtain a Checkout.com processor token. You submit this token when you request a payment using our Payments API.
If you are using other validation service, you must perform account validation on your own before processing the ACH payment.
Once the NACHA Account Validation step is complete, you can submit a payment request.
When we receive the request:
- We send a
payment_pending
webhook before processing the request. - We run syntax validation and compliance checks on the payment data. Plaid implementations also include a balance check.
- If all checks are successful, we set the payment status to
pending
and send apayment_capture_pending
webhook. - If unsuccessful, we set the payment status to
declined
and send apayment_declined
webhook, in which case the payment process is complete.
- If all checks are successful, we set the payment status to
- ACH payments submitted before midnight Eastern Time will progress to
captured
status on the following business day before 10:20 AM Eastern Time. Payments will not progress tocaptured
on weekends or banking holidays.
When a payment progresses to captured
status, we'll send a payment_captured
webhook. Note that the ACH network does not provide final confirmation of payment completion. The only indicator of a successful payment is the absence of a return. To minimize exposure to a return, some businesses choose to retain assets for seven to ten calendar days following an ACH payment.
Captured payments are settled according to your standard settlement schedule and appear in your financial reconciliation reports. To expedite ACH network payments, you can request same-day settlement. For more information, see Same Day ACH.
If the recipient bank returns a successfully processed payment, we set the payment status to returned
and send a payment_returned
webhook. Typically, an ACH network or bank return is reported within a few business days; however, the account holder can return a payment for up to 60 days.
Checkout.com supports Same Day ACH, an accelerated ACH settlement at an increased cost. A standard ACH payment typically takes two business days to settle, but in a same-day payment, ACH settles you within one business day.
When setting up ACH payments for your account, configure your settlement service to default to either standard settlement or Same Day ACH. You can override this default setting in specific payment requests by setting processing.service_type
to standard
or sameday
.
Same Day ACH offers no accelerated timing benefits between 4pm and 11:59:59pm ET. Payments submitted during this time window always default to standard settlement regardless of your configuration or request settings.
To comply with regulatory requirements and reduce the likelihood of bank declines or fraud, you must provide the following values within the account_holder object:
- if the
account_holder.type
isindividual
, provide theaccount_holder.first_name
andaccount_holder.last_name
fields - if the
account_holder.type
iscorporate
, provide theaccount_holder.company_name
field
Information
Typically, the bank account holder's name is on file within your database. Otherwise, Plaid implementations can obtain the name through the accounts.owners.names
object in the response from Plaid's /identity/get endpoint.
post
https://api.checkout.com/payments
1{2"source": {3"type": "plaid",4"token": "<PLAID_PROCESSOR_TOKEN>",5"account_holder": {6"type": "individual",7"first_name": "John",8"last_name": "Doe"9}10},11"amount": "6540",12"currency": "USD",13"processing_channel_id": "pc_ovo75iz4hdyudnx6tu74mum3fq"14}
If you receive a 202 Accepted
response with a status field set to Pending
, your request was successful.
1{2"id": "pay_itm5maobcrne5fbbafuu2mw3le",3"status": "Pending",4"_links": {5"self": {6"href": "https://api.sandbox.checkout.com/payments/pay_itm5maobcrne5fbbafuu2mw3le"7}8}9}
post
https://api.checkout.com/payments
Recurring payments with Plaid occasionally require the user to re-authenticate with Plaid Link's update mode.
1{2"source": {3"type": "plaid",4"token": "<PLAID_PROCESSOR_TOKEN>",5"account_holder": {6"type": "individual",7"first_name": "John",8"last_name": "Doe"9}10},11"amount": "6540",12"currency": "USD",13"processing_channel_id": "pc_ovo75iz4hdyudnx6tu74mum3fq"14}
If you receive a 202 Accepted
response with a status field set to Pending
, your request was successful.
1{2"id": "pay_itm5maobcrne5fbbafuu2mw3le",3"status": "Pending",4"_links": {5"self": {6"href": "https://api.sandbox.checkout.com/payments/pay_itm5maobcrne5fbbafuu2mw3le"7}8}9}
For the full API specification, see the API reference.
get
https://api.checkout.com/payments/{payment_id}
1{2"id": "pay_itm5maobcrne5fbbafuu2mw3le",3"status": "Pending",4"reference": "reference_example",5"_links": {6"self": {7"href": "https://api.sandbox.checkout.com/payments/pay_itm5maobcrne5fbbafuu2mw3le"8}9}10}
You can use our Refund API to fully or partially refund a payment. Once refunded, the payment status updates to refunded
, and you receive a payment_refunded
webhook notification.
After the payment status changes to captured
, you can submit a request to process a full or partial refund. After receiving it, we send a payment_refund_pending
webhook but do not change the payment status. If the processor token is revoked before the refund occurs, you may need to re-authenticate the user in Plaid Link's update mode. The flow and timing for refunds are the same as for payments.
After a refund request is successfully sent to the ACH network (within one to three business days), we set the payment status to refunded
or partially_refunded
and send a payment_refunded
webhook.
If you issue a refund, you should notify your customer as soon as possible to prevent them from simultaneously canceling the payment with their bank. If your customer does get credited twice, you must contact them directly to resolve the situation.
If the refund is declined by the ACH network or bank (typically within one to three business days), the payment status is set to payment_refund_declined
.
The ACH network uses Notification of Change (NOC) messages to enable financial institutions to communicate updates and corrections to bank account details. For example, changes in account or routing numbers, or incorrect account types.
The Receiving Depository Financial Institution (RDFI) sends an NOC to the Originating Depository Financial Institution (ODFI) when an ACH entry is outdated or incorrect.
After receiving an NOC, Checkout.com sends you a bank_account_updated
webhook request with the necessary information for you to update your payment instruments. Updating your payment details based on the NOC ensures seamless and uninterrupted transactions.
ACH uses NOC codes to describe the specific nature of the change. Our integration supports the following NOC codes:
ACH NOC code | Description |
---|---|
| Incorrect bank account number |
| Incorrect transit/routing number |
| Incorrect transit/routing number and bank account number |
| Bank account name change |
| Incorrect account type |
| Incorrect bank account number and transit code |
| Incorrect transit/routing number, bank account number, and account type |
For instructions on testing NOC codes, see the Test ACH payments section.
An ACH return indicates that your bank, also known as the Receiving Depository Financial Institution (RDFI), could not collect the funds from your customer's account. A return can happen for various reasons, for example:
- the customer has insufficient funds in their bank account
- the customer’s bank account is closed or frozen
- the customer claims that they do not recognize the purchase and did not authorize it
See ACH returns explained for more information.
You can avoid returns caused by outdated banking information by listening to the bank_account_updated
webhook.
When a return happens, you'll receive a payment_returned
webhook notification.
ACH return codes identify the reason an ACH payment could not be collected from a customer's account. These codes provide additional information about the cause of the issue.
ACH code | Description | API response code |
---|---|---|
| Insufficient funds |
|
| No account or unable to locate account |
|
| Invalid account number | |
| Amount field error |
|
| Account closed |
|
| Improper effective entry date |
|
| Authorization revoked by customer |
|
| Payment stopped or stop payment on item |
|
| Uncollected funds |
|
| Customer advises not authorized |
|
| Customer advises entry not in accordance with the terms of the authorization |
|
| File record edit criteria |
|
| Invalid company identification |
|
| Invalid individual ID number | |
| Duplicate entry |
|
| Addenda error |
|
| Mandatory field error |
|
| Trace number error |
|
| Corporate customer advises not authorized |
|
| Permissible return entry |
|
| RDFI non-settlement |
|
| Return of XCK entry |
|
| Return of improper debit entry |
|
| Return of improper credit entry |
|
| Source document presented for payment |
|
| Stop payment on source document |
|
| Unauthorized debit to consumer account |
|
| Returned per ODFI's request |
|
| Branch sold to another DFI |
|
| Invalid ACH routing number |
|
| Representment payee deceased or unable to continue in that capacity |
|
| Beneficiary of account holder deceased |
|
| Account frozen |
|
| Non-transaction account |
|
| Credit entry refused by receiver |
|
| Routing number or check digit error |
|
| RDFI not participant in check truncation program |
|
| Limited participation DFI |
|
When using ACH, you may receive the following webhooks.
For more details about these webhooks, see Webhook
Webhook | Description |
---|---|
| Sent when a merchant initiates a payment request. |
| Sent when a payment request has been successfully initiated and the payment capture is pending. |
| Sent when a payment request has been rejected. We send this webhook after unsuccessful real-time checks on the payment, including data validation, compliance, and balance availability (Plaid Link only). Typically, around 100 milliseconds after |
| Sent when a payment has been successfully captured. Typically, one to two business days after |
| There was a failure after an initial success scenario. Money will be moved out the merchant's account. Sent if a payment is returned due to an ACH network decline, bank decline or customer dispute. ACH network and bank declines typically occur within a few business days, but customers can dispute for up to 60 days. |
| Occurs when a refund request has successfully initiated. |
| Occurs when a refund is successful. Sent once a refund is sent to the ACH network. Typically, one to three business days after |
| Occurs when a refund is declined. Typically, one to three business days after |
| Sent when the customer's bank account details have changed and must be updated for future payments. This webhook sends two objects:
Use the new bank account details returned in the |
You can send test requests using the values from the following table, depending on which outcome you want to simulate:
API response code | ACH code | Payment status | Webhook | Values |
---|---|---|---|---|
| N/A |
|
| Corporate and personal accounts:
|
| N/A |
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate and personal accounts:
|
|
|
|
| Corporate and personal accounts:
|
|
|
|
| Corporate and personal accounts:
|
|
|
|
| Corporate and personal accounts:
|
|
|
|
| Corporate and personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|
|
|
|
| Corporate accounts:
Personal accounts:
|