Withdraw
Customers request to cash out their wallet balance at /wallet-central/withdraw/.
What Customers See
┌──────────────────────────────────────────────┐
│ H1: Withdraw │
│ Sub: Cash out from wallet to bank/PayPal/Stripe │
├──────────────────────────────────────────────┤
│ Bank picker (radio cards) │
│ ◯ Bank transfer ◯ PayPal ◯ Stripe │
├──────────────────────────────────────────────┤
│ Quick chips ₹500 ₹1000 ₹2500 [All] │
│ Amount input [ ₹___ ] │
├──────────────────────────────────────────────┤
│ Summary card │
│ Amount ₹1000.00 │
│ Fee (2.5%) ₹25.00 │
│ You receive ₹975.00 │
├──────────────────────────────────────────────┤
│ Method-specific details panel │
│ Bank: account name / number / IFSC │
│ PayPal: email │
│ Stripe: connect account status │
├──────────────────────────────────────────────┤
│ [ Submit withdrawal ] │
└──────────────────────────────────────────────┘

How It Works
- Pick a method (Bank / PayPal / Stripe — only what admin enabled)
- Pick a quick chip or type an amount
- Summary card recomputes live (fee + you-receive)
- Fill method-specific details (saved for next time)
- Submit → status
pending, balance held by the system, admin reviews

KYC Gate
If admin requires KYC for withdrawals, customers without approved KYC see a locked card instead of the form:
┌──────────────────────────────────────────────┐
│ 🔒 KYC required │
│ Verify your identity to withdraw. │
│ [ Verify now ] │
└──────────────────────────────────────────────┘
Click → drops them into the KYC view.
Disabled State
If admin disabled withdrawals globally:
"Withdrawals are currently disabled."
Quick Chips
Configurable. Default 500, 1000, 2500, 5000. Plus a special Withdraw all link → fills amount with current balance.
Summary Card
Three rows recomputed on every keystroke:
| Row | Source |
|---|---|
| Amount | typed value |
| Fee | admin's fee config (none / fixed / percent) |
| You receive | amount - fee |
Method Details
Bank transfer
Form fields:
| Field | Required |
|---|---|
| Account holder name | yes |
| Account number | yes |
| IFSC / SWIFT / routing | yes |
| Bank name | yes |
| Branch | optional |
Saved per-customer. Pre-filled on next withdrawal.
PayPal
Single field — PayPal email. Saved.
Stripe
Reads customer's Connect account status:
- Connected → "Payouts go to your Stripe account"
- Missing → "Onboard with Stripe" link → triggers Stripe-hosted onboarding
See Stripe Payout.

Limits
Read from admin settings:
| Limit | Behaviour |
|---|---|
| Min withdrawal | submit blocked below |
| Max per request | submit blocked above |
| Daily cap | progress bar in side rail |

Common Scenarios
Customer can't see Stripe option
Admin hasn't enabled Stripe in Wallet → Settings → Withdrawal → Methods.
Customer wants to withdraw the entire balance
"Withdraw all" link → fills amount with their current balance. Summary updates.
Withdrawal stuck on pending
Admin needs to approve. Customer can also see status on the Withdrawals List.
When Something Goes Wrong
| Problem | Fix |
|---|---|
| Form not rendered | KYC gate active OR withdrawal disabled OR no methods enabled |
| Submit returns 403 | Nonce mismatch — clear browser cache, reopen form |
| Fee always 0 | Fee type set to none in admin settings |
| "Withdraw all" greyed | Balance is 0 |
For developers — same handler as legacy + hooks
Same legacy handler
Wallet Central → Withdraw form posts to the same legacy /my-account/wkwc_withdrawal/ endpoint with the same nonce field. Means:
- No new business logic
- Same validation
- Same row written to the withdrawal table
- Same audit / email flow
Wallet Central is purely the UI layer.
Hooks
| Hook | Type | When |
|---|---|---|
wkwp_central_withdraw_chips | filter | mutate quick chips |
wkwp_central_withdraw_methods | filter | mutate radio list |
wkwp_central_withdraw_form_html | filter | rewrite form markup |
wkwp_central_withdraw_submit_url | filter | swap POST target (rare) |
