Wallet Transfers

Wallet transfers let customers send a portion of their balance directly to another registered customer's wallet. This enables peer-to-peer credit sharing within your store without involving a payment gateway.

Customer Feature My Account Peer-to-Peer Balance Management

Overview

Wallet transfers allow one customer to move credit from their wallet to another customer's wallet using only their email address as the recipient identifier. Transfers are immediate and irreversible once confirmed. Both the sender and recipient receive an email notification when a transfer is completed.

Common use cases include splitting a gift balance, paying a family member for a shared order, or redistributing store credit between accounts a customer controls.

ℹ️

Wallet transfers move real store credit between wallets. Transferred funds carry the same expiry rules as any other credited balance on the recipient's account. The transfer itself does not reset or extend expiry on funds the sender already held.

How It Works

When a customer initiates a transfer:

  1. WalletPro verifies the recipient email maps to an active customer account.
  2. The sender's wallet balance is checked against the requested amount plus any applicable transfer fee.
  3. If the merchant has enabled step-up authentication for transfers, the customer must confirm a one-time code sent to their email before the transfer proceeds.
  4. The debit from the sender and the credit to the recipient are executed atomically, either both succeed or neither does.
  5. Both ledger entries are HMAC-chained into each wallet's audit trail.
  6. Email notifications are dispatched to both parties.

Transfers appear in both customers' transaction histories with a linked reference so either party can identify the counterpart transaction.

Configuration

Transfer settings are found at WooCommerce > WalletPro > Settings > Transfers.

Setting Default Description
Enable wallet transfers Off Master toggle. Must be on for the transfer UI to appear in My Account.
Minimum transfer amount 1.00 Smallest amount a customer can transfer in a single transaction (store currency).
Maximum transfer amount N/A Leave blank for no upper limit. Set a value to cap individual transfers.
Transfer fee type None Options: None, Flat fee, Percentage. Fee is deducted from the sender's wallet on top of the transfer amount.
Transfer fee amount 0.00 Fee value. Interpreted as currency or percentage depending on the fee type selection.
Require step-up authentication Off When enabled, customers must verify a one-time email code before each transfer is processed.
Daily transfer limit per customer N/A Maximum total amount a single customer can send in a rolling 24-hour window. Leave blank to disable.
Restrict transfers to verified accounts only Off When enabled, both sender and recipient must have passed KYC verification. Requires KYC gating to be configured under WooCommerce > WalletPro > Settings > Verification.
Allow transfers to self (multi-account) Off Permits a customer to transfer to a different account that shares the same billing email. Disabled by default to prevent balance laundering between accounts.
Sender notification email (system default) Override the email template sent to the sender on transfer completion. Uses WooCommerce email template engine.
Recipient notification email (system default) Override the email template sent to the recipient on transfer completion.
⚠️

The daily transfer limit and the velocity caps set under WooCommerce > WalletPro > Settings > Velocity apply independently. A customer is blocked if either limit is reached. Review both settings when troubleshooting a declined transfer.

Merchant Setup

  1. Go to WooCommerce > WalletPro > Settings > Transfers.
  2. Check Enable wallet transfers.
  3. Set a Minimum transfer amount appropriate for your store (e.g., 5.00 to discourage micro-transactions).
  4. Optionally set a Maximum transfer amount and a Daily transfer limit per customer.
  5. If your compliance requirements call for it, check Require step-up authentication. Customers will receive a 6-digit email code that expires after 10 minutes.
  6. If you have KYC verification active and want to restrict transfers to verified accounts, check Restrict transfers to verified accounts only.
  7. Click Save changes.

After saving, the Transfer Funds tab appears in the customer's My Account wallet dashboard. No additional configuration is required for the customer-facing UI to function.

Role-Based Restrictions

You can restrict the transfer feature to specific customer roles. Go to WooCommerce > WalletPro > Settings > Role Rules and locate the Can initiate wallet transfers permission row. By default it is granted to all roles with wallet access. Uncheck any role to prevent those customers from sending transfers. Recipients do not need the permission, any customer with a wallet can receive a transfer.

Customer Usage

Sending a Transfer

  1. Log in and navigate to My Account > Wallet.
  2. Select the Transfer Funds tab.
  3. Enter the recipient's email address. WalletPro will verify the email belongs to a registered customer when the form is submitted, it does not show a live lookup to protect account privacy.
  4. Enter the amount to transfer. The current available balance and any applicable fee are displayed below the field so the customer can see the total deduction before confirming.
  5. Optionally add a note (up to 200 characters). The note is visible to both sender and recipient in their transaction histories.
  6. Click Send Transfer.
  7. If step-up authentication is enabled, a confirmation code is sent to the customer's account email. Enter the code in the prompt that appears. The transfer is processed only after the code is validated.

Receiving a Transfer

Recipients do not need to take any action. The credited amount appears in their wallet immediately and is listed in their My Account > Wallet > Transaction History with the transaction type Transfer received and the sender's first name (not full email) as context. A notification email is sent to the address on their account.

Viewing Transfer History

Both sent and received transfers appear in the Transaction History tab of the wallet dashboard. Customers can filter by transaction type and date range. The printable statement (accessible via the Print Statement button) includes transfer rows with the counterpart reference number.

Admin View

Merchants can see all transfers across accounts at WooCommerce > WalletPro > Transactions. Filter by Type: Transfer to isolate transfer records. Each row shows sender, recipient, amount, fee charged, and timestamp. Clicking a row opens the transaction detail, which links to both the sender and recipient wallet ledgers.

To export transfer data, apply the Type: Transfer filter and click Export CSV. The export includes all visible columns plus the internal transfer reference ID. This CSV is GL-friendly and compatible with the scheduled email export feature at WooCommerce > WalletPro > Reports > Scheduled Exports.

Developer Reference

REST API

Transfers can be initiated programmatically via the REST API.

Endpoint: POST /wp-json/walletpro/v1/transfers

Requires authentication as the sending customer (cookie auth or application password). Admins may use any authentication and supply a sender_id to act on behalf of a customer.

Parameter Type Required Description
recipient_email string Required Email address of the recipient customer account.
amount string (decimal) Required Amount to transfer in the store's base currency. Must meet the configured minimum.
note string Optional Customer-visible note attached to both ledger entries. Max 200 characters.
otp string Optional One-time passcode if step-up authentication is required. Omitting this field when step-up is enabled returns a 402 with "code": "otp_required" and triggers code dispatch.
sender_id integer Optional Admin only. WP user ID of the customer whose wallet is debited. Ignored for non-admin requests.

Example request:

// POST /wp-json/walletpro/v1/transfers
{
  "recipient_email": "jane@example.com",
  "amount": "25.00",
  "note": "Split the gift card"
}

Success response 200 OK:

{
  "transfer_id": "txn_8f3a2b1c",
  "sender_transaction_id": "txn_8f3a2b1c_debit",
  "recipient_transaction_id": "txn_8f3a2b1c_credit",
  "amount": "25.00",
  "fee": "0.00",
  "sender_balance_after": "42.50",
  "currency": "USD",
  "created_at": "2026-06-20T14:32:00Z"
}

Step-up authentication required 402:

{
  "code": "otp_required",
  "message": "A verification code has been sent to the account email. Resubmit with the otp field.",
  "data": { "status": 402 }
}

Retrieve a transfer:

// GET /wp-json/walletpro/v1/transfers/{transfer_id}

Returns the same shape as the create response, plus a status field (completed is the only currently possible status for persisted transfers, failed transfers are never stored).

WP-CLI

Admins can perform transfers from the command line:

# Transfer $25 from customer 42 to customer 87
wp wallet transfer 42 87 25.00 --note="Admin-initiated transfer"

# Use email addresses instead of user IDs
wp wallet transfer john@example.com jane@example.com 10.00

# List recent transfers for a customer
wp wallet transactions 42 --type=transfer --limit=20

Hooks

Filter: validate the transfer before it executes

add_filter( 'walletpro_pre_transfer', function( $result, $args ) {
    // $args: sender_id, recipient_id, amount, fee, note
    if ( some_custom_check( $args ) ) {
        return new WP_Error( 'blocked', 'Transfer not permitted.' );
    }
    return $result;
}, 10, 2 );

Action: run code after a transfer completes

add_action( 'walletpro_transfer_completed', function( $transfer ) {
    // $transfer: WalletPro\Transfer object
    // $transfer->sender_id, ->recipient_id, ->amount, ->fee, ->transfer_id
    my_crm_sync_transfer( $transfer );
} );

Webhooks

Enable the transfer.completed event under WooCommerce > WalletPro > Settings > Webhooks to receive a signed POST payload whenever a transfer is processed. The payload matches the REST API create response shape with the addition of a sender_email and recipient_email field for easy identification without an additional API call.

All webhook payloads include an X-WalletPro-Signature header (HMAC-SHA256 of the raw body using your webhook secret). Always verify this signature before acting on the payload in your receiving endpoint.

Audit Trail

Every transfer generates two ledger entries (one debit, one credit) that are part of the HMAC-chained audit log. Each entry references the paired entry's transaction ID via the related_transaction_id field. This linkage is preserved in CSV exports and in the admin transaction detail view, allowing either side of a transfer to be traced to its counterpart without additional queries.

Transfers cannot be reversed through the UI or API. If a reversal is needed, an admin must issue a manual credit to the original sender and a manual debit to the recipient at WooCommerce > WalletPro > Customers > [Customer] > Wallet > Manual Adjustment, noting the original transfer ID in the reason field.