top of page

Plaid Auth + Identity Setup: What a Plaid Developer Should Implement (and Test)

Feb 3
14 min read

Updated: Aug 24


Plaid Auth + Identity Setup: What a Plaid Developer Should Implement (and Test)

Connecting a bank account is the visible part of a Plaid integration. The harder work begins after the user clicks “Continue.” Your application still has to exchange tokens safely, associate the correct account with the correct user, evaluate account ownership, prepare the account for ACH payments, respond to revoked access, and recover when a bank connection breaks.


That distinction matters. A demo can stop after Plaid Link returns a public_token. A production system cannot.


For U.S. fintech products, Plaid Auth and Plaid Identity are often used together. Auth retrieves the account and routing information needed to set up an ACH funding source. Identity retrieves bank-held ownership information—or compares it with information your customer supplied—to help determine whether the linked account belongs to that person.


This guide explains what a Plaid developer should implement, what the backend must protect, and what QA should test before a U.S. fintech app goes live.


What Is a Plaid Auth and Identity Integration?


A Plaid Auth and Identity integration is a bank-account connection flow that combines payment-account data with ownership data.


Plaid Auth provides account and routing information for supported bank accounts.

Plaid Identity can return names, addresses, phone numbers, and email addresses held by the financial institution.


Plaid Identity Match lets an application submit known customer details and receive scores describing how closely they match the bank's records.

Plaid Link is the user-facing interface through which a customer selects and authenticates with a financial institution.


These products solve related—but different—problems. Auth answers, “Which bank account can be used for this payment rail?” Identity helps answer, “Does the bank's ownership information align with our customer?”


Plaid does not become the payment processor merely because Auth is enabled. If the product needs to originate ACH credits or debits, the application must use a payment partner such as Dwolla or Stripe, use Plaid Transfer where appropriate, or send permitted account details to another processing system. Plaid's Auth documentation describes the direct /auth/get and processor-token approaches.


Build a Secure Plaid Auth & Identity Integration




Plaid Identity Is Not the Same as Identity Verification


This is an easy—and expensive—product-design mistake.


Plaid Identity uses information associated with a linked bank account. Identity Match compares that information with customer data supplied by your application. Plaid Identity Verification is a separate KYC product with its own verification workflow, templates, checks, statuses, and webhook configuration.


An ownership match can support a risk decision, but it should not automatically be presented as a complete KYC program. The compliance team should decide which checks are required for the product, customer, transaction, and jurisdiction.


How Does Plaid Integrate With Banks?


Plaid provides a standardized layer between a financial application and participating financial institutions. Depending on the institution and connection, the customer may authenticate through an OAuth experience or another supported flow. Plaid Link manages institution selection, authentication, multi-factor prompts, consent, and account selection.


The typical Plaid bank integration works like this:


  • The frontend asks your backend to create a Link session.

  • The backend calls /link/token/create with the application's configuration.

  • The frontend opens Plaid Link using the returned link_token.

  • The customer chooses a bank, authenticates, and selects an account.

  • Link returns a short-lived public_token after success.

  • The frontend sends that token to your backend.

  • The backend calls /item/public_token/exchange and receives an access_token and item_id.

  • The backend stores the access token securely and calls Auth and Identity endpoints.

  • The application applies its ownership, eligibility, and risk rules.

  • The backend creates a processor token or sends permitted bank details to its payment provider.


Webhooks and update mode maintain the Item after onboarding.

Plaid calls the ongoing connection between an application and a financial institution an Item. The item_id identifies it; the access_token authorizes product requests for it. Plaid's Link overview documents this token-exchange flow.


Plaid Integration Architecture for Auth and Identity


A production architecture normally includes:


  • A web or mobile client that launches Plaid Link

  • An authenticated application backend

  • A Plaid API service layer

  • Encrypted token storage

  • An account and Item database

  • A public webhook receiver backed by a queue

  • An ownership-decision service

  • A payment processor or Plaid Transfer

  • Monitoring, audit logs, and support tooling


The browser should receive only what it needs to run Link. Plaid API secrets and permanent access tokens belong on the server. Raw account numbers, routing numbers, owner records, and match results should be treated as sensitive financial or personal information.


Use an Explicit Connection State Model


Avoid representing the entire flow with a Boolean such as is_connected.

A user may finish Link while Identity is still being evaluated. Auth may succeed while the processor is unavailable. The Item may remain valid even though the selected account was removed. A permission-revocation webhook may arrive while a payment is being prepared.


A practical state model could include:


State

Meaning

Can the app initiate a new payment?

`TOKEN_EXCHANGE_PENDING`

Link succeeded, but the server has not completed exchange

No

`ITEM_CREATED`

The Item exists, but checks are incomplete

No

`IDENTITY_PENDING`

Ownership evaluation is running

No

`REVIEW_REQUIRED`

The match requires manual or alternate verification

Usually no

`PROCESSOR_SETUP_PENDING`

Auth passed, but the funding source is not ready

No

`READY`

Required checks and processor setup passed

Yes

`UPDATE_REQUIRED`

The customer must repair the connection

No

`PERMISSION_REVOKED`

Access was withdrawn

No

`REMOVED`

The Item was disconnected and cleaned up

No


The database should control these transitions. The frontend should display them, not invent them.


Step 1: Configure the Plaid Integration Environments


Keep Sandbox and Production configurations isolated. Each environment should have its own credentials, webhook URL, data boundaries, dashboards, and alert labels. A token created in one environment cannot be used in another.

Before development begins, configure:


  • Plaid application name and branding

  • Auth and Identity product access

  • U.S. country configuration

  • Allowed OAuth redirect URIs

  • Mobile package identifiers, where applicable

  • Production webhook destinations

  • The selected payment processor integration

  • A secret manager for client_id and Plaid secrets


Never commit Plaid credentials to source control or ship them in a web or mobile bundle. Limit secret access to the service that calls Plaid, and redact credentials from logs and traces.


Step 2: Create the Link Token on the Backend


Expose an authenticated endpoint such as:


POST /api/plaid/link-token



The backend should identify the signed-in customer itself and generate a stable, non-sensitive client_user_id. It should not accept an arbitrary user identifier from the browser and trust it.


A typical Link-token request for this use case includes:


  • client_name

  • language: "en"

  • country_codes: ["US"]

  • products, including Auth and, when appropriate, Identity

  • A webhook URL

  • An OAuth redirect_uri, where required

  • Account filters for eligible depository accounts


Decide whether Identity is an initial product or an optional product based on consent, coverage, conversion, data timing, and billing. Do not add products “just in case.” Product configuration should follow a documented business purpose.


Filter Accounts, Then Validate Again on the Server


Link can guide the user toward checking, savings, or other permitted accounts. That improves the experience, but a UI filter is not an authorization rule.


After Link completes, the backend should verify that the chosen account_id:


  • Belongs to the exchanged Item

  • Matches the account the customer selected

  • Has an allowed type and subtype

  • Supports the intended payment method

  • Has the required Auth data

  • Is not already connected in violation of business rules


Step 3: Implement Plaid Link Without Treating onSuccess as Final Success


The frontend should handle Plaid Link's onSuccess, onExit, and onEvent callbacks. Record non-sensitive diagnostic values such as the link_session_id, institution ID, selected-account metadata, safe error codes, and event names.


When onSuccess fires:


  • Disable repeat submission.

  • Send the public_token and selected-account reference to the backend over HTTPS.

  • Show a processing state.

  • Wait for the backend to confirm the final application status.


Do not show “Bank account connected” merely because Link closed successfully. Link success means the customer completed that Link session. Your token exchange, ownership checks, and processor setup may still fail.


The exit experience also deserves deliberate copy. User cancellation is different from incorrect credentials, an institution outage, an unsupported account, or an OAuth return failure. A useful message tells the customer whether to retry now, select a different bank, or return later.


Step 4: Exchange the Public Token and Store the Item Safely


Create a backend endpoint such as:


POST /api/plaid/exchange-public-token


It should call /item/public_token/exchange, associate the resulting item_id and access_token with the authenticated customer, and return only a sanitized application status.


Store the access token encrypted at rest. A useful Item record may contain:

Internal customer ID


  • Plaid item_id

  • Encrypted access_token

  • Institution ID and display name

  • Selected Plaid account_id

  • Account mask, type, and subtype

  • Connection and ownership states

  • Consent or permission state

  • Latest safe error category

  • Processor setup status

  • Created and updated timestamps


Make Token Exchange Idempotent


Networks fail at awkward moments. Your backend may successfully exchange a token and then time out before sending its response. The browser may retry. Two application instances may process the same submission concurrently.

Use transactional writes, uniqueness constraints, and a documented reconciliation path. Test duplicate submissions rather than assuming the frontend will send the request once.


Step 5: Implement Plaid Auth for ACH Account Setup


There are two common Auth patterns.


Direct Plaid Auth API Integration


With the direct approach, the backend calls /auth/get, finds the exact selected account, and reads the applicable account and routing information. It then sends only the required fields to the payment system.


Minimize how long your application retains raw account and routing numbers. Never return them to the browser unless a carefully reviewed product requirement makes that necessary.


Processor-Token Integration


With a supported payment partner, the backend generally creates a processor token for the selected account and gives that token to the processor. This can reduce your application's direct exposure to bank-account numbers.


A Dwolla Plaid integration, for example, combines Plaid's account connection and verification capabilities with Dwolla's payment functionality. If your team needs broader help with the payment side, review these Dwolla integration development services.



A Plaid and Stripe integration follows the processor-specific flow available for the supported Stripe use case. Do not assume that a generic processor token, Stripe token, and raw /auth/get response are interchangeable. Follow the current partner documentation and enable the integration in the Plaid Dashboard.


Whichever approach you use, retain the Plaid access token while the Item is active. It is needed for Item maintenance and update mode even after a processor token has been created.


Step 6: Implement Plaid Identity and Ownership Decisioning


Use /identity/get when the application needs the bank-held owner records. Use /identity/match when it already has customer data and wants Plaid to return match scores. Plaid explains both options in its Identity documentation.


The implementation must tolerate incomplete data. Plaid notes that names are guaranteed for /identity/get, while emails, phone numbers, and addresses may be empty. Missing optional fields are a data condition, not necessarily an API failure.


Normalize Identity Data Before Comparing It


If your application performs its own comparison, normalize:


  • Capitalization and extra whitespace

  • Middle names and initials

  • Diacritics and transliteration

  • Previous or married surnames

  • Phone-country codes and punctuation

  • Email casing

  • Street abbreviations

  • Apartment and unit formats

  • ZIP and ZIP+4 formats


An exact string comparison is rarely a sound ownership policy. “Robert J Smith,” “Robert Smith,” and “Bob Smith” may refer to the same person, while two identical names do not prove ownership on their own.


Define Match Thresholds Before Launch


  • For Identity Match, document:

  • Which fields are submitted

  • Which fields are mandatory

  • Minimum acceptable scores

  • Treatment of missing scores

  • The weight assigned to name, address, phone, and email

  • Manual-review thresholds

  • Hard-decline thresholds

  • Rules for joint and business accounts


Return a business outcome such as VERIFIED, LIMITED_DATA, REVIEW_REQUIRED, MISMATCH, or UNSUPPORTED. Do not expose raw risk logic or sensitive bank-held details in customer-facing errors.


Handle Joint Accounts as a First-Class Case


Joint ownership is not an edge case for consumer banking. A bank may return multiple owners, an abbreviated name, or a parent and child. Business accounts may include an organization and one or more people.


Your decision should evaluate the relevant set of owners rather than automatically comparing the customer with the first record returned. When the evidence is inconclusive, use an alternate verification or review path instead of silently marking the account as fraudulent.


Step 7: Orchestrate Auth and Identity Deliberately


There are two reasonable execution patterns:


Run Identity Before Auth


This reduces unnecessary handling of payment credentials when ownership will fail. The tradeoff is additional time before the account becomes usable.


Run Auth and Identity in Parallel


Parallel calls can reduce latency, but they create partial-success states. The system needs to know what to do if Auth succeeds while Identity is unavailable, or if a processor token is created before an ownership mismatch is discovered.

For many risk-sensitive products, a safe orchestration is:


  • Persist the Item and selected account.

  • Request Identity or Identity Match.

  • Apply the ownership policy.

  • Retrieve Auth data or create the processor token.


Mark the funding source READY only after every required step passes.

The exact order is a business and risk decision. The important part is to model partial success explicitly.


Step 8: Build Webhooks, Update Mode, and Revocation Handling


Plaid bank integrations are ongoing connections, not one-time API calls. Credentials change, institutions require reauthentication, customers revoke consent, and accounts disappear.


Your webhook endpoint should:


  • Accept HTTPS requests

  • Verify webhook authenticity using Plaid's current guidance

  • Persist or enqueue the event quickly

  • Return promptly

  • Process slow work asynchronously

  • Tolerate duplicate and out-of-order delivery

  • Retry internal failures

  • Send persistent failures to a dead-letter queue


For Auth, pay particular attention to Item errors, pending disconnection, user-permission revocation, and account-level revocation. A revoked or unhealthy account must stop being treated as payment-ready.


Connect Plaid Auth & Identity to Your Fintech Product




Implement Update Mode


When an Item requires repair, the backend should create an update-mode Link token using the existing access token. After the customer completes update mode:


  • Refresh the Item status

  • Confirm that the selected account still exists

  • Re-run required Auth and Identity checks

  • Reassess the processor funding source

  • Clear only the errors that were actually resolved

  • Record the change in the audit log


Do not build reconnection as “create a completely new Item every time.” That can produce duplicate funding sources and broken account history.


What Should Developers Test in a Plaid API Integration?


Testing should cover the state machine, not only the happy path.


Plaid Link Tests


  • Successful connection

  • OAuth and non-OAuth institutions

  • Multi-factor authentication

  • User cancellation

  • No eligible accounts

  • Multiple eligible accounts

  • Incorrect credentials

  • Institution outage

  • OAuth redirect failure

  • Expired Link token

  • Repeated success submission

  • Mobile background and return behavior

  • Accessible keyboard and screen-reader operation


Token and Backend Tests


  • Unauthenticated Link-token requests are rejected

  • A customer cannot supply another customer's ID

  • Plaid secrets never reach the client

  • Access tokens are encrypted and redacted

  • Duplicate exchange requests are safe

  • A database failure after exchange can be reconciled

  • Cross-customer Item access is blocked

  • Plaid rate limits and timeouts are classified correctly


Plaid Auth Tests


  • Valid checking and savings accounts

  • Unsupported account subtype

  • Missing Auth numbers

  • Correct selection among multiple accounts

  • Processor-token success and rejection

  • Direct /auth/get mapping

  • Instant verification and supported fallback methods

  • Incorrect or expired micro-deposit attempts, when enabled

  • Duplicate processor setup

  • Auth succeeds but the downstream processor times out


Plaid Identity Tests


  • Exact owner match

  • Partial name match

  • Different middle initial

  • Previous surname

  • Address-format variation

  • Missing phone, email, or address

  • Multiple owners

  • Business account

  • No matching owner

  • Multiple accounts with different owner data

  • Unsupported Identity product

  • Scores just below, at, and above each decision threshold


Webhook and Recovery Tests


  • Valid event

  • Failed authenticity verification

  • Duplicate event

  • Out-of-order events

  • Unknown event type

  • Malformed payload

  • Queue or database outage

  • Item error followed by successful update mode

  • Permission revocation

  • Account revocation

  • Customer disconnect during a pending workflow


Plaid's Sandbox supports test Items, test credentials, and endpoints that can trigger supported webhook scenarios. Automated build-blocking tests should bypass the changing Link UI where appropriate; keep a smaller set of manual or non-blocking end-to-end Link tests.


Test With Real Institutions Before General Availability


Sandbox is necessary, but it does not reproduce the full variety of production bank behavior. Before launch, test permitted real connections across:


  • Large U.S. banks and smaller institutions

  • OAuth and other supported connection types

  • Single-owner and joint accounts

  • Checking and savings accounts

  • Mobile and desktop flows

  • Real webhook delivery

  • Update mode

  • Processor handoff


If Bank of America is important to your customer base, include its real permitted flow in your production-trial plan rather than creating institution-specific assumptions in code. A robust Bank of America Plaid integration should use the same normalized Item, state, error, and recovery architecture as other institutions.


Plaid Integration Security and Privacy Checklist


A U.S. fintech team should verify that it:


  • Stores Plaid secrets in a managed secret store

  • Encrypts access tokens at rest

  • Never places tokens in URLs or browser storage

  • Authorizes every Item operation against the current customer

  • Redacts account numbers, routing numbers, tokens, and owner data from logs

  • Uses rate limits and request-schema validation

  • Verifies Plaid webhooks

  • Keeps an audit trail for state and permission changes

  • Defines data-retention and deletion periods

  • Removes or disables the funding source when permission is revoked

  • Gives users clear consent, privacy, and disconnection experiences


Plaid tooling can support a secure design, but installing an SDK does not make an application compliant. Your legal and compliance teams must evaluate applicable privacy, ACH, consumer-finance, and risk obligations for the product.


Plaid Integration Cost: What Determines the Real Budget?


There is no single universal Plaid integration cost. Plaid product pricing depends on the commercial agreement, enabled products, usage, and account terms. Engineering cost depends on scope and operational maturity.


Budget for more than the initial Link screen:


  • Backend and mobile/web implementation

  • Auth and Identity product usage

  • Payment-processor setup

  • Identity decision rules and manual review

  • Webhook queues and retry handling

  • Encryption and secrets management

  • QA across institutions and account types

  • Production monitoring and support tooling

  • Consent, privacy, and deletion workflows

  • Ongoing maintenance as institution behavior changes


A useful estimate separates one-time implementation, recurring Plaid and processor fees, cloud operations, and ongoing engineering support. For teams comparing build options, FintegrationFS offers Plaid integration services, a Plaid API integration overview, and broader fintech integration services.


The Missing Angle: “Connected” Is Not a Durable Business State


Most Plaid integration tutorials end with a successful token exchange. That is exactly where production design begins.


The overlooked question is: What evidence must still be true at the moment your application initiates a payment?


A stored access token does not guarantee that:


  • The customer still permits access

  • The selected account still exists

  • The ownership result remains acceptable under your policy

  • The account is still enabled at the processor

  • The Item does not require update mode

  • A newer webhook has not invalidated the previous state


The safest architecture derives payment readiness from current state rather than assuming that a historical Link success remains valid forever. This lifecycle approach prevents stale bank connections from becoming silent payment failures.


 What Must a Production-Ready Plaid Integration Include?


A production-ready Plaid Auth and Identity integration should create Link tokens on an authenticated backend, exchange public tokens server-side, encrypt access tokens, bind the exact selected account to the correct user, retrieve Auth data or create a processor token, evaluate ownership with Identity or Identity Match, and represent partial outcomes with an explicit state model. It should also verify and process webhooks idempotently, support update mode and permission revocation, avoid logging financial data, test joint owners and missing identity fields, and complete real-institution production-trial testing before launch.



Final Takeaway


A dependable Plaid API integration is not measured by whether Plaid Link opens. It is measured by whether the entire lifecycle behaves correctly: onboarding, ownership assessment, ACH setup, partial failure, recovery, revocation, monitoring, and deletion.


For a U.S. fintech app, the best implementation keeps permanent tokens on the server, validates the exact selected account, treats Identity results as evidence rather than a simplistic yes/no answer, and tests the uncomfortable cases—joint owners, missing data, duplicate requests, institution outages, and stale permissions.


That work is less visible than the Link interface, but it is what makes Plaid integrations reliable in production.


Implement & Test Plaid APIs With Confidence




Frequently Asked Questions About Plaid Integration


1. What is the difference between Plaid Auth and Plaid Identity?


Plaid Auth provides bank-account and routing information used to set up supported payment flows such as ACH. Plaid Identity returns bank-held owner information, while Identity Match compares customer-supplied data with bank records. Teams often combine them so they can prepare an account for payment and assess whether it appears to belong to the customer.


2. Does Plaid Auth move money?


No. Plaid Auth retrieves or tokenizes the bank-account information needed by a payment system, but it is not itself the processor in a standard Auth integration. The application still needs a supported processor, Plaid Transfer where appropriate, or another ACH provider.


3. Should Plaid access tokens be stored in the frontend?


No. Permanent access tokens and Plaid secrets should remain on the backend and be encrypted at rest. The frontend can receive the short-lived Link token and can pass the temporary public token to the backend, but it should not receive or store the resulting access token.


4. Can Sandbox testing prove that a Plaid bank integration is production-ready?


Not by itself. Sandbox is excellent for automated flows, error cases, test data, and webhooks, but it cannot represent every institution's production behavior. A responsible launch plan also includes permitted real-institution testing, OAuth returns, mobile flows, processor handoffs, update mode, and operational monitoring.


5. What is the biggest Plaid Auth and Identity implementation mistake?


The biggest mistake is treating Link success as final account readiness. Token exchange, account validation, ownership checks, processor setup, webhooks, revocation, and recovery can each produce a different state. A production system should mark an account ready only when every required condition has passed.



imgi_48_Arpan Desai Profile Photo (1).png

About Author 

Arpan Desai

CEO & FinTech Expert

Arpan brings 14+ years of experience in technology consulting and fintech product strategy.
An ex-PwC technology consultant, he works closely with founders, product leaders, and API partners to shape scalable fintech solutions.

 

He is connected with 300+ fintech companies and API providers and is frequently involved in early-stage architectural decision-making.

Rectangle 6067.png

Contact Us

Are you looking to build a robust, scalable & secure Fintech solution?
bottom of page