# Collect a bank account for Canadian pre-authorized debit payments

Use Financial Connections to instantly verify Canadian bank accounts for pre-authorized debit (PAD) payments.

> #### Get access
> 
> Financial Connections for Canadian bank accounts requires enablement on your account. Contact your Stripe account team to request access.

Stripe offers several ways to accept [Canadian pre-authorized debit](https://docs.stripe.com/payments/acss-debit.md) (PAD) payments from customers in Canada. All of these methods require that you verify the customer’s bank account before you can debit it. You can use Financial Connections to perform instant bank account verification, so customers authenticate with their bank instead of entering their account details manually. When you use Financial Connections for your PAD payment flows, you can:

- Reduce payment failures caused by incorrect or inactive account details
- Improve conversion by keeping customers in your flow, instead of having them locate their institution, transit, and account numbers
- Save development time by removing the need to build a custom bank account collection form

You can also request permission to access account balances, ownership information, and transactions.

## Before you begin

Financial Connections is the instant verification method for hosted PAD payment flows, such as Stripe Checkout or the Payment Element. If you use a hosted flow, Stripe collects and verifies the bank account for you. If you haven’t already set up your integration to [accept Canadian pre-authorized debit payments](https://docs.stripe.com/payments/acss-debit/accept-a-payment.md), do so first.

## Choose your integration

Choose an available integration to collect bank details. The following table links to the complete procedures.

| Integration | Payment | Save for future payments |
| --- | --- | --- |
| Hosted or embedded Checkout | [Checkout payment guide](https://docs.stripe.com/payments/acss-debit/accept-a-payment.md?payment-ui=checkout) | [Checkout setup guide](https://docs.stripe.com/payments/acss-debit/set-up-payment.md?payment-ui=checkout) |
| Standalone bank account collection | [collectBankAccountForPayment](https://docs.stripe.com/js/payment_intents/collect_bank_account_for_payment) | [collectBankAccountForSetup](https://docs.stripe.com/js/setup_intents/collect_bank_account_for_setup) |

Checkout supports PAD in `payment` and `setup` modes. It doesn’t support PAD in Checkout’s `subscription` mode. To reuse saved details in another integration, follow the [setup guide](https://docs.stripe.com/payments/acss-debit/set-up-payment.md) and its mandate and currency requirements.

## Enable Financial Connections

Set `verification_method` on `payment_method_options.acss_debit` when creating a `PaymentIntent`, `SetupIntent`, or Checkout Session.

| Verification method | Behavior |
| --- | --- |
| `automatic` (default) | Instant verification with Financial Connections, with manual entry and microdeposit fallback |
| `instant` | Financial Connections only, without manual entry or microdeposit fallback |
| `microdeposits` | Manual entry and microdeposit verification only |

This option is available on the following APIs:

- [PaymentIntent](https://docs.stripe.com/api/payment_intents/create.md#create_payment_intent-payment_method_options-acss_debit-verification_method)
- [SetupIntent](https://docs.stripe.com/api/setup_intents/create.md#create_setup_intent-payment_method_options-acss_debit-verification_method)
- [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_method_options-acss_debit-verification_method)

For Checkout, set ACSS options on the Session’s `payment_method_options`, instead of `payment_intent_data`. A setup integration must specify `payment_method_options.acss_debit.currency` as `cad` or `usd`. For payment mode, set the currency on the `PaymentIntent` or Checkout line items.

### PAD agreement

Customers in Canada must agree to a pre-authorized debit (PAD) agreement before you can debit their account. Stripe collects this mandate for you in hosted flows such as Checkout and the Payment Element. Verification alone doesn’t authorize a debit.

Supply mandate options that describe the authorized payments. Both `payment_schedule` and `transaction_type` are required. Include `interval_description` for `interval` or `combined` schedules, and omit it for `sporadic`. See [PAD mandates](https://docs.stripe.com/payments/acss-debit.md#mandates) and [Customize the PAD agreement](https://docs.stripe.com/payments/acss-debit/custom-pad-agreement.md).

## Collect bank details separately

Use [collectBankAccountForPayment](https://docs.stripe.com/js/payment_intents/collect_bank_account_for_payment) or [collectBankAccountForSetup](https://docs.stripe.com/js/setup_intents/collect_bank_account_for_setup) with `params.payment_method_type: 'acss_debit'` and the corresponding intent’s client secret. Configure the intent’s ACSS currency, verification method, and mandate options before collection.

Collection doesn’t replace confirmation. Handle the collection result, then confirm the intent with [confirmAcssDebitPayment](https://docs.stripe.com/js/payment_intents/confirm_acss_debit_payment) or [confirmAcssDebitSetup](https://docs.stripe.com/js/setup_intents/confirm_acss_debit_setup), as appropriate. Only debit an account after the customer accepts the PAD agreement.

Creating a `PaymentMethod` from a Financial Connections account ID alone doesn’t collect a PAD mandate. Complete the mandate and confirmation steps before charging it.

## Access Canadian account data

Request data permissions when creating the intent or Checkout Session. In an explicitly supplied permissions list, include `payment_method` and only the additional data your integration needs:

- `balances`: Account balances.
- `ownership`: Account owner information.
- `transactions`: Account transactions.

The following setup configuration requests all three data types. Omit permissions you don’t need. The `prefetch` list starts initial data retrieval and must have corresponding permissions.

```curl
curl https://api.stripe.com/v1/setup_intents \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "customer={{CUSTOMER_ID}}" \
  -d "automatic_payment_methods[enabled]=true" \
  -d "payment_method_options[acss_debit][currency]=cad" \
  -d "payment_method_options[acss_debit][verification_method]=automatic" \
  -d "payment_method_options[acss_debit][mandate_options][payment_schedule]=sporadic" \
  -d "payment_method_options[acss_debit][mandate_options][transaction_type]=personal" \
  -d "payment_method_options[acss_debit][financial_connections][permissions][]=payment_method" \
  -d "payment_method_options[acss_debit][financial_connections][permissions][]=balances" \
  -d "payment_method_options[acss_debit][financial_connections][permissions][]=ownership" \
  -d "payment_method_options[acss_debit][financial_connections][permissions][]=transactions" \
  -d "payment_method_options[acss_debit][financial_connections][prefetch][]=balances" \
  -d "payment_method_options[acss_debit][financial_connections][prefetch][]=ownership" \
  -d "payment_method_options[acss_debit][financial_connections][prefetch][]=transactions"
```

For payments, use the same `financial_connections` options on the `PaymentIntent`. For Checkout, use the Session’s `payment_method_options.acss_debit.financial_connections`.

Use the Financial Connections account ID to [retrieve balances](https://docs.stripe.com/financial-connections/balances.md), [ownership information](https://docs.stripe.com/financial-connections/ownership.md), or [transactions](https://docs.stripe.com/financial-connections/transactions.md). Data access depends on customer consent and account support. Verify [webhook signatures](https://docs.stripe.com/webhooks.md#verify-events) before processing asynchronous data updates.

## Find the Financial Connections account ID

When a customer verifies their account with Financial Connections, the `acss_debit` payment method includes a Financial Connections account ID. Retrieve the `PaymentIntent` and expand its `payment_method`:

```curl
curl -G https://api.stripe.com/v1/payment_intents/{{PAYMENTINTENT_ID}} \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "expand[]=payment_method"
```

Read `payment_method.acss_debit.financial_connections_account` from the expanded payment method’s [acss_debit](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-acss_debit) hash:

```json
{
  "id": "pi_3OK3g4FitzZY8Nvm11121Lhb",
  "object": "payment_intent",
  "payment_method": {
    "acss_debit": {
      "financial_connections_account": "fca_1OK123bitUAA8SvmruWkck76"
    }
  }
}
```

You can also expand `payment_method` when retrieving a `SetupIntent`, or expand `payment_intent.payment_method` when retrieving a payment-mode Checkout Session.

If the customer enters bank details manually, `acss_debit.financial_connections_account` is `null`. Manual entry and microdeposit verification don’t provide Financial Connections account data.

## Test your integration

Use sandbox test keys and the [Canadian bank account testing instructions](https://docs.stripe.com/financial-connections/testing.md#canadian-bank-accounts). Test both OAuth and non-OAuth connections. The standard Canadian test accounts use CAD.

Confirm that the customer can select an account, accept the PAD agreement, and complete confirmation. Check the resulting payment method’s Financial Connections account ID and the data permissions you requested. For asynchronous payments, verify the final payment event before fulfillment.

To test manual entry or microdeposit fallback, use the [PAD test account numbers](https://docs.stripe.com/payments/acss-debit/accept-a-payment.md?payment-ui=checkout#test-integration). Test payment method tokens bypass bank collection and verification, so they don’t test Financial Connections.

## Troubleshoot account collection

Check the request parameters and the error’s message before retrying. Internal message identifiers aren’t stable public error codes.

| Problem | Resolution |
| --- | --- |
| The mandate is incomplete or the interval description is invalid | Provide `payment_schedule` and `transaction_type`. Include `interval_description` only for `interval` or `combined`. |
| Setup currency is missing | Provide the intent’s nested ACSS `currency` as `cad` or `usd`. |
| Confirmation returns `payment_method_currency_mismatch` | Use a payment method and mandate authorized for the payment currency. Saving a CAD payment method doesn’t make it reusable for USD payments. |
| A Financial Connections account can’t be used for PAD | Use an account in Canada with a supported CAD or USD currency, payment method permission, and usable Canadian account numbers. |
| A saved payment method belongs to a different customer | Use the same `Customer` for setup and reuse. Don’t attach or confirm a customer’s saved payment method for another customer. |
