> ## Documentation Index
> Fetch the complete documentation index at: https://docs.dodopayments.com/llms.txt
> Use this file to discover all available pages before exploring further.

# ACH Direct Debit

> Accept ACH Direct Debit from US customers paying in USD. Learn how bank debits work at checkout, how long they take to clear, and how to test them.

ACH Direct Debit lets customers in the United States pay from their bank account instead of a card. It runs on the Automated Clearing House network and is offered on USD checkouts for one-time payments.

## Why Offer ACH Direct Debit?

<CardGroup cols={3}>
  <Card title="Lower Processing Cost" icon="piggy-bank">
    ACH costs a flat 1.5% per payment, capped at \$15, instead of the card fee. See [pricing](https://dodopayments.com/pricing).
  </Card>

  <Card title="No Card Required" icon="building-columns">
    Reach US customers who prefer to pay from a bank account, or who don't want to use a card for a large purchase.
  </Card>

  <Card title="Higher Value Orders" icon="chart-line">
    Because the fee is capped at \$15, the saving over a card fee grows with order value. ACH suits large one-time purchases.
  </Card>
</CardGroup>

## Overview

| Detail | Value |
| :- | :- |
| **Billing Currency** | USD |
| **Supported Countries** | United States |
| **Subscriptions** | No |
| **Min Amount** | \$0.50 |
| **Settlement** | Up to 4 business days |

<Warning>
  ACH Direct Debit is not instant. A payment can take **up to 4 business days** to succeed or fail. An authorized debit is not a settled payment: fulfill the order only after the payment reaches the succeeded state.
</Warning>

## How It Works

```mermaid theme={null}
sequenceDiagram
    participant Customer
    participant Checkout
    participant Dodo
    participant ACH as ACH Network
    participant Bank

    Customer->>Checkout: Select ACH Direct Debit
    Checkout->>Customer: Ask for bank account details
    Customer->>Checkout: Enter details and authorize the debit
    Checkout->>Dodo: Create payment
    Dodo->>ACH: Submit debit request
    Note over ACH,Bank: Clearing takes up to 4 business days
    ACH->>Bank: Debit customer account
    Bank->>ACH: Confirm or return
    ACH->>Dodo: Final status
    Dodo->>Checkout: Payment succeeded or failed
```

## Customer Experience

1. The customer selects **ACH Direct Debit** at checkout.
2. The customer enters the account holder name, routing number, account number, account type (checking or savings), and email address. Checkout checks that the routing number is valid.
3. The customer submits the form, which authorizes the debit from their US bank account under a mandate.
4. The payment is submitted to the ACH network and enters the processing state. Checkout completes without waiting for clearing.
5. Clearing completes over the following business days.
6. The payment moves to the succeeded state, or fails if the bank returns it.

<Info>
  Because clearing is asynchronous, use [webhooks](/developer-resources/webhooks) to learn the final outcome instead of the checkout redirect. A redirect after checkout only means the customer authorized the debit.

  The payment emits `payment.processing` once the debit is submitted, then `payment.succeeded` or `payment.failed` when clearing completes. Fulfill only on `payment.succeeded`.
</Info>

## Availability

ACH Direct Debit appears at checkout when all of the following are true:

* The **billing currency** is `USD`.
* The **billing country** is `US`.
* The transaction is a **one-time payment**.

<Note>
  ACH Direct Debit is not available for subscriptions. For recurring payments, use cards or another method that supports subscriptions. See the [Payment Methods overview](/features/payment-methods).
</Note>

## Configuration

```javascript theme={null}
const session = await client.checkoutSessions.create({
  product_cart: [{ product_id: 'pdt_123', quantity: 1 }],
  allowed_payment_method_types: ['ach', 'credit', 'debit'],
  billing_currency: 'USD',
  billing_address: {
    country: 'US',
    zipcode: '94102'
  },
  return_url: 'https://example.com/success'
});
```

<Note>
  ACH Direct Debit requires a **USD** billing currency and a **US** billing address. If you price in another currency, enable [Adaptive Currency](/features/adaptive-currency) so US customers are billed in USD and ACH becomes available.
</Note>

## API Method Type

| Type | Method | Country |
| :- | :- | :- |
| `ach` | ACH Direct Debit | United States |

## Refunds and Disputes

Refunds and disputes for ACH payments use the same APIs and dashboard flows as every other payment method. You don't need ACH-specific handling.

<Warning>
  A customer's bank can return an ACH debit after it appears to have gone through, and under Nacha rules a customer can return an unauthorized debit from a personal account for up to 60 calendar days after settlement. Don't issue a refund until the original payment has reached the succeeded state.
</Warning>

## Testing

<Steps>
  <Step title="Enable test mode">
    Turn off the **Live Mode** switch in the dashboard sidebar, and use API keys created in test mode.
  </Step>

  <Step title="Set currency and billing address">
    Set the billing currency to `USD` and the billing address country to `US`.
  </Step>

  <Step title="Include `ach` in allowed methods">
    Pass `ach` in `allowed_payment_method_types`, or omit the field to show every eligible method.
  </Step>

  <Step title="Enter the test bank details">
    Enter one of the test routing and account number pairs below. Then confirm that your webhook handler receives the final payment status.
  </Step>
</Steps>

### Test Bank Accounts

The customer types the account and routing numbers into the checkout form. In test mode, use the routing number `110000000` with one of these account numbers to force an outcome:

| Account Number | Routing Number | Behavior |
| :- | :- | :- |
| `000123456789` | `110000000` | The payment succeeds. |
| `000222222227` | `110000000` | The payment fails due to insufficient funds. |
| `000111111113` | `110000000` | The payment fails because the account is closed. |
| `000111111116` | `110000000` | The payment fails because no account is found. |
| `000333333335` | `110000000` | The payment fails because debits aren't authorized on the account. |
| `000444444440` | `110000000` | The payment fails due to an invalid currency. |
| `000555555559` | `110000000` | The payment succeeds, then triggers a dispute. |
| `000000000009` | `110000000` | The payment stays in processing indefinitely. Use it to test a pending-state UI. |

<Note>
  Test payments reach a final status much faster than live payments, so you don't need to wait days to verify your integration. The exception is `000000000009`, which stays in processing.
</Note>

## Best Practices

<AccordionGroup>
  <Accordion title="Don't fulfill on authorization">
    An ACH authorization is not a payment. Wait for the payment to reach the succeeded state before you grant access or ship. The customer's bank can still return the debit.
  </Accordion>

  <Accordion title="Set customer expectations at checkout">
    Tell customers that bank payments don't clear immediately. This reduces support tickets that ask why an order is still pending.
  </Accordion>

  <Accordion title="Provide card fallbacks">
    Include `credit` and `debit` alongside `ach`, so customers who need immediate access to your product can choose a faster method.
  </Accordion>

  <Accordion title="Use ACH for high-value one-time purchases">
    The ACH fee is capped at \$15, so the saving is largest on large one-time purchases.
  </Accordion>
</AccordionGroup>

## Troubleshooting

<AccordionGroup>
  <Accordion title="ACH not appearing at checkout">
    **Check:**

    1. Is the billing currency `USD`?
    2. Is the customer's billing country `US`?
    3. Is `ach` included in `allowed_payment_method_types`?
    4. Is this a one-time payment? ACH is not offered on subscriptions.
    5. Is the amount at least \$0.50?

    **Solution:** Remove `allowed_payment_method_types` temporarily to see all eligible methods, then check the billing currency and address country in your API request.
  </Accordion>

  <Accordion title="ACH not appearing on a subscription checkout">
    **Cause:** ACH Direct Debit is offered for one-time payments only.

    **Solution:** Use cards or another subscription-capable method for recurring billing.
  </Accordion>

  <Accordion title="Payment stuck in processing">
    **Cause:** This is expected. An ACH payment stays in the processing state for the whole clearing window, which is much longer than for a card payment.

    **Solution:** Wait for the final webhook. Don't retry the payment, because a retry can debit the customer twice.
  </Accordion>

  <Accordion title="Payment failed after initially succeeding at checkout">
    **Cause:** Checkout completed, but the customer's bank returned the debit during clearing, most often for insufficient funds or a closed account. The payment emits `payment.failed`.

    **Solution:** Treat the payment as failed, and ask the customer to pay with another method. Fulfill only on the succeeded state to avoid this.
  </Accordion>
</AccordionGroup>

## Related Pages

<CardGroup cols={2}>
  <Card title="Payment Methods Overview" icon="credit-card" href="/features/payment-methods">
    See all supported payment methods.
  </Card>

  <Card title="Adaptive Currency" icon="globe" href="/features/adaptive-currency">
    Currency support and automatic conversion.
  </Card>

  <Card title="Checkout Guide" icon="book" href="/developer-resources/checkout-session">
    Complete checkout implementation guide.
  </Card>

  <Card title="Webhooks" icon="webhook" href="/developer-resources/webhooks">
    Handle delayed payment confirmations asynchronously.
  </Card>
</CardGroup>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.