Skip to main content

ACH Bank Transfer

The ACH gateway allows customers to pay directly from their US bank account via the Automated Clearing House (ACH) network. It is the most economical payment option for high-value precious metals purchases because it avoids credit card interchange fees.


Pluginโ€‹

  • Plugin: scottsdale-ach-gateway (custom, located at web/app/plugins/scottsdale-ach-gateway/)
  • Gateway ID: scottsdale_ach_gateway
  • Status: Active in production

See the full ACH Gateway Plugin documentation for implementation details.


Payment Flowโ€‹

At checkout, the customer clicks "Link Your Bank Account" which launches the Plaid Link modal:

  • Customer selects their bank from a list of 10,000+ US institutions
  • Customer logs in to their bank through Plaid's secure hosted interface
  • Plaid returns a public_token to the checkout page

Step 2 โ€” Token Exchangeโ€‹

The checkout JavaScript POSTs the public_token to:

POST /wp-json/scottsdale-ach/v1/exchange-token

The server exchanges the public token for a permanent access_token and account_id via the Plaid API.

Step 3 โ€” Order Creationโ€‹

The customer completes checkout. The ACH gateway:

  1. Retrieves the stored access_token and account_id
  2. Uses Plaid to obtain the customer's routing and account numbers (via Auth product)
  3. Passes the account details to iTransact for ACH debit initiation

Step 4 โ€” ACH Submissionโ€‹

iTransact submits the debit to the ACH network. The order status immediately becomes:

wc-pending-ach  (Pending ACH)

Step 5 โ€” Settlementโ€‹

  • Standard ACH: 3โ€“5 business days
  • Same-day ACH: Available for orders submitted before the cutoff time (if configured)

When settled, iTransact sends a webhook to:

POST /wp-json/scottsdale-ach/v1/webhook

The order status updates to wc-processing.


Returned / Failed ACHโ€‹

If the ACH debit is returned (insufficient funds, invalid account, etc.), iTransact sends a return webhook. The order status updates to wc-payment-declined and the customer is notified by email.


Order Holdingโ€‹

Order Fulfillment Policy

Because ACH payments take 3โ€“5 business days to settle, precious metals orders paid via ACH are not shipped until full settlement is confirmed. This is enforced by order status gating in the fulfillment workflow.


Configurationโ€‹

ENV VariableDescription
PLAID_CLIENT_IDPlaid app client ID
PLAID_SECRETPlaid secret (environment-specific)
PLAID_ENVsandbox, development, or production
ITRANSACT_API_KEYiTransact API key
ITRANSACT_GATEWAY_IDiTransact gateway ID
ITRANSACT_ENVtest or live

REST Endpointsโ€‹

MethodEndpointDescription
POST/wp-json/scottsdale-ach/v1/exchange-tokenExchange Plaid public_token
POST/wp-json/scottsdale-ach/v1/webhookiTransact webhook receiver
GET/wp-json/scottsdale-ach/v1/link-tokenGet Plaid Link token for frontend
DELETE/wp-json/scottsdale-ach/v1/bank-accountRemove saved bank account

Securityโ€‹

  • Bank account credentials are never stored in WordPress
  • Plaid stores credentials; WordPress only stores the Plaid access_token and account_id
  • All webhook payloads from iTransact are validated using HMAC signature verification
  • Plaid Link SDK uses HTTPS-only, rendered in an Plaid-hosted iFrame

Bank Account Managementโ€‹

Customers can save bank accounts for future purchases. Up to 3 bank accounts can be saved per customer. Saved accounts are stored as WooCommerce payment tokens with:

  • user_id โ€” WooCommerce customer ID
  • plaid_access_token โ€” Plaid permanent access token
  • plaid_account_id โ€” specific account at the institution
  • Display: bank name + masked last 4 digits

The customer can see and delete saved accounts from My Account โ†’ Payment Methods.