Please refer Server Side Implementation for details on existing Server Support.
ACH Direct Debit is a payment method that runs on the ACH (Automated Clearing House) network in the United States. It allows customers to pay for transactions by debiting directly from their bank account, as opposed to processing through a card brand.
At a high level, accepting ACH payments consists of four concepts:
Depending on how you wish to verify your customer's bank account, these concepts will overlap in different ways.
Tokenizing is the process of exchanging raw payment information for a secure, one-time-use token called a payment method nonce. For our ACH integration, there are two ways to tokenize:
Tokenizing without verification
You can tokenize a bank account by collecting a customer's bank details, including account and routing numbers. However, this will not verify the bank account, and the resulting nonce will not be transactable. Before you can create a transaction, you will need to use the nonce to vault the bank account and successfully verify it.
Vaulting is the process of exchanging a one-time-use payment method nonce for a peristent payment method token. For our ACH integration, vaulting includes verification options:
When vaulting a bank account, you can choose to specify a verification method. This creates a vaulted payment method and initiates a verification in a single step. If the verification fails, you can keep retrying verifications on the same payment method. A vaulted payment method will only be transactable once it has had a successful verification.
You can also vault a bank account without specifying a verification method. This will vault the payment method as usual, but no verification will be attempted. As stated above, this payment method will not be transactable until it has a subsequent successful verification.
Braintree’s ACH Direct Debit integration offers several methods for verifying that the customer owns the bank account they provide to you for payment:
You can use any combination of these methods in order to meet your business needs. For example, one recommended flow is to use network check as an initial verification method with micro-transfers as a backup option.
Note: ACH payment method and US bank account are used interchangably in this document.
To tokenize an US bank account, you should use tokenizeUsBankAccount mutation.
For input you would provide the bank account details in usBankAccount.
Request body
Inputs
Response
Note: The resulting token that represents the bank account can be found in data.tokenizeUsBankAccount.paymentMethod.id. In example above, it's the string with "tokenusbankacct_" prefix.
To vault an ACH payment method, you should use vaultUsBankAccount mutation.
For input you would provide at least a single-use ACH paymentMethod. Optionally, you can also provide a verificationMethod which specifies the way in which you want the given bank account verified.
Request body
Inputs
Response
If you prefers to perform verification on your own, the verificationMethod should be set as INDEPENDENT_CHECK.
To verify an US bank account, you should use verifyUsBankAccount mutation.
For input you would provide at the minimum paymentMethodId and verificationMethod.
Request body
Inputs
Response
To check for successful verification, you should examine verifyUsBankAccount.verification.processorResponse.message and look for "Approved". If verification has failed, some other message is returned, such as "Processor Network Unavailable - Try Again".
To verify an US bank account using micro-deposit random, small amounts of your choice, you should first use confirmMicroTransferAmounts mutation to do the first step.
For input you would provide at the minimum verificationId which is vaultUsBankAccount.verification.id (in the response of vaultUsBankAccount mutation) and amountInCents which is an array of integers. For instance, to specify 17 cents and 44 cents, you would provide [17, 44].
Request body
Inputs
Response
To check for successful verification, you should examine verifyUsBankAccount.verification.processorResponse.message and look for "Approved". If verification has failed, some other message is returned, such as "Processor Network Unavailable - Try Again".
Sometimes verification would fail. You can retry verification by sending the the previous request again or use the previous request but change the verificationMethod. Say, previously, NETWORK_CHECK was used and failed with message "No Data Found - Try Another Verification Method", on a retry, you should change it to MICRO_TRANSFERS as an alternative.
Note that each tokenized US bank account can only be vaulted once. If you attempt to vault the same token more than once, you will get the following error.
If you do not provide verificationMethod in the inputs, you will get the following error.