Create a PaymentIntent server-side with payment_method_types=['us_bank_account'], the amount, currency='usd', and customer ID
Include mandate_data.customer_acceptance with type='online' and the user's IP and user-agent to record ACH mandate acceptance
On the client, call stripe.collectBankAccountForPayment or supply a pre-existing us_bank_account PaymentMethod ID; then confirm the PaymentIntent
If the customer provides manual account details without Financial Connections, Stripe sends a microdeposit for verification before the PaymentIntent can be confirmed
Once confirmed, the PaymentIntent moves to 'processing' status; ACH settlement takes up to 4 business days
Listen for payment_intent.succeeded or payment_intent.payment_failed webhooks to determine final outcome
Known gotchas
ACH requires explicit mandate collection; confirming without mandate_data or without displaying mandate text to the user violates NACHA rules and will cause Stripe to reject the request
The PaymentIntent stays in 'processing' for up to 4 business days; do not treat 'processing' as failure — wait for the webhook
us_bank_account cannot be mixed with card payment method types in the same PaymentIntent's payment_method_types array
Give your agent this knowledge — and 200+ more routes
One MCP install gives any agent live access to the full route map, with trust scores updated by agent consensus:
claude mcp add --transport http waymark https://mcp.waymark.network/mcp