Bank Transfers
Accept payments directly from your customers' bank accounts. Great for large amounts or customers who prefer not to use cards.
How Bank Transfers Work
- Customer chooses "Bank Transfer" at checkout
- They enter their bank account details
- Money moves directly from their account to yours
- You get notified when the payment completes
Why use bank transfers?
- • Lower fees than card payments
- • Better for large amounts ($1,000+)
- • Some customers prefer paying this way
- • No chargebacks
Types of Bank Transfers
| Type | Speed | Best For |
|---|---|---|
| ACH (US) | 3-5 business days | Recurring payments, subscriptions |
| SEPA (Europe) | 1-2 business days | European customers |
| Wire Transfer | Same day | Large, urgent payments |
| RTGS (Africa) | Same day | High-value African transfers |
| EFT (Various) | 2-3 business days | Standard bank transfers |
Accept Bank Transfers
To collect a bank transfer payment, create a payment with the bank_transfer method:
POST /v1/payments
{
"amount": 50000,
"currency": "USD",
"payment_method_types": ["bank_transfer"],
"bank_transfer": {
"type": "ach"
},
"customer_email": "customer@example.com",
"description": "Invoice #1234"
}The response includes bank details the customer needs to complete the transfer.
Virtual Bank Accounts
Create unique bank account numbers for each customer. When they send money to that account, we automatically match it to their payment.
// Create a virtual account for a customer
POST /v1/virtual_accounts
{
"customer_id": "cus_abc123",
"currency": "USD",
"description": "Payment account for John Smith"
}
// Response includes the virtual account details
{
"id": "va_xyz789",
"bank_name": "ClapPay Bank",
"account_number": "1234567890",
"routing_number": "021000021",
"customer_id": "cus_abc123"
}Give these details to your customer. Any transfer to this account will be automatically credited to their balance.
Verify Bank Accounts
Before you can debit a customer's bank account (for recurring payments), you need to verify they own it. There are two ways:
Instant Verification (Recommended)
Customer logs into their bank through a secure connection. Takes seconds.
// Create a bank account with instant verification
POST /v1/bank_accounts
{
"customer_id": "cus_abc123",
"verification_method": "instant"
}
// Returns a link for customer to complete
{
"id": "ba_xyz789",
"verification_url": "https://connect.clappay.com/verify/..."
}Micro-deposits
We send two small deposits (like $0.32 and $0.45) to the account. Customer tells us the amounts to prove they can see the account.
// Create bank account with micro-deposits
POST /v1/bank_accounts
{
"customer_id": "cus_abc123",
"account_number": "1234567890",
"routing_number": "021000021",
"verification_method": "micro_deposits"
}
// Later, verify the amounts
POST /v1/bank_accounts/ba_xyz789/verify
{
"amounts": [32, 45]
}Handle Payment Status
Bank transfers can take time. Listen for webhooks to know when payments complete:
| Event | What It Means |
|---|---|
| payment.pending | Transfer started, waiting for funds |
| payment.succeeded | Money received successfully |
| payment.failed | Transfer failed (insufficient funds, etc.) |
| payment.returned | Bank returned the payment |
Don't fulfill orders until you receive payment.succeeded.
Handle Failed Transfers
Bank transfers can fail for several reasons:
| Reason | What To Do |
|---|---|
| Insufficient funds | Ask customer to add money and try again |
| Account closed | Customer needs to use a different account |
| Invalid account | Double-check the account number |
| Bank rejected | Customer should contact their bank |
Best Practices
- Set clear expectations - Tell customers that bank transfers can take 1-5 business days.
- Don't ship until confirmed - Wait for the webhook to confirm the transfer completed.
- Use virtual accounts - They make it easy to match incoming payments to customers.
- Offer multiple options - Let customers choose between cards and bank transfers.
- Watch for returns - Bank transfers can be returned up to 60 days later (unlike chargebacks on cards).