Money Requests
Money Requests lets a customer send a formal request for wallet credit to another customer by email address. The recipient receives a notification and can fulfill the request by transferring funds from their own wallet balance, making split-bill scenarios, group contributions, and peer-to-peer reimbursements possible without leaving your store.
Overview
Money Requests build on top of the Wallet Transfers engine. Rather than pushing funds to someone, the requesting customer pulls, they specify an amount and an optional message, and WalletPro notifies the target customer via email. The target customer can then accept or decline from their own My Account wallet dashboard.
Key characteristics:
- Requests are denominated in the store's base wallet currency.
- Both parties must have a WalletPro wallet account. Requests sent to an email address that has no wallet are held pending until the merchant enables guest-request mode or the recipient registers.
- A request does not place a hold on either party's balance. Funds only move at the moment of acceptance.
- Declined and expired requests create no ledger entry and are simply closed.
- All accepted transfers are recorded in the HMAC-chained audit ledger with a
transfer_requesttransaction type, linking both the sender's debit and the requester's credit to the same request ID.
Money Requests require the Wallet Transfers feature to be enabled. If transfers are disabled in WooCommerce > WalletPro > Transfers, the Money Requests tab will not appear in My Account and the feature will not be accessible.
How It Works
The lifecycle of a money request moves through the following states:
| State | Description | Ledger Entry Created |
|---|---|---|
pending |
Request has been sent; waiting for recipient action. | No |
accepted |
Recipient approved and funds were transferred successfully. | Yes (debit + credit pair) |
declined |
Recipient explicitly declined the request. | No |
expired |
Request was not acted on within the expiry window. | No |
cancelled |
Requester withdrew the request before a decision. | No |
failed |
Recipient accepted but the transfer could not complete (e.g., insufficient balance at acceptance time). | No |
When a request moves to accepted, WalletPro performs an atomic debit/credit pair identical to a manual wallet transfer. The requester receives a notification confirming the funds arrived. If the recipient's balance is insufficient at the time they attempt to accept, the request moves to failed and no funds move; the recipient is shown an inline error and may top up their wallet before trying again.
Configuration
Money Request settings live at WooCommerce > WalletPro > Transfers > Money Requests.
| Setting | Default | Description |
|---|---|---|
| Enable Money Requests | On | Master toggle. When off, the tab is hidden from My Account and all API endpoints return 403. |
| Request expiry (days) | 7 | Number of days before a pending request is automatically marked expired. Set to 0 to disable expiry. |
| Maximum request amount | (blank = unlimited) | Per-request ceiling in the store's wallet currency. Applies to all customers unless overridden by a role-based rule. |
| Maximum pending requests per customer | 10 | How many open outgoing requests one customer may hold at a time. Prevents spam. |
| Allow requests to unregistered emails | Off | When on, a request can be sent to any email. If that email registers later, the pending request becomes visible in their dashboard. |
| Require message for requests | Off | Forces the requester to include a note before submitting. Useful for accountability in B2B contexts. |
| Notify merchant on acceptance | Off | Sends the admin email a summary whenever a money request is fulfilled. |
| Step-up authentication on accept | Off | Requires the recipient to re-enter their password before the transfer is executed. Inherits from the global step-up auth setting if left at "Inherit". |
For subscription or membership stores, consider setting Maximum pending requests per customer to a low value (3 to 5) to prevent customers from pre-staging large numbers of requests as a workaround for velocity caps on direct transfers.
Merchant Setup
Follow these steps to enable Money Requests for your customers:
- Go to WooCommerce > WalletPro > Transfers and confirm Enable Wallet Transfers is checked.
- Open the Money Requests sub-tab within the Transfers settings panel.
- Check Enable Money Requests.
- Set Request expiry (days) to your preferred window. Seven days is appropriate for most stores.
- Optionally set Maximum request amount to cap per-request exposure.
- Click Save changes.
- Confirm the feature appears in a test account: navigate to My Account > Wallet > Money Requests and verify the tab is visible.
Role-Based Overrides
If you have role-based rules configured under WooCommerce > WalletPro > Rules, you can set per-role ceilings for request amounts. A rule targeting the customer role with a Money request ceiling field will override the global maximum for that role. Wholesale or VIP roles can be given higher limits this way.
Viewing and Managing Requests in Admin
Merchants can see all requests at WooCommerce > WalletPro > Money Requests. The table shows:
- Request ID
- Requester (customer name and email)
- Recipient (customer name and email, or raw email if unregistered)
- Amount requested
- Message (truncated, expandable)
- Status
- Created date / Expiry date
Admins can manually cancel any pending request using the row action Cancel Request. This moves the request to cancelled state and sends a notification to both parties. Admins cannot accept a request on a customer's behalf through the UI; use the REST API for programmatic fulfillment.
To export the request log, click Export CSV above the table. The export honours the active filters (status, date range, customer search).
Customer Usage
Sending a Money Request
- Log in and go to My Account > Wallet.
- Click the Money Requests tab.
- Click New Request.
- Enter the recipient's email address in the Request from field.
- Enter the amount in the Amount field. The store currency is shown as a label.
- Optionally type a note in the Message field (required if the merchant has enabled Require message for requests).
- Click Send Request.
After submission, the request appears in the Sent Requests list with a pending badge. The recipient receives an email notification with a direct link to their Money Requests dashboard.
Cancelling an Outgoing Request
While a request is still pending, the requester can cancel it by clicking Cancel in the Sent Requests list. Once cancelled, the recipient's notification link will show an "This request has been cancelled" message.
Responding to an Incoming Request
- Click the link in the notification email, or go to My Account > Wallet > Money Requests > Received Requests.
- Locate the request. The panel shows the requester's name, the amount, and any message they included.
- Click Accept to transfer the funds, or Decline to reject the request.
- If step-up authentication is enabled, you will be prompted to enter your account password before the transfer proceeds.
- On success, a confirmation banner appears and both parties receive an email confirmation. The funds appear immediately in the requester's wallet balance.
If your wallet balance is lower than the requested amount at the time you click Accept, the transfer will fail. You will need to top up your wallet first and then retry. The request remains in pending state after a failed acceptance attempt so you can try again without asking the requester to resend.
Request History
The Money Requests tab shows two lists:
- Sent Requests, requests the customer initiated, with status and the recipient's masked email.
- Received Requests, requests directed at the customer, with the requester's display name and amount.
Completed and historical requests are visible but no action buttons are shown for terminal states (accepted, declined, expired, cancelled, failed). Customers can print their wallet statement from My Account > Wallet > Statement; accepted money requests appear as Transfer In or Transfer Out line items with the request ID in the reference column.
Email Notifications
WalletPro sends the following emails related to Money Requests. All templates are editable at WooCommerce > Settings > Emails.
| Email ID | Recipient | Trigger |
|---|---|---|
walletpro_money_request_received |
Recipient customer | Request created and delivered |
walletpro_money_request_accepted |
Requester customer | Recipient accepted; funds transferred |
walletpro_money_request_declined |
Requester customer | Recipient declined |
walletpro_money_request_cancelled |
Recipient customer | Requester or admin cancelled the request |
walletpro_money_request_expired |
Requester customer | Request passed its expiry date without action |
walletpro_money_request_admin_accepted |
Admin email | Request accepted (only if Notify merchant on acceptance is on) |
Developer Reference
REST API
Base path: /wp-json/walletpro/v1/money-requests
List Requests
# List requests for the authenticated customer (or all if admin)
GET /wp-json/walletpro/v1/money-requests
| Parameter | Type | Required | Description |
|---|---|---|---|
direction |
string | optional | sent or received. Omit for all. |
status |
string | optional | Filter by state: pending, accepted, declined, expired, cancelled, failed. |
per_page |
integer | optional | Results per page (default: 20, max: 100). |
page |
integer | optional | Page number (default: 1). |
Create a Request
POST /wp-json/walletpro/v1/money-requests
# Request body (JSON)
{
"recipient_email": "friend@example.com",
"amount": 25.00,
"message": "Your share of the team lunch"
}
Response (201 Created):
{
"id": 4821,
"status": "pending",
"requester_id": 101,
"recipient_email": "friend@example.com",
"recipient_id": 204,
"amount": "25.00",
"currency": "USD",
"message": "Your share of the team lunch",
"expires_at": "2026-06-27T00:00:00Z",
"created_at": "2026-06-20T14:32:11Z"
}
Accept a Request
POST /wp-json/walletpro/v1/money-requests/{id}/accept
Must be authenticated as the recipient. Returns the updated request object with "status": "accepted" and a transfer_id field referencing the ledger entry pair.
Decline a Request
POST /wp-json/walletpro/v1/money-requests/{id}/decline
Must be authenticated as the recipient. Returns the updated request object with "status": "declined".
Cancel a Request
DELETE /wp-json/walletpro/v1/money-requests/{id}
Must be authenticated as the requester or an admin. Returns 204 No Content on success.
WP-CLI
# List pending requests for a customer
wp wallet requests list --customer=204 --status=pending
# Cancel a specific request by ID
wp wallet requests cancel 4821
# Accept a request as the recipient (admin override)
wp wallet requests accept 4821 --recipient=204
# Expire all overdue requests (useful after toggling expiry settings)
wp wallet requests expire-overdue --dry-run
wp wallet requests expire-overdue
Hooks and Filters
| Hook | Type | Description |
|---|---|---|
walletpro_before_money_request_created |
action | Fires before a request is persisted. Receives $requester_id, $recipient_email, $amount. |
walletpro_money_request_created |
action | Fires after the request row is saved. Receives the WalletPro\Models\MoneyRequest object. |
walletpro_money_request_accepted |
action | Fires after a successful transfer. Receives $request, $transfer_id. |
walletpro_money_request_declined |
action | Fires when a request is declined. Receives the $request object. |
walletpro_money_request_max_amount |
filter | Override the maximum allowed request amount per customer. Receives $max (float), $requester_id. Return a float or null for unlimited. |
walletpro_money_request_expiry_days |
filter | Override expiry duration per request. Receives $days (int), $request object. Return 0 to disable expiry for that request. |
Example: disable expiry for VIP customers.
add_filter( 'walletpro_money_request_expiry_days', function( $days, $request ) {
if ( user_can( $request->requester_id, 'walletpro_vip' ) ) {
return 0; // Never expire for VIP tier
}
return $days;
}, 10, 2 );
Webhooks
If signed outbound webhooks are configured, WalletPro fires the following events for Money Requests:
money_request.createdmoney_request.acceptedmoney_request.declinedmoney_request.cancelledmoney_request.expired
The payload structure mirrors the REST API response object with an added event field and a X-WalletPro-Signature header for verification.