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:
- After the customer confirms, status becomes
processing(you’ll receive thepayment_intent.processingcallback). - When the debit clears — typically a few business days — status becomes
succeeded(thepayment_intent.succeededcallback). - 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.
Related
- Webhooks & callbacks — react to
processing→succeeded. - Payment lifecycle — all statuses in one place.