When accepting ACH Direct Debit payments, Nacha requires you to validate the bank account details for consumer accounts (SEC code WEB) on the shopper's first transaction. This validation is mandatory to reduce fraud and minimize payment failures. To help you meet this requirement, we partner with giact gVERIFY.
Using giact gVERIFY allows you to verify the validity and status of a shopper's bank account before initiating a transaction. This verification reduces the chance that payments are returned because of issues such as incorrect routing numbers or closed accounts. Giact checks account information against an extensive proprietary database and static rules, not through real-time access to the bank.
Requirements
| Requirement | Description |
|---|---|
| Integration type | An online-payments integration. |
| Limitations | For cost reasons, we recommend using giact validation only on the shopper's initial transaction, and when the shopper changes their account. |
| Setup steps | Before you begin:
|
Select a validation option
Adyen offers three integration options to trigger the giact validation service, allowing you to comply with Nacha requirements and manage validation costs according to your business model. The configuration is managed on your Adyen account, and you can only select one option. Ask our Support Team to configure the option you need on your account.
Validation options
| Validation option | Which payments trigger validation? | Use case |
|---|---|---|
| Consumer ecommerce payments | ACH Direct Debit payments with shopperInteraction ecommerce and SEC code WEB. |
Validate consumer accounts on their first payment, as per Nacha requirements. |
| All ecommerce payments | All ACH Direct Debit payments with shopperInteraction ecommerce (any SEC code). |
Validate both consumer and corporate accounts on their first payment. |
| Zero amount payments | All ACH Direct Debit payments with amount.value 0, regardless of shopperInteraction or SEC code. |
Specify exactly when to trigger a call to giact. Only available for API-only integrations. |
If you have a Components or Drop-in integration, we recommend the consumer ecommerce payments option because it covers Nacha requirements and is the easiest to use.
If you have an API-only integration, you can use any of the validation options.
Consumer ecommerce payments validation
For Drop-in or Components integrations
- The shopper selects ACH Direct Debit on the checkout page.
- The Drop-in or the Component collects the required details (the bank account number, ACH routing number, and account owner's name) from the shopper. Keep the
hasHolderNameandholderNameRequiredconfiguration parameters set to true. If you change these to false, you will have to collect the account owner's name manually. - If this is the shopper's first payment, the
shopperInteractionis ecommerce, and the SEC code is WEB, we automatically send the account details to giact gVERIFY for validation. - If the account passes validation, we try to process the payment. If the account fails validation, we refuse the payment.
- If the payment is refused, we show a refusal screen. The shopper can either use a different bank account for the ACH payment, or they can use a different payment method.
For API-only integrations
- The shopper selects ACH Direct Debit on your payment form.
- You collect the required details from the shopper as a part of your payment request. To do this, add the required parameters. You need to collect the following details:
- Bank account number
- ACH routing number
- Account owner's name
- If this is the shopper's first payment and the
shopperInteractionis ecommerce, and the SEC code is WEB, we automatically send the account details to giact gVERIFY for validation. - If the account passes validation, we try to process the payment. If the account fails validation, we refuse the payment.
- If the payment is refused, you get a refusal response from the API. The shopper can either use a different bank account for the ACH payment, or they can use a different payment method.
All ecommerce payments validation
For Drop-in or Components integrations
- The shopper selects ACH Direct Debit on the checkout page.
- The Drop-in or the Component collects the required details (the bank account number, ACH routing number, and account owner's name) from the shopper. Keep the
hasHolderNameandholderNameRequiredconfiguration parameters set to true. If you set these to false, you will have to collect the account owner's name manually. - If this is the shopper's first payment and the
shopperInteractionis ecommerce, we automatically send the account details to giact gVERIFY for validation. - If the account passes validation, we try to process the payment. If the account fails validation, we refuse the payment.
- If the payment is refused, we display a refusal screen. The shopper can either use a different bank account for the ACH payment, or they can use a different payment method.
For API-only integrations
- The shopper selects ACH Direct Debit on your payment form.
- You collect the required details from the shopper as a part of your payment request. To do this, add the required parameters. You need to collect the following details:
- Bank account number
- ACH routing number
- Account owner's name
- If this is the shopper's first payment, the
shopperInteractionis ecommerce, we automatically send the account details to giact gVERIFY for validation. - If the account passes validation, we try to process the payment. If the account fails validation, we refuse the payment.
- If the payment is refused, you get a refusal response from the API. The shopper can either use a different bank account for the ACH payment, or they can use a different payment method.
Zero amount payments validation
- The shopper selects ACH Direct Debit on your payment form.
- You collect the required details from the shopper as a part of your payment request. To do this, add the required parameters. You need to collect the following details:
- Bank account number
- ACH routing number
Alert your shoppers that some banks have different routing numbers for different transfers. Shoppers should not provide their wire transfer routing number.
- Bank account type: checking or savings.
The account type is not verified by giact. But if you use the Advanced flow (the
/paymentsendpoint) you need to specify the account type when you make a payment request for the actual amount. This avoids unnecessary chargebacks due to account type mismatches. - Account owner's name
- ACH routing number
- Bank account number
- You send a [zero-value authorization] (#validate-using-zero-value-authorization) request with the details that the shopper provided. Include the
storePaymentMethodandstorePaymentMethodModeparameters so you can store the shopper's details as a token to use later when you make the payment request for the actual amount. - We send the details to giact gVERIFY and return the outcome in the zero-value authorization response and in the AUTHORISATION webhook.
- Based on the zero-value authorization response, you decide on your next step. You can either:
- Make a payment request for the actual amount. Specify the token (
storedPaymentMethodId) that was generated when you made the zero-auth request. - Ask the shopper to provide correct details or use a different payment method.
- Make a payment request for the actual amount. Specify the token (
Validate using zero-value authorization
If you selected the zero amount payments option, you need to make a zero-value authorization request. After you have gathered the shopper's account details, verify those details.
Select the tab for the endpoint you are using:
Validation result values
In the authorization response, the additionalData.bankVerificationResultRaw parameter can include the following information.
| Code | Description |
|---|---|
| 1111 | Account Verified - The checking account was found to be an open and valid account. |
| 2222 | AMEX Cheque - The checking account was found to be an open and valid American Express account. |
| 3333 | Non-Participant Provider - This account was reported with acceptable, positive data found in recent or current transactions. |
| 5555 | Savings Account Verified - The savings account was found to be an open and valid account. |
| 7777 | Account Verified - The checking account was found to be open and have a positive history. |
| 8888 | Savings Account Verified - The savings account was found to be open and have a positive history. |
| 9999 | This account was reported with acceptable, positive data found in recent transactions. Positive history exists for multiple transactions. |
| GN01 | Negative information was found. |
| GN05 | The routing number supplied is reported as not assigned to a financial institution. |
| GP01 | The value for Details will vary depending on the Value for CheckReject reason in the Private Bad Checks List. |
| GS01 | The routing number supplied did not match the format of a valid routing number. |
| GS02 | The account number supplied did not match the format of a valid account number. |
| GS03 | The check number supplied did not match the format of a valid check number. |
| GS04 | The amount supplied did not match the format of a valid amount. |
| ND00 | No positive or negative information has been reported on the account. This could be a small or regional bank that does not report. |
| ND01 | No positive or negative information has been reported on the account. This routing number can only be valid for US Government financial institutions. Please verify this item with its issuing authority. |
| RT00 | The routing number appears to be accurate however no positive or negative information has been reported on the account. Please contact customer to ensure that the correct account information was entered. |
| RT01 | This account should be returned based on the risk factor being reported. |
| RT02 | This account should be returned based on the risk factor being reported. |
| RT03 | Current negative data exists on this account. Accept transaction with risk. (Example: Checking or Savings account in NSF status, recent returns, or outstanding items) |
| RT04 | This is a Non Demand Deposit Account (post no debits), Credit Card Cheque, Line of Credit, Home Equity, or a Brokerage check. |
| RT05 | Current negative data exists on this account. Accept transaction with risk. (Example: Checking or Savings account in NSF status, recent returns, or outstanding items) |
Test and go live
To test your giact account validation integration, you can use specific mock account numbers in our test environment. These details simulate various validation outcomes, allowing you to confirm that your integration correctly handles both successful and unsuccessful scenarios before going live. You can enter these test account numbers directly into the payment details fields when using a Drop-in or Components integration, or include them in the API request body.
The following table lists the specific test account numbers and the corresponding giact status codes they trigger. Use the routing number 122105278 across all test scenarios.
| Code | Bank Account Number | Bank Verification Result |
|---|---|---|
| 1111 | 0000000016 | Passed |
| 3333 | 0000000018 | Passed |
| 5555 | 0000000019 | Passed |
| ND00 | 0000000008 | Passed |
| RT00 | 0000000010 | Passed |
| RT03 | 0000000013 | Passed |
| GN01 | 0000000001 | Passed |
| GS02 | 0000000005 | Failed |
| RT01 | 0000000011 | Failed |
| RT02 | 0000000012 | Failed |
| RT04 | 0000000014 | Failed |