Preview Leffel Consulting Payments is in active development and migrating to Finix — the API isn't publicly live yet, and some examples still reflect the outgoing build. Request early access →

Guides

ACH bank payments

Accept lower-fee ACH bank debits. ACH settles asynchronously — wait for the succeeded callback before fulfilling.

ACH bank debits carry much lower fees than cards, which makes them ideal for large invoices, memberships, dues, and recurring or high-ticket payments. The trade-off is that ACH is asynchronous — funds don’t confirm instantly.

Create an ACH payment

Set paymentMethodTypes to ["us_bank_account"]:

curl https://payments.leffelconsulting.com/v1/payments/intents \
  -H "X-Api-Key: lc_live_XXXXXXXXXXXXXXXXXXXX" \
  -H "Idempotency-Key: invoice-5567" \
  -H "Content-Type: application/json" \
  -d '{
    "amountCents": 500000,
    "currency": "usd",
    "paymentMethodTypes": ["us_bank_account"]
  }'

Collect the bank details in the browser with the Payment Element, exactly like a card payment.

The asynchronous lifecycle

An ACH payment does not go straight to succeeded:

  1. After the customer confirms, status becomes processing (you’ll receive the payment_intent.processing callback).
  2. When the debit clears — typically a few business days — status becomes succeeded (the payment_intent.succeeded callback).
  3. If the bank rejects it, status becomes failed.

Do not fulfill on `processing`

Only mark the order paid on succeeded. Treat processing as pending — the money hasn’t cleared yet.