Send Money
Customer sends wallet money to another customer at /wallet-central/send/. OTP-confirmed.
What Customers See
┌──────────────────────────────────────────────┐
│ H1: Send money │
│ Sub: Transfer wallet to another customer │
├──────────────────────────────────────────────┤
│ Recipient [ [email protected] ▼ ] │
│ (autocomplete) │
│ Amount [ ₹___ ] │
│ Note (optional) [_________________] │
├──────────────────────────────────────────────┤
│ Summary │
│ Amount ₹250.00 │
│ Fee (1%) ₹2.50 │
│ Total debit ₹252.50 │
├──────────────────────────────────────────────┤
│ [ Continue ] │
└──────────────────────────────────────────────┘
(After Continue → OTP screen)
┌──────────────────────────────────────────────┐
│ Enter OTP │
│ Sent to your email + phone │
│ [_][_][_][_][_][_] │
│ [ Resend OTP ] │
│ [ Verify & Send ] │
└──────────────────────────────────────────────┘

How It Works
- Pick recipient (autocomplete by email or username)
- Type amount + optional note
- Summary recomputes (fee + total debit)
- Continue → OTP sent to email + SMS
- Enter the 6-digit OTP
- Done — sender debited, recipient credited, both get confirmation

Recipient Autocomplete
Server-side lookup as customer types. Returns up to 10 matches with avatar + name + email. Click to fill.
Saved Payees
Last 5 transfer recipients shown as chips above the form. Click chip → recipient pre-filled.
KYC Gate
If admin requires KYC for transfers and customer isn't approved:
🔒 KYC required
Verify identity to send money.
[ Start KYC ]
Self-Lock
Customer can lock their own transfers from Settings → "Disable transfers (security)". Useful if they suspect their account is compromised.
When locked:
🔒 Transfers locked
Re-enable in Settings.
OTP Errors
| Error | Display |
|---|---|
invalid_otp | "Wrong code. Try again." |
expired_otp | "Code expired. [ Resend OTP ]" |
insufficient_balance | "Not enough balance. [ Add money ]" |
kyc_required | "Recipient or you not KYC-approved." |
recipient_invalid | "Email / username not found." |
Limits
| Limit | Source |
|---|---|
| Min amount | admin Transfer settings |
| Max per request | admin Transfer settings |
| Daily cap | admin Transfer settings |
Common Scenarios
Customer types friend's email, no autocomplete
Friend doesn't have an account yet. Send isn't possible — they need to register first.
"OTP not received"
Check phone number on file + Twilio config. Email OTP should still arrive — try that.
Self-lock for security
Customer can toggle off in Settings. Sender side blocks any attempt.
When Something Goes Wrong
| Problem | Fix |
|---|---|
| Recipient not found | Try email instead of username; check the lookup mode |
| OTP not received | Phone meta missing; Twilio creds wrong; check spam |
kyc_required after approval | Cache stale — toggle KYC status in admin to force bust |
| Daily cap hit unexpectedly | Sum sent today; admin Transfer settings |
For developers — same handler as legacy + hooks
Same engine
Wallet Central → Send POSTs to the same OTP REST endpoint as the legacy transfer flow. No new business logic, no new audit rows. UI layer only.
Hooks
| Hook | Type | When |
|---|---|---|
wkwp_central_send_recipient_search_results | filter | mutate autocomplete results |
wkwp_central_send_form_html | filter | rewrite form HTML |
wkwp_central_send_otp_methods | filter | which channels send OTP (email, sms) |
wkwp_central_send_after_success | action | analytics hook |
