Accepting ACH Bank Payments via Stripe
Xagle can accept ACH Direct Debit payments (US bank account payments) on public invoices through Stripe. When enabled, the Pay via Bank Transfer button on a public invoice takes the client to a secure Stripe page where they connect their bank (or enter account and routing numbers) and authorize the payment — instead of the manual bank transfer notification form.
Prerequisites
- The tenant has Stripe configured and enabled in Xagle (Settings → Online Payments → Stripe: Publishable Key, Secret Key, and the processor toggled to Enabled).
- ACH applies to USD invoices only. Invoices in other currencies automatically keep the manual bank transfer form.
Step 1 — Enable ACH Direct Debit in the tenant's Stripe account
- Log in to the Stripe Dashboard for the correct account, in live mode.
- Go to Settings (gear icon) → Payments → Payment methods.
- Open the Default payment configuration (Type: "Your account").
- Expand Bank debits, find ACH Direct Debit, and click Turn on. Accept the ACH terms if prompted.
Step 2 — Register the webhook
- In the Stripe Dashboard go to Workbench → Webhooks (or Developers → Webhooks) and click Add destination.
- Scope: Your account. API version: the latest stable version (not an old pinned version, not a preview version).
- Select exactly these six events:
checkout.session.completedcheckout.session.async_payment_succeededcheckout.session.async_payment_failedinvoice.paidinvoice.payment_failedsetup_intent.succeeded
- Destination type: Webhook endpoint. Endpoint URL (replace the subdomain with the tenant's):
https://{tenant-subdomain}.xagle.io/api/v1/stripe/webhook/ach-checkout - Give it a recognizable name (for example "Xagle ACH Checkout") and create it.
- On the destination's detail page, reveal and copy the Signing secret (it starts with
whsec_).
Step 3 — Turn it on in Xagle
- As a tenant admin, go to Settings → Online Payments → Online Payment Processors tab, Stripe section.
- Paste the signing secret into Webhook Secret.
- Set ACH Direct Debit to Yes.
- Save.
Step 4 — Verify
- From a terminal:
curl -X POST https://{tenant-subdomain}.xagle.io/api/v1/stripe/webhook/ach-checkoutshould return{"error":"Missing signature"}. If it returns "Webhook secret not configured", the secret was not saved. - Open any payable USD invoice's public link — the Pay via Bank Transfer button should now lead to Stripe's hosted bank payment page.
- Recommended: pay a small internal test invoice from a real bank account and confirm the payment verifies itself automatically after it settles (about 4 business days).
What changes for the tenant
- Bank payments become real Stripe-processed ACH debits. The client authorizes the payment via bank login or by entering account and routing numbers on Stripe's secure page.
- The payment appears immediately on the invoice as a pending (unverified) payment and verifies itself automatically when it settles. No manual confirmation is needed for these payments.
- If a debit fails after initiation (insufficient funds, closed account, etc.), the pending payment is removed automatically and every tenant admin receives a notification.
- While a bank payment is pending on an invoice, a second bank payment on that invoice is blocked.
- Stripe's ACH fee is 0.8%, capped at $5 per payment. Note: if the tenant passes processing fees on to clients, Xagle currently applies the same fee percentage to ACH as to cards.
- Setting ACH Direct Debit back to No instantly restores the manual bank transfer form — nothing else needs to be undone.
Saved bank accounts & automatic payments
With ACH enabled, clients can also save a bank account on file for subscriptions and automatic payments — exactly like a card on file:
- Client-side: in the client center or on a public subscription invoice, the payment details window offers “Use a bank account (ACH) instead”. The client connects their bank through Stripe (bank login for instant verification, or account and routing numbers) and authorizes future debits.
- Staff-side: on the client's page in Xagle admin, the same option is available from the card window. Staff should have the client's written debit authorization on file before saving a bank account on their behalf.
- If instant verification is not available, Stripe sends a small micro-deposit with a 6-digit code; the bank account shows as pending until the client confirms the code via the verification link. It becomes the default payment method automatically once verified.
- Automatic payments from a bank account appear as pending (unverified) payments when initiated and verify themselves when the debit settles a few business days later. Failed debits are removed automatically, admins are notified, and permanently failed bank accounts (closed account, authorization revoked) are marked declined and are not retried.
- No processing/convenience fee is ever applied to ACH payments — fees apply to credit card payments only.