Admin Wallet Freeze

An admin or shop manager can suspend any customer's wallet from the WordPress user profile. A frozen wallet cannot be used at checkout. The freeze can have an optional expiry date, after which it is automatically lifted the next time the customer visits the checkout. Every freeze and unfreeze action is recorded in the wallet audit log.

Merchant CS Freeze Audit Security

Freezing a wallet

Go to Users > All Users > [customer] > Edit. A Wallet Freeze panel appears below the Wallet Notes section. The panel shows the current freeze status and provides a form to apply a new freeze.

Fill in:

Click Freeze wallet. The panel updates to show the freeze is active, who applied it, when, and the expiry if set.

Unfreezing a wallet

While a wallet is frozen, the panel shows an Unfreeze button. Click it to lift the freeze immediately. The audit log records who unfroze it and when.

ℹ️

Customers cannot lift an admin freeze themselves. This is intentional: the admin freeze is designed for CS suspension, fraud holds, and compliance situations. It is separate from the customer's own self-freeze (Spending Controls), which uses different storage and different semantics.

Auto-thaw on expiry

WalletPro does not run a scheduled job to unfreeze wallets. Instead, expiry is checked lazily: when a frozen customer reaches the WooCommerce checkout, PaymentGateway::is_available() reads the _walletpro_admin_freeze usermeta and compares the stored expiry timestamp against the current time. If the expiry has passed, the usermeta is deleted on the spot and the freeze is treated as not active. The audit log records the auto-thaw event.

This means a wallet whose expiry has passed is still technically frozen in the database until the customer next visits checkout. The freeze will not block non-checkout pages. If you need to confirm whether a freeze has expired, check the expiry date on the profile panel.

Frozen badge on Customer Balances

The Customer Balances page (WooCommerce > Customer Balances) shows a red Frozen badge next to any customer whose wallet has an active admin freeze. The badge only appears for admin-imposed freezes; customer self-freezes are not shown here.

How it interacts with checkout

The freeze check runs inside PaymentGateway::is_available(). This means:

Audit log entries

ActionWhen it is written
wallet_frozenWhen a freeze is applied from the user profile panel.
wallet_unfrozenWhen a freeze is manually lifted, or when auto-thaw fires at checkout.

Storage

The freeze state is stored in WordPress usermeta under the key _walletpro_admin_freeze as a JSON object containing reason, frozen_at (UTC timestamp), frozen_by (user ID of the admin), and expires_at (UTC timestamp or null for indefinite). No separate database table is required.

Hook reference

HookTypePurpose
walletpro_wallet_frozenActionFires after a wallet is frozen. Passes ($user_id, $reason, $expires_at, $frozen_by).
walletpro_wallet_unfrozenActionFires after a wallet is unfrozen (manual or auto-thaw). Passes ($user_id, $unfrozen_by).