```html

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.

Customer Feature Wallet Transfers Peer-to-Peer My Account Email Notifications

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:

ℹ️

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:

  1. Go to WooCommerce > WalletPro > Transfers and confirm Enable Wallet Transfers is checked.
  2. Open the Money Requests sub-tab within the Transfers settings panel.
  3. Check Enable Money Requests.
  4. Set Request expiry (days) to your preferred window. Seven days is appropriate for most stores.
  5. Optionally set Maximum request amount to cap per-request exposure.
  6. Click Save changes.
  7. 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:

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

  1. Log in and go to My Account > Wallet.
  2. Click the Money Requests tab.
  3. Click New Request.
  4. Enter the recipient's email address in the Request from field.
  5. Enter the amount in the Amount field. The store currency is shown as a label.
  6. Optionally type a note in the Message field (required if the merchant has enabled Require message for requests).
  7. 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

  1. Click the link in the notification email, or go to My Account > Wallet > Money Requests > Received Requests.
  2. Locate the request. The panel shows the requester's name, the amount, and any message they included.
  3. Click Accept to transfer the funds, or Decline to reject the request.
  4. If step-up authentication is enabled, you will be prompted to enter your account password before the transfer proceeds.
  5. 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:

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:

The payload structure mirrors the REST API response object with an added event field and a X-WalletPro-Signature header for verification.

```