{"title":"Account validation with Plaid","category":"default","creationDate":1779796135,"content":"<p>When accepting ACH Direct Debit payments, <a href=\"https:\/\/www.nacha.org\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Nacha<\/a> requires you to validate that the shopper's bank account details are correct, if it is a consumer account. To make this validation easier for you, we have partnered with <strong>Plaid<\/strong>. Plaid collects the shopper's permission to connect their account to Plaid, and verifies the account details directly with the shopper's bank.<\/p>\n<p>Benefits:<\/p>\n<ul>\n<li>Smooth shopper experience. Shoppers link their account using Plaid Link. Shoppers do not need to search for their account number and routing number.<\/li>\n<li>You send us the shopper's Plaid processor token instead of having to deal with sensitive account details.<\/li>\n<li>Plaid collects the shopper's permission to store their details and check their account balance.<\/li>\n<li>Real-time balance check. This reduces the chance that transactions are reversed because of insufficient funds. It can also save shoppers having to pay overdraft fees or non-sufficient funds fees.<\/li>\n<\/ul>\n<p>If you do not want to validate the account with Plaid, you need to collect the shopper's bank account number, bank routing number, and account holder name, and pass these details in the payment request.<\/p>\n<h2 id=\"before-you-begin\">Requirements<\/h2>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Requirement<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><strong>Integration type<\/strong><\/td>\n<td style=\"text-align: left;\">Make sure that you have built an <a href=\"\/online-payments\/build-your-integration\/advanced-flow\/?platform=Web\">Advanced flow<\/a> Web Drop-in, Web Components, or API-only integration. <\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Limitations<\/strong><\/td>\n<td style=\"text-align: left;\">Depending on their bank, shoppers may need to re-authenticate with Plaid after a number of months. The token itself doesn't change, but you need to re-initialize it. <br> You cannot use account validation with Plaid if your integration uses the <code>\/sessions<\/code> endpoint.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><strong>Setup steps<\/strong><\/td>\n<td style=\"text-align: left;\">Before you begin: <ol><li>Reach out to your Adyen contact to configure your Adyen account for collaboration with Plaid.<\/li> <li><a href=\"\/payment-methods\/add-payment-methods\">Add ACH Direct Debit in your Customer Area<\/a>.<\/li> <li><a href=\"https:\/\/dashboard.plaid.com\/signup\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Create an account with Plaid<\/a>, and complete an <a href=\"https:\/\/dashboard.plaid.com\/team\/application\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">application profile<\/a> and a <a href=\"https:\/\/dashboard.plaid.com\/team\/company\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">company profile<\/a>. Plaid will give you a <code>client_id<\/code> and a <code>secret<\/code> to make API calls to Plaid.<\/li><\/ol><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>How it works<\/h2>\n<ol>\n<li>The shopper selects ACH Direct Debit on your payment form.<\/li>\n<li>You check if the shopper has already connected their account with Plaid.<\/li>\n<li>If the shopper's account isn't connected to Plaid yet:\n<ul>\n<li>You direct the shopper to Plaid Link.<\/li>\n<li>You make a series of API requests to Plaid to get the shopper's Plaid processor token.<\/li>\n<\/ul><\/li>\n<li>You make a payment with the shopper's Plaid processor token and optionally include parameters to check the customer's account balance. We use the shopper's Plaid processor token to validate their account details with Plaid.<\/li>\n<\/ol>\n<p>The following diagram illustrates this flow.<\/p>\n<p><img alt=\"\" src=\"\/user\/pages\/docs\/08.payment-methods\/05.ach-direct-debit\/verification-with-plaid\/ach-with-plaid-flow.svg?decoding=auto&amp;fetchpriority=auto\" \/><\/p>\n<p>For more insights, see Plaid's documentation on the <a href=\"https:\/\/plaid.com\/docs\/auth\/partnerships\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid - Adyen partnership<\/a>.<\/p>\n<h2>Check the shopper's processor token<\/h2>\n<p>It is possible that with a previous payment to you, the shopper connected their account to Plaid and you saved their Plaid processor token. If you do not have the shopper's Plaid processor token, you need to direct the shopper to the Plaid Link app and get their token.<\/p>\n<p>Proceed as follows:<\/p>\n<ol>\n<li>\n<p>In your POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/paymentMethods\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/paymentMethods<\/a> request, make sure to use:<\/p>\n<ul>\n<li><code>currency<\/code>: set to <span translate=\"no\"><strong>USD<\/strong><\/span>.<\/li>\n<li><code>countryCode<\/code>: set to <span translate=\"no\"><strong>US<\/strong><\/span>.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>When the shopper selects <strong>ACH Direct Debit<\/strong>, on your payment form collect:<\/p>\n<ul>\n<li>The account owner's name.<\/li>\n<li>The shopper's billing address (optional).<\/li>\n<li>Any other details to be able to look up this shopper in your database.<\/li>\n<\/ul>\n<\/li>\n<li>\n<p>Based on the provided details, look up the shopper in your database and check if you have their Plaid processor token.<\/p>\n<\/li>\n<li>\n<p>If you have the shopper's Plaid processor token, proceed to <a href=\"#make-a-payment\">make a payment<\/a>.<\/p>\n<\/li>\n<li>\n<p>If you do not have the shopper's Plaid processor token, get it from Plaid:<\/p>\n<ol>\n<li>\n<p>Make a series of requests to Plaid from your backend:<\/p>\n<ul>\n<li>A POST <a href=\"https:\/\/plaid.com\/docs\/api\/link\/#linktokencreate\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>\/link\/token\/create<\/code>\n<\/a> request to initialize the Plaid Link app and get a <code>public_token<\/code>.<\/li>\n<li>A POST <a href=\"https:\/\/plaid.com\/docs\/api\/items\/#itempublic_tokenexchange\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>\/item\/public_token\/exchange<\/code>\n<\/a> request with the <code>public_token<\/code> to get an <code>access_token<\/code>.<\/li>\n<li>A POST <a href=\"https:\/\/plaid.com\/docs\/api\/processors\/#processortokencreate\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">\n  <code>\/processor\/token\/create<\/code>\n<\/a> request with the <code>access_token<\/code> to get the shopper's <code>processor_token<\/code>.<\/li>\n<\/ul>\n<div class=\"notices green\">\n<p>For the details, see <a href=\"https:\/\/plaid.com\/docs\/auth\/partnerships\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid's instructions for Adyen integrations<\/a>.<\/p>\n<\/div>\n<\/li>\n<li>\n<p>Save the shopper's processor token, and proceed to <a href=\"#make-a-payment\">make a payment<\/a>.<\/p>\n<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<h2>Make a payment<\/h2>\n<p>The <strong>ACH Direct Debit<\/strong> payment request must include the shopper's Plaid processor token. Optionally you can add parameters to check if the account balance meets specific conditions before trying an authorization.<\/p>\n<div class=\"notices green\">\n<p>You can also <a href=\"\/online-payments\/tokenization\">tokenize<\/a> the transaction for future recurring payments.<\/p>\n<\/div>\n<p>Proceed as follows:<\/p>\n<ol>\n<li>\n<p>From your server, make a POST  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/payments\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/payments<\/a> request.<\/p>\n<p>Specify the following parameters:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Required<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>paymentMethod.type<\/code><\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">Set to <strong>ach<\/strong>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>paymentMethod.ownerName<\/code><\/td>\n<td style=\"text-align: left;\"><img title=\"-white_check_mark-\" alt=\"-white_check_mark-\" class=\"smileys\" src=\"\/user\/data\/smileys\/emoji\/white_check_mark.png\" \/><\/td>\n<td style=\"text-align: left;\">The account holder name that you collected on your payment form when the shopper selected ACH Direct Debit.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>billingAddress<\/code><\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The account owner's address information.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>additionalData<\/code><\/td>\n<td style=\"text-align: left;\"><\/td>\n<td style=\"text-align: left;\">The shopper's Plaid processor token and any balance check parameters you want to use.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>These are the Plaid parameters you can use in <code>additionalData<\/code>:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>plaid.processorToken<\/code><\/td>\n<td style=\"text-align: left;\">The shopper's Plaid processor token that you received from Plaid and stored in your database. <br> <em>Required for validation with Plaid.<\/em><\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>plaid.balanceCheck<\/code><\/td>\n<td style=\"text-align: left;\">A string value set to <span translate=\"no\"><strong>true<\/strong><\/span> if you want us to check the account balance.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>plaid.minimumAmount<\/code><\/td>\n<td style=\"text-align: left;\">A string value indicating the minimum amount available on the account, in <a href=\"\/development-resources\/currency-codes\">minor units<\/a>. Use only with <code>plaid.balanceCheck<\/code> set to <span translate=\"no\"><strong>true<\/strong><\/span>. <br><br> For example, if the balance must be USD&nbsp;10 or more, specify <strong>1000<\/strong>. You can also use this in combination with <code>plaid.balanceMultiplier<\/code>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>plaid.balanceMultiplier<\/code><\/td>\n<td style=\"text-align: left;\">A string value indicating the condition that the account balance must at least be X times the payment amount. <br><br>If <code>plaid.minimumAmount<\/code> is specified, indicates the condition that the account balance must at least be X times the specified minimum amount. For example, if the balance must be at least 2.5 times USD&nbsp;10, set <code>plaid.balanceMultiplier<\/code> to <strong>2.5<\/strong> and set <code>plaid.minimumAmount<\/code> to <strong>1000<\/strong>.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'ACH Direct Debit payment with Plaid validation'\" :id=\"''\" :code-data=\"[{&quot;language&quot;:&quot;json&quot;,&quot;tabTitle&quot;:&quot;&quot;,&quot;content&quot;:&quot;curl https:\\\/\\\/checkout-test.adyen.com\\\/v72\\\/payments \\\\\\n-H 'x-api-key: ADYEN_API_KEY' \\\\\\n-H 'content-type: application\\\/json' \\\\\\n-X POST \\\\\\n-d '{\\n   \\&quot;merchantAccount\\&quot;:\\&quot;YOUR_MERCHANT_ACCOUNT\\&quot;,\\n   \\&quot;amount\\&quot;:{\\n      \\&quot;currency\\&quot;:\\&quot;USD\\&quot;,\\n      \\&quot;value\\&quot;:\\&quot;12000\\&quot;\\n   },\\n   \\&quot;paymentMethod\\&quot;:{\\n      \\&quot;type\\&quot;:\\&quot;ach\\&quot;,\\n      \\&quot;ownerName\\&quot;:\\&quot;ACCOUNT_HOLDER_NAME\\&quot;\\n   },\\n   \\&quot;reference\\&quot;:\\&quot;YOUR_ORDER_NUMBER\\&quot;,\\n   \\&quot;additionalData\\&quot;:{\\n      \\&quot;plaid.processorToken\\&quot;:\\&quot;processor-development-ef6a7fe3-5984-4437-994b-41e565197426\\&quot;,\\n      \\&quot;plaid.balanceCheck\\&quot;:\\&quot;true\\&quot;,\\n      \\&quot;plaid.balanceMinimumAmount\\&quot;:\\&quot;10000\\&quot;,\\n      \\&quot;plaid.balanceMultiplier\\&quot;:\\&quot;2.5\\&quot;\\n   },\\n   \\&quot;billingAddress\\&quot;:{\\n      \\&quot;houseNumberOrName\\&quot;:\\&quot;50\\&quot;,\\n      \\&quot;street\\&quot;:\\&quot;Test Street\\&quot;,\\n      \\&quot;city\\&quot;:\\&quot;Amsterdam\\&quot;,\\n      \\&quot;stateOrProvince\\&quot;:\\&quot;NY\\&quot;,\\n      \\&quot;postalCode\\&quot;:\\&quot;12010\\&quot;,\\n      \\&quot;country\\&quot;:\\&quot;US\\&quot;\\n   }\\n}'&quot;}]\" :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<\/li>\n<li>\n<p>Check the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/payments\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/payments<\/a> response.<\/p>\n<p>The <code>additionalData<\/code> object contains the validation result:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>achdirectdebit.dateOfSignature<\/code><\/td>\n<td style=\"text-align: left;\">The date that the shopper gave permission to collect direct debit payments from their account.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>achdirectdebit.mandateId<\/code><\/td>\n<td style=\"text-align: left;\">The identification of the shopper's permission to collect direct debit payments from their account. This ID is the same as the PSP reference of the payment.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>achdirectdebit.sequenceType<\/code><\/td>\n<td style=\"text-align: left;\">Indicates if the direct debit payments are recurring. Possible values: <span translate=\"no\"><strong>OneOff<\/strong><\/span>, <span translate=\"no\"><strong>First<\/strong><\/span>.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>availableBalanceValue<\/code><\/td>\n<td style=\"text-align: left;\">The account balance. Only included if the request has <code>plaid.balanceCheck<\/code> <span translate=\"no\"><strong>true<\/strong><\/span>. Note that the balance is <em>not<\/em> in minor units.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>bankSummary<\/code><\/td>\n<td style=\"text-align: left;\">The last four digits of the shopper's bank account.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>bankVerificationResult<\/code><\/td>\n<td style=\"text-align: left;\">The result of the account validation and balance checks: <span translate=\"no\"><strong>Passed<\/strong><\/span>. If the validation fails, you receive an <a href=\"#plaid-errors\">error<\/a> message.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>bankVerificationResultRaw<\/code><\/td>\n<td style=\"text-align: left;\">The details of the account validation result. For example: <br> <em>Passed: Available Balance greater than threshold<\/em> if you asked for a balance check with conditions. <br> <em>Passed: Routing number and Account number successfully retrieved<\/em> if you didn't ask for a balance check.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>plaidProcessorToken<\/code><\/td>\n<td style=\"text-align: left;\">The shopper's Plaid processor token passed in the request.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Other parameters in the response include:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Parameter<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><code>pspReference<\/code><\/td>\n<td style=\"text-align: left;\">Our unique reference for the payment.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><code>resultCode<\/code><\/td>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Authorised<\/strong><\/span>. This means that the payment has been successfully received by Adyen. However, it may take up to 5 business days to know whether the payment was authorized by the bank.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<div data-component-wrapper=\"code-sample\">\n<code-sample :title=\"'Response with Plaid validation details'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"additionalData\\\": {\\n        \\\"achdirectdebit.dateOfSignature\\\": \\\"2023-02-22\\\",\\n        \\\"achdirectdebit.mandateId\\\": \\\"P27P5Q9LM7MKDM92\\\",\\n        \\\"achdirectdebit.sequenceType\\\": \\\"OneOff\\\",\\n        \\\"availableBalanceValue\\\": \\\"300.0\\\",\\n        \\\"bankSummary\\\": \\\"0000\\\",\\n        \\\"bankVerificationResult\\\": \\\"Passed\\\",\\n        \\\"bankVerificationResultRaw\\\": \\\"Passed: Available Balance greater than threshold\\\",\\n        \\\"plaidProcessorToken\\\": \\\"processor-development-ef6a7fe3-5984-4437-994b-41e565197426\\\",\\n    },\\n    \\\"pspReference\\\": \\\"P27P5Q9LM7MKDM92\\\",\\n    \\\"resultCode\\\": \\\"Authorised\\\",\\n    \\\"amount\\\": {\\n        \\\"currency\\\": \\\"USD\\\",\\n        \\\"value\\\": 12000\\n    },\\n    \\\"merchantReference\\\": \\\"b3d74f31-67a2-4aa6-9b1c-d6980499985f\\\",\\n    \\\"paymentMethod\\\": {\\n        \\\"type\\\": \\\"ach\\\"\\n    }\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>If you do not get an <span translate=\"no\"><strong>Authorised<\/strong><\/span> response, refer to <a href=\"#plaid-errors\">Handle Plaid validation errors<\/a>.<\/p>\n<\/li>\n<\/ol>\n<p>The payment is sent to the bank. If the payment is successful, it will appear in the <a href=\"\/reporting\/settlement-detail-report\">Settlement details report<\/a>. If it fails, you will receive a <a href=\"#chargebacks\">CHARGEBACK<\/a> webhook.<\/p>\n<h3 id=\"plaid-errors\">Handle Plaid validation errors<\/h3>\n<p>If the Plaid validation failed, you get an error response like the following example.<\/p>\n<div data-component-wrapper=\"code-sample\">\n    <code-sample :title=\"'Example Plaid validation error'\" :id=\"''\" :code-data='[{\"language\":\"json\",\"tabTitle\":\"\",\"content\":\"{\\n    \\\"status\\\": 422,\\n    \\\"errorCode\\\": \\\"32_003\\\",\\n    \\\"message\\\": \\\"Please have customer reauthenticate with Plaid\\\",\\n    \\\"errorType\\\": \\\"validation\\\",\\n    \\\"pspReference\\\": \\\"QTSXQ59LM7MKDM92\\\"\\n}\"}]' :enable-copy-link-to-code-block=\"true\" :code-sample-card-size=\"'fullsize'\"><\/code-sample>\n<\/div>\n<p>Make sure that your integration can handle the following validation error responses:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">Error<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\">51_001 - Plaid service is currently unavailable<\/td>\n<td style=\"text-align: left;\">Try again later.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">51_002 - Unknown error for Plaid<\/td>\n<td style=\"text-align: left;\">Try again later.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">51_003 - Let the customer re-authenticate with Plaid<\/td>\n<td style=\"text-align: left;\">The shopper's Plaid processor token needs to be re-initialized. Direct the shopper to the <a href=\"https:\/\/plaid.com\/docs\/link\/update-mode\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid Link update mode<\/a>. The token itself doesn't change.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">51_004 - No valid checking or savings accounts for which account and routing numbers could be retrieved<\/td>\n<td style=\"text-align: left;\">Ask the shopper to try another account or bank.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">51_005 - Plaid internal error<\/td>\n<td style=\"text-align: left;\">Plaid was unable to process the request. Possible causes: <ul><li>An issue in the response from the bank.<\/li> <li>An issue with the shopper's consent to sharing data with Plaid. Some banks require the shopper to confirm they gave their consent to Plaid. Ask the shopper to try again later.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\">51_006 - Plaid rate limit exceeded. Please try again later<\/td>\n<td style=\"text-align: left;\">Too many requests were made in a short period of time. Possible causes: <ul><li>You used Plaid Sandbox credentials in the Plaid Developer or Production environment.<\/li> <li>The shopper entered their credentials incorrectly too many times. Ask the shopper to try again in one or two days.<\/li><\/ul><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2 id=\"present-the-payment-result\">Present the payment result<\/h2>\n<p>Use the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/payments#responses-200-resultCode\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">resultCode<\/a> that you received in the  <a href=\"https:\/\/docs.adyen.com\/api-explorer\/Checkout\/latest\/post\/payments\" class=\"codeLabel  external-link no-image\" target=\"_blank\" rel=\"nofollow noopener noreferrer\">\/payments<\/a> response to present the payment result to your shopper. <\/p>\n<p>The <code>resultCode<\/code> values you can receive for ACH Direct Debit are:<\/p>\n<table>\n<thead>\n<tr>\n<th style=\"text-align: left;\">resultCode<\/th>\n<th style=\"text-align: left;\">Description<\/th>\n<th style=\"text-align: left;\">Action to take<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Authorised<\/strong><\/span><\/td>\n<td style=\"text-align: left;\">The payment has been successfully received by Adyen. <br> It may take up to 5 business days to know whether the payment was authorized by the bank. If the payment is successful, it will appear in the <a href=\"\/reporting\/settlement-detail-report\">Settlement Detail Report<\/a>. If it fails, you will receive a <a href=\"#chargebacks\">CHARGEBACK<\/a> webhook.<\/td>\n<td style=\"text-align: left;\">Inform the shopper that the payment was successful.<\/td>\n<\/tr>\n<tr>\n<td style=\"text-align: left;\"><span translate=\"no\"><strong>Refused<\/strong><\/span><\/td>\n<td style=\"text-align: left;\">The payment was refused.<\/td>\n<td style=\"text-align: left;\">Ask the shopper to try the payment again using a different payment method.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Test and go live<\/h2>\n<p>To test the connection with Plaid, use the <a href=\"https:\/\/plaid.com\/docs\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid sandbox<\/a>. Optionally use the <a href=\"https:\/\/github.com\/plaid\/sandbox-custom-users\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid GitHub repo<\/a> to test specific scenarios.<\/p>\n<p>Before you go live, create a Plaid developer account and run tests in the <a href=\"https:\/\/plaid.com\/docs\/\" target=\"_blank\" rel=\"nofollow noopener noreferrer\" class=\"external-link no-image\">Plaid Developer environment<\/a>.<\/p>\n<h2>See also<\/h2>\n<div class=\"see-also-links output-inline\" id=\"see-also\">\n<ul><li><a href=\"\/payment-methods\/ach-direct-debit\/verification-with-giact\"\n                        target=\"_self\"\n                        >\n                    Account validation with giact\n                <\/a><\/li><li><a href=\"\/online-payments\/tokenization\"\n                        target=\"_self\"\n                        >\n                    Tokenization\n                <\/a><\/li><li><a href=\"\/development-resources\/webhooks\"\n                        target=\"_self\"\n                        >\n                    Webhooks\n                <\/a><\/li><li><a href=\"\/risk-management\/chargeback-guidelines\/ach-chargebacks\"\n                        target=\"_self\"\n                        >\n                    ACH Direct Debit chargebacks\n                <\/a><\/li><\/ul><\/div>\n","url":"https:\/\/docs.adyen.com\/payment-methods\/ach-direct-debit\/verification-with-plaid","articleFields":{"description":"Use Plaid for account validation of ACH Direct Debit payments.","parameters":{"payment_method":"ACH Direct Debit","country_code":"US","currency":"USD","payment_method_type":"ach","validation":"plaid"},"page_id":"e83c278d-12f0-481c-b7dc-cc730a2cd2cf","feedback_component":true,"filters_component":false,"decision_tree":"[]"},"algolia":{"url":"https:\/\/docs.adyen.com\/payment-methods\/ach-direct-debit\/verification-with-plaid","title":"Account validation with Plaid","content":"When accepting ACH Direct Debit payments, Nacha requires you to validate that the shopper's bank account details are correct, if it is a consumer account. To make this validation easier for you, we have partnered with Plaid. Plaid collects the shopper's permission to connect their account to Plaid, and verifies the account details directly with the shopper's bank.\nBenefits:\n\nSmooth shopper experience. Shoppers link their account using Plaid Link. Shoppers do not need to search for their account number and routing number.\nYou send us the shopper's Plaid processor token instead of having to deal with sensitive account details.\nPlaid collects the shopper's permission to store their details and check their account balance.\nReal-time balance check. This reduces the chance that transactions are reversed because of insufficient funds. It can also save shoppers having to pay overdraft fees or non-sufficient funds fees.\n\nIf you do not want to validate the account with Plaid, you need to collect the shopper's bank account number, bank routing number, and account holder name, and pass these details in the payment request.\nRequirements\n\n\n\nRequirement\nDescription\n\n\n\n\nIntegration type\nMake sure that you have built an Advanced flow Web Drop-in, Web Components, or API-only integration. \n\n\nLimitations\nDepending on their bank, shoppers may need to re-authenticate with Plaid after a number of months. The token itself doesn't change, but you need to re-initialize it.  You cannot use account validation with Plaid if your integration uses the \/sessions endpoint.\n\n\nSetup steps\nBefore you begin: Reach out to your Adyen contact to configure your Adyen account for collaboration with Plaid. Add ACH Direct Debit in your Customer Area. Create an account with Plaid, and complete an application profile and a company profile. Plaid will give you a client_id and a secret to make API calls to Plaid.\n\n\n\nHow it works\n\nThe shopper selects ACH Direct Debit on your payment form.\nYou check if the shopper has already connected their account with Plaid.\nIf the shopper's account isn't connected to Plaid yet:\n\nYou direct the shopper to Plaid Link.\nYou make a series of API requests to Plaid to get the shopper's Plaid processor token.\n\nYou make a payment with the shopper's Plaid processor token and optionally include parameters to check the customer's account balance. We use the shopper's Plaid processor token to validate their account details with Plaid.\n\nThe following diagram illustrates this flow.\n\nFor more insights, see Plaid's documentation on the Plaid - Adyen partnership.\nCheck the shopper's processor token\nIt is possible that with a previous payment to you, the shopper connected their account to Plaid and you saved their Plaid processor token. If you do not have the shopper's Plaid processor token, you need to direct the shopper to the Plaid Link app and get their token.\nProceed as follows:\n\n\nIn your POST  \/paymentMethods request, make sure to use:\n\ncurrency: set to USD.\ncountryCode: set to US.\n\n\n\nWhen the shopper selects ACH Direct Debit, on your payment form collect:\n\nThe account owner's name.\nThe shopper's billing address (optional).\nAny other details to be able to look up this shopper in your database.\n\n\n\nBased on the provided details, look up the shopper in your database and check if you have their Plaid processor token.\n\n\nIf you have the shopper's Plaid processor token, proceed to make a payment.\n\n\nIf you do not have the shopper's Plaid processor token, get it from Plaid:\n\n\nMake a series of requests to Plaid from your backend:\n\nA POST \n  \/link\/token\/create\n request to initialize the Plaid Link app and get a public_token.\nA POST \n  \/item\/public_token\/exchange\n request with the public_token to get an access_token.\nA POST \n  \/processor\/token\/create\n request with the access_token to get the shopper's processor_token.\n\n\nFor the details, see Plaid's instructions for Adyen integrations.\n\n\n\nSave the shopper's processor token, and proceed to make a payment.\n\n\n\n\nMake a payment\nThe ACH Direct Debit payment request must include the shopper's Plaid processor token. Optionally you can add parameters to check if the account balance meets specific conditions before trying an authorization.\n\nYou can also tokenize the transaction for future recurring payments.\n\nProceed as follows:\n\n\nFrom your server, make a POST  \/payments request.\nSpecify the following parameters:\n\n\n\nParameter\nRequired\nDescription\n\n\n\n\npaymentMethod.type\n\nSet to ach.\n\n\npaymentMethod.ownerName\n\nThe account holder name that you collected on your payment form when the shopper selected ACH Direct Debit.\n\n\nbillingAddress\n\nThe account owner's address information.\n\n\nadditionalData\n\nThe shopper's Plaid processor token and any balance check parameters you want to use.\n\n\n\nThese are the Plaid parameters you can use in additionalData:\n\n\n\nParameter\nDescription\n\n\n\n\nplaid.processorToken\nThe shopper's Plaid processor token that you received from Plaid and stored in your database.  Required for validation with Plaid.\n\n\nplaid.balanceCheck\nA string value set to true if you want us to check the account balance.\n\n\nplaid.minimumAmount\nA string value indicating the minimum amount available on the account, in minor units. Use only with plaid.balanceCheck set to true.  For example, if the balance must be USD&nbsp;10 or more, specify 1000. You can also use this in combination with plaid.balanceMultiplier.\n\n\nplaid.balanceMultiplier\nA string value indicating the condition that the account balance must at least be X times the payment amount. If plaid.minimumAmount is specified, indicates the condition that the account balance must at least be X times the specified minimum amount. For example, if the balance must be at least 2.5 times USD&nbsp;10, set plaid.balanceMultiplier to 2.5 and set plaid.minimumAmount to 1000.\n\n\n\n\n\n\n\n\nCheck the  \/payments response.\nThe additionalData object contains the validation result:\n\n\n\nParameter\nDescription\n\n\n\n\nachdirectdebit.dateOfSignature\nThe date that the shopper gave permission to collect direct debit payments from their account.\n\n\nachdirectdebit.mandateId\nThe identification of the shopper's permission to collect direct debit payments from their account. This ID is the same as the PSP reference of the payment.\n\n\nachdirectdebit.sequenceType\nIndicates if the direct debit payments are recurring. Possible values: OneOff, First.\n\n\navailableBalanceValue\nThe account balance. Only included if the request has plaid.balanceCheck true. Note that the balance is not in minor units.\n\n\nbankSummary\nThe last four digits of the shopper's bank account.\n\n\nbankVerificationResult\nThe result of the account validation and balance checks: Passed. If the validation fails, you receive an error message.\n\n\nbankVerificationResultRaw\nThe details of the account validation result. For example:  Passed: Available Balance greater than threshold if you asked for a balance check with conditions.  Passed: Routing number and Account number successfully retrieved if you didn't ask for a balance check.\n\n\nplaidProcessorToken\nThe shopper's Plaid processor token passed in the request.\n\n\n\nOther parameters in the response include:\n\n\n\nParameter\nDescription\n\n\n\n\npspReference\nOur unique reference for the payment.\n\n\nresultCode\nAuthorised. This means that the payment has been successfully received by Adyen. However, it may take up to 5 business days to know whether the payment was authorized by the bank.\n\n\n\n\n\n\nIf you do not get an Authorised response, refer to Handle Plaid validation errors.\n\n\nThe payment is sent to the bank. If the payment is successful, it will appear in the Settlement details report. If it fails, you will receive a CHARGEBACK webhook.\nHandle Plaid validation errors\nIf the Plaid validation failed, you get an error response like the following example.\n\n    \n\nMake sure that your integration can handle the following validation error responses:\n\n\n\nError\nDescription\n\n\n\n\n51_001 - Plaid service is currently unavailable\nTry again later.\n\n\n51_002 - Unknown error for Plaid\nTry again later.\n\n\n51_003 - Let the customer re-authenticate with Plaid\nThe shopper's Plaid processor token needs to be re-initialized. Direct the shopper to the Plaid Link update mode. The token itself doesn't change.\n\n\n51_004 - No valid checking or savings accounts for which account and routing numbers could be retrieved\nAsk the shopper to try another account or bank.\n\n\n51_005 - Plaid internal error\nPlaid was unable to process the request. Possible causes: An issue in the response from the bank. An issue with the shopper's consent to sharing data with Plaid. Some banks require the shopper to confirm they gave their consent to Plaid. Ask the shopper to try again later.\n\n\n51_006 - Plaid rate limit exceeded. Please try again later\nToo many requests were made in a short period of time. Possible causes: You used Plaid Sandbox credentials in the Plaid Developer or Production environment. The shopper entered their credentials incorrectly too many times. Ask the shopper to try again in one or two days.\n\n\n\nPresent the payment result\nUse the  resultCode that you received in the  \/payments response to present the payment result to your shopper. \nThe resultCode values you can receive for ACH Direct Debit are:\n\n\n\nresultCode\nDescription\nAction to take\n\n\n\n\nAuthorised\nThe payment has been successfully received by Adyen.  It may take up to 5 business days to know whether the payment was authorized by the bank. If the payment is successful, it will appear in the Settlement Detail Report. If it fails, you will receive a CHARGEBACK webhook.\nInform the shopper that the payment was successful.\n\n\nRefused\nThe payment was refused.\nAsk the shopper to try the payment again using a different payment method.\n\n\n\nTest and go live\nTo test the connection with Plaid, use the Plaid sandbox. Optionally use the Plaid GitHub repo to test specific scenarios.\nBefore you go live, create a Plaid developer account and run tests in the Plaid Developer environment.\nSee also\n\n\n                    Account validation with giact\n                \n                    Tokenization\n                \n                    Webhooks\n                \n                    ACH Direct Debit chargebacks\n                \n","type":"page","locale":"en","boost":17,"hierarchy":{"lvl0":"Home","lvl1":"Payment methods","lvl2":"ACH Direct Debit","lvl3":"Account validation with Plaid"},"hierarchy_url":{"lvl0":"https:\/\/docs.adyen.com\/","lvl1":"https:\/\/docs.adyen.com\/payment-methods","lvl2":"https:\/\/docs.adyen.com\/payment-methods\/ach-direct-debit","lvl3":"\/payment-methods\/ach-direct-debit\/verification-with-plaid"},"levels":4,"category":"Payment method","category_color":"green","tags":["Account","validation","Plaid"]},"articleFiles":{"ach-with-plaid-flow.svg":"<img alt=\"\" src=\"https:\/\/docs.adyen.com\/user\/pages\/docs\/08.payment-methods\/05.ach-direct-debit\/verification-with-plaid\/ach-with-plaid-flow.svg?decoding=auto&amp;fetchpriority=auto\" \/>"}}
