Withdrawals
Withdrawals let customers convert their wallet balance to an external payment method, such as a bank transfer or PayPal payout. Merchants control which methods are available, minimum amounts, and whether requests require manual approval before funds are released.
Overview
When a customer accumulates wallet balance, through top-ups, cashback rewards, or referral credits, they may want to recover that balance as real money rather than spend it in-store. The Withdrawals feature provides a governed pathway for this: the customer submits a request, the merchant reviews it (or approves it automatically), and the payout is dispatched through the merchant's chosen method.
Withdrawal requests are tracked on a per-customer basis with full status history. Every state change is recorded in the tamper-evident HMAC-chained audit ledger, so balance reductions are always traceable.
WalletPro does not initiate the actual bank transfer or PayPal payout on your behalf. It records the request, holds the balance, and notifies you. You complete the external payout through your payment provider's dashboard, then mark the request as paid inside WalletPro.
How It Works
- The customer submits a withdrawal request from their My Account wallet dashboard, specifying the amount and preferred payout method.
- WalletPro immediately deducts the requested amount from the customer's available balance and places it in a Pending hold. The customer cannot spend those funds while a request is pending.
- If Auto-Approve is enabled and the request meets all configured rules, the status advances to Approved automatically. Otherwise, the merchant reviews the request manually.
- The merchant completes the external payout (bank transfer, PayPal, etc.) through their payment provider.
- The merchant marks the request as Completed inside WalletPro. The held balance is permanently deducted and the audit ledger is updated.
- If the merchant rejects the request, the held balance is returned to the customer's available balance and the customer is notified by email.
Request Statuses
| Status | Meaning | Balance Impact |
|---|---|---|
| Pending | Request submitted, awaiting merchant review | Amount is held, not spendable |
| Approved | Merchant has approved; payout not yet sent | Amount remains held |
| Completed | Payout dispatched and confirmed by merchant | Amount permanently deducted |
| Rejected | Request denied by merchant | Held amount returned to available balance |
| Cancelled | Customer cancelled the request before approval | Held amount returned to available balance |
Configuration
Navigate to WooCommerce > WalletPro > Settings > Withdrawals to configure withdrawal behavior.
General Settings
| Setting | Description | Default |
|---|---|---|
| Enable Withdrawals | Master toggle. When off, the Withdraw tab is hidden from My Account and no new requests can be submitted. | Disabled |
| Minimum Withdrawal Amount | The smallest amount a customer may request in a single withdrawal. Requests below this threshold are rejected at submission. | $10.00 |
| Maximum Withdrawal Amount | The largest amount allowed per request. Leave blank for no upper limit. | None |
| Minimum Balance Required | The customer's balance must be at least this amount after the withdrawal to proceed. Useful if you want customers to maintain a minimum buffer. | $0.00 |
| Auto-Approve Withdrawals | When enabled, requests that pass all rules are automatically set to Approved, bypassing the manual review queue. Completed status still requires merchant action. | Disabled |
| Auto-Approve Limit | Only auto-approve requests at or below this amount. Requests above it enter the normal review queue. Only visible when Auto-Approve is enabled. | $50.00 |
| Requests Per Period | Maximum number of withdrawal requests a single customer may submit per rolling period. | 3 per month |
| Allow Customer Cancellation | Lets customers cancel their own Pending requests before the merchant acts on them. | Enabled |
Payout Methods
Go to WooCommerce > WalletPro > Settings > Withdrawals > Payout Methods to define which options appear to customers.
| Setting | Description |
|---|---|
| Enable Bank Transfer | Shows a bank transfer option. Customers provide account name, routing number, and account number when submitting the request. |
| Enable PayPal | Shows a PayPal option. Customers provide their PayPal email address. |
| Enable Other / Custom | Shows a free-text field labeled with the Custom Method Label you specify (e.g., "Venmo", "Cheque"). |
| Custom Method Label | The label shown to customers for the custom payout option. |
| Payout Instructions | A short message shown to customers after they submit a request. Use this to set expectations (e.g., "Payouts are processed within 5 business days."). |
Notifications
Navigate to WooCommerce > WalletPro > Settings > Withdrawals > Notifications.
| Setting | Description |
|---|---|
| Notify Admin on New Request | Sends an email to the store admin email when a customer submits a withdrawal request. |
| Admin Notification Email | Override address for withdrawal notifications. Defaults to the WooCommerce store admin email. |
| Customer: Request Received | Sends the customer a confirmation email when their request is submitted. |
| Customer: Request Approved | Notifies the customer when the merchant approves their request. |
| Customer: Request Completed | Notifies the customer when the payout has been sent and the request is marked Completed. |
| Customer: Request Rejected | Notifies the customer when a request is rejected, including any rejection note you enter. |
Merchant: Managing Withdrawal Requests
Viewing the Request Queue
Go to WooCommerce > WalletPro > Withdrawals. The table lists all requests across all customers with columns for: customer name, amount, payout method, submitted date, and current status.
Use the Status filter dropdown and the Date Range picker to narrow the list. You can also search by customer name or email using the search box at the top right.
Approving a Request
- Click a request row to open the detail panel.
- Review the customer's payout details (bank account, PayPal email, etc.).
- Complete the external payout through your payment provider (this happens outside WalletPro).
- Return to the request detail panel and click Mark as Completed. You may optionally enter a reference number (e.g., a bank transfer ID) in the Payout Reference field, this is stored on the record and visible to the customer.
- Click Confirm. The balance is permanently deducted and the audit ledger entry is written.
Always complete the external payout before clicking Mark as Completed in WalletPro. Once you confirm, the balance deduction is permanent and cannot be reversed through the UI, you would need to manually credit the customer's wallet if a mistake is made.
Rejecting a Request
- Open the request detail panel.
- Click Reject Request.
- Enter a reason in the Rejection Note field. This note is included in the customer notification email.
- Click Confirm Rejection. The held balance is immediately returned to the customer's available wallet balance.
Bulk Actions
From the Withdrawals list, check multiple requests and use the Bulk Actions dropdown to:
- Approve selected, Advance Pending requests to Approved status.
- Mark completed, Mark Approved requests as Completed. Use this after processing a batch of payouts externally.
- Reject selected, Reject all selected Pending or Approved requests. You will be prompted for a shared rejection note.
Exporting Requests
Click Export CSV at the top of the Withdrawals list to download the currently filtered set of requests. The export includes: request ID, customer name, customer email, amount, payout method, payout details, submitted date, completed date, payout reference, and status.
This export is suitable for reconciliation with your bank or PayPal payout records.
Customer: Submitting a Withdrawal Request
Where to Find It
Customers navigate to My Account > Wallet > Withdraw. The tab is only visible when the merchant has enabled withdrawals and the customer has a positive balance.
Submitting a Request
- On the Withdraw tab, enter the desired withdrawal amount. The available balance and any applicable minimums/maximums are shown below the field.
- Select a Payout Method from the options the merchant has enabled.
- Fill in the required payout details for the selected method:
- Bank Transfer: Account holder name, routing number, account number.
- PayPal: PayPal email address.
- Custom method: The free-text field as labeled by the merchant.
- Click Submit Request.
- A confirmation message displays the request ID and the merchant's payout instructions. A confirmation email is sent if the merchant has that notification enabled.
Tracking Request Status
The Withdraw tab shows a Request History table below the submission form, listing all the customer's past and current requests with their status and submitted date. Customers can click a request to view its detail, including the payout reference number if one was entered by the merchant.
If Allow Customer Cancellation is enabled by the merchant, a Cancel button appears next to Pending requests. Clicking it immediately returns the held amount to the customer's available balance.
Customers can print their full wallet statement, including withdrawal records, from My Account > Wallet > Statement. Each withdrawal entry shows the request ID, amount, date, and status.
Audit Trail
Every withdrawal state transition is recorded in WalletPro's HMAC-chained audit ledger. Ledger entries include:
- The acting user (customer who submitted, admin who approved/rejected)
- Timestamp
- Previous and new balance values
- Request ID and status transition
- Payout reference (if provided)
You can view the ledger for a specific customer at WooCommerce > WalletPro > Customers > [Customer Name] > Ledger. Withdrawal entries are prefixed with the entry type withdrawal_debit or withdrawal_hold.
Developer Reference
REST API
Full withdrawal endpoints are available under the walletpro/v1 namespace. See the REST API reference for authentication details.
List Withdrawal Requests
// GET /wp-json/walletpro/v1/withdrawals
// Query params: customer_id, status, per_page, page, after, before
fetch('/wp-json/walletpro/v1/withdrawals?status=pending&per_page=20', {
headers: {
'Authorization': 'Bearer <token>'
}
});
Example response:
{
"requests": [
{
"id": 1042,
"customer_id": 88,
"amount": "75.00",
"currency": "USD",
"status": "pending",
"payout_method": "bank_transfer",
"payout_details": {
"account_holder": "Jane Smith",
"routing_number": "****6789",
"account_number": "****4321"
},
"payout_reference": null,
"submitted_at": "2026-06-18T14:23:00Z",
"updated_at": "2026-06-18T14:23:00Z"
}
],
"total": 1,
"pages": 1
}
Update Request Status
// PATCH /wp-json/walletpro/v1/withdrawals/{id}
fetch('/wp-json/walletpro/v1/withdrawals/1042', {
method: 'PATCH',
headers: {
'Authorization': 'Bearer <token>',
'Content-Type': 'application/json'
},
body: JSON.stringify({
"status": "completed",
"payout_reference": "TXN-20260618-002"
})
});
Valid status transitions via API:
| Current Status | Allowed Next Statuses |
|---|---|
| pending | approved, rejected |
| approved | completed, rejected |
| completed | None (terminal) |
| rejected | None (terminal) |
| cancelled | None (terminal) |
Hooks and Filters
Use these hooks to extend or modify withdrawal behavior.
walletpro_before_withdrawal_submit
Fires before a withdrawal request is saved. Return a WP_Error to block the submission and surface an error message to the customer.
add_filter( 'walletpro_before_withdrawal_submit', function( $error, $customer_id, $amount, $method ) {
// Block withdrawals for customers without a verified email
if ( ! email_exists( get_userdata( $customer_id )->user_email ) ) {
return new WP_Error( 'unverified_email', 'Please verify your email before requesting a withdrawal.' );
}
return $error;
}, 10, 4 );
walletpro_withdrawal_status_changed
Fires after a withdrawal request transitions to a new status.
add_action( 'walletpro_withdrawal_status_changed', function( $request_id, $new_status, $old_status, $customer_id ) {
if ( $new_status === 'completed' ) {
// Trigger your own payout reconciliation logic
my_reconcile_payout( $request_id );
}
}, 10, 4 );
walletpro_withdrawal_payout_methods
Filter the list of payout methods available to a customer. Return a modified array to add or remove methods dynamically.
add_filter( 'walletpro_withdrawal_payout_methods', function( $methods, $customer_id ) {
// Only offer bank transfer to wholesale role customers
if ( ! user_can( $customer_id, 'wholesale_customer' ) ) {
unset( $methods['bank_transfer'] );
}
return $methods;
}, 10, 2 );
WP-CLI
# List all pending withdrawal requests
wp wallet withdrawals list --status=pending
# Approve a specific request
wp wallet withdrawals approve 1042
# Mark a request as completed with a payout reference
wp wallet withdrawals complete 1042 --reference="TXN-20260618-002"
# Reject a request with a reason
wp wallet withdrawals reject 1042 --reason="Unable to verify bank details"
# Export all completed withdrawals from June 2026 to CSV
wp wallet withdrawals export --status=completed --after=2026-06-01 --before=2026-06-30 --format=csv > june-payouts.csv
Webhooks
WalletPro fires signed outbound webhooks for each withdrawal state change. See the Webhooks reference for signature verification details.
Relevant events:
| Event | Fires when |
|---|---|
withdrawal.created |
A customer submits a new withdrawal request |
withdrawal.approved |
A request is moved to Approved status |
withdrawal.completed |
A request is marked Completed by the merchant |
withdrawal.rejected |
A request is rejected by the merchant |
withdrawal.cancelled |
A customer cancels their own pending request |
Example withdrawal.completed payload:
{
"event": "withdrawal.completed",
"timestamp": "2026-06-20T09:41:00Z",
"data": {
"id": 1042,
"customer_id": 88,
"amount": "75.00",
"currency": "USD",
"payout_method": "bank_transfer",
"payout_reference": "TXN-20260618-002",
"completed_at": "2026-06-20T09:41:00Z"
}
}
```