Bank Account Validation
In order to ensure the highest possible payment success rates, Check will run a correctness check (also known as ‘validation’ in our API). This applies to Company bank accounts as well as Employee and Contractor bank accounts.
Removing bank account verifications
As of 9/21/23, Check no longer requires company bank accounts to have their ownership verified, rendering some bank account disabled reasons irrelevant.
How validations work
There are two ways a Company, Employee, or Contractor can connect their bank accounts to Check:
- by using Plaid — this is called a plaid_bank_account
- by providing routing and account numbers — this is called a raw_bank_account
Plaid bank accounts
When connecting a plaid_bank_account
, accounts are automatically validated by Plaid — this is the most seamless way of connecting a bank account.
Raw bank accounts
Check automatically validates all raw_bank_account
s as soon as they are created. This is done by initiating a $0 ACH payment to the raw_bank_account
. These $0 ACH payments are not visible to the account holder. If the payment fails (typically within 2 banking days), the validation check fails and the raw_bank_account
is disabled. Check assumes that the account is valid unless this $0 transaction fails.
Recovering from failed validations
Bank account validation failures happen when incorrect bank account information is provided. When bank account validation fails, the bank account is moved to a disabled_irrecoverable
state and any attempt to move money in or out of the account will result in the payment being rejected by the bank.
In order to recover from this, the account must be replaced with a new bank account your user provides. This new bank account will be validated as soon as it is created in our systems.
Validations in the API
The status
and disabled_reason
fields in the bank_account object and bank_account webhook can be used to determine the validation state of a bank account.
Bank accounts can be used to process payroll as long as they are not in a disabled
state. This means that
- Bank accounts cannot be used in payroll if status is
disabled_recoverable
ordisabled_irrecoverable
- Bank accounts can be used for payroll if status is
validation_pending
,validated
orownership_verified
Employee bank accounts
Employee bank accounts start off in a validation_pending
state and can move to validated
if validation is successful or disabled_irrecoverable
if validation fails.
Company bank accounts
Company bank accounts start off in a disabled_recoverable
state, then move to a validation_pending
state. The bank account will move to an ownership_verified
state if validation succeeds or disabled_irrecoverable
if validation fails.
Failure reasons
When bank accounts are disabled, you can tell your users the reason the account is disabled by looking at the value of the disabled_reason
parameter. Possible values here include:
validation_failed
: the bank account failed our validation process and a new bank account must be providedfailed_payment
: an attempted payment to this bank account has failed and a new bank account must be provided
Documentation around the values these fields can contain can be seen in our API reference here.
Testing in Sandbox
In sandbox, company bank accounts are automatically set to ownership_verified
and employee bank accounts are automatically set to validated
. You can test different statuses by:
- Setting the routing number to
000000000
:- If it is a company bank account it stays in a
disabled_recoverable
status withverification_pending
as the reason. - If it is an employee bank account it stays in a
disabled_irrecoverable
status withvalidation_failed
as the reason.
- If it is a company bank account it stays in a
- Setting the routing number to
111111111
:- If it is a company bank account it goes into a
disabled_irrecoverable
status withvalidation_failed
as the reason. - The same thing goes for employee bank accounts.
- If it is a company bank account it goes into a
- Setting the routing number to any other value in the correct 9-digit format, will automatically set the accounts to either
ownership_verified
orvalidated
depending on whether they are a company's or an employee's account.
Updated about 1 year ago