Cashback Rewards

WalletPro can automatically credit a percentage of each completed order back into the customer's wallet, turning every purchase into a reason to return. Cashback accumulates as real wallet balance that customers spend on future orders.

Customer Loyalty Automatic Rewards Rule-Based Role-Aware Per-Product Wallet Balance

Overview

Cashback rewards credit a configurable percentage of a qualifying order's eligible line totals directly into the purchasing customer's WalletPro wallet. Credits are posted when the order reaches the Completed status, not at the moment of checkout, so reversals on cancelled or refunded orders stay clean.

You can set a global rate, override it per product, differentiate it by customer role (with an optional per-role cap), scale it by cart-total tiers, restrict it to or from specific payment gateways, and multiply it during scheduled campaigns. A wholesale buyer, a VIP member, and a regular customer can each earn at a different rate from the same purchase, or not earn at all.

ℹ️

Cashback is credited as wallet balance, not as a coupon or discount code. The customer can spend it on any future order that accepts wallet payments, including partial-payment scenarios where they split the cost between their wallet and another gateway. Lines that are themselves funds purchases (deposits or store-credit products) never earn cashback, so buying credit cannot earn cashback on itself.

How It Works

  1. A customer places and pays for an order.
  2. WalletPro waits until the order transitions to Completed. This is the trigger; it is not configurable.
  3. WalletPro collects the eligible order lines (every line except deposits and store-credit products), then resolves a rate for each one from the layered rules below.
  4. The calculated cashback amount is atomically credited to the customer's wallet through the audit ledger with a transaction type of cashback and the originating order ID recorded as the reference. The award is written once per order; a guard meta flag prevents a completed order from being credited twice.
  5. An order note is added recording the amount awarded to the account balance.
  6. If the originating order is later refunded (in full or in part), WalletPro automatically claws back a prorated slice of the awarded cashback. See Refund clawback below.
ℹ️

Guest orders (no customer account) and orders whose payment gateway is blocked by the gateway gate earn nothing. An order placed entirely of deposit or store-credit products has no eligible lines, so it earns nothing either.

Rate Resolution Order

Each eligible line gets its own rate. WalletPro resolves it in the following priority order (highest wins), and the first rule that yields a positive rate is used:

Priority Rule Type Example
1 Per-product rate A specific product is set to earn 8%
2 Customer role rate Wholesale customers earn 1% regardless of product
3 Cart-total tier rate Orders over $200 earn 4%
4 Global rate All other purchases earn the default percentage

The per-product rate is the only per-line override; the role rate and the tier rate are resolved once for the whole order and applied to every line that has no per-product rate. The role rate is chosen first (the highest rate among the customer's roles), and the tier rate is used only when no matching role rate exists. After all lines are summed, the active campaign multiplier (if any) is applied, and finally the per-order cap is enforced.

ℹ️

There are no per-category cashback rules and no combined role-plus-category rules. Rate differentiation by product is done with the per-product field on the product edit screen, described below. Earlier drafts of this page described a category-rules tab and a role-plus-category tab; neither exists in the plugin.

Configuration

Navigate to WooCommerce > WalletPro > Settings > Cashback. All global cashback options live on this one tab. The per-product rate is set separately on each product (see Per-product rates).

Cashback Settings

Setting Default Description
Enable cashback Off Master toggle. When off, the global rate resolves to 0, so lines that rely on it earn nothing. Disabling this does not remove existing wallet balances.
Cashback percent 0 Default percentage applied to an eligible line that has no per-product rate, no matching role rate, and no matching tier rate. A non-numeric or non-positive value is treated as 0.
Apply cashback to shipping New 1.83.x Off When on, the order's shipping total is added to the cashback base as an extra eligible line. See Apply cashback to shipping.
Role cashback rates (empty) One role per line in the format role | percent | max. The percent overrides the tier and global rates for that role; the optional max is a per-role per-order cap. See Per-role rates and caps.
Cart-total tiers (empty) One tier per line in the format threshold | percent. See Cart-total tiers.
Cashback gateway mode all One of all, allow, or deny. Controls which payment gateways earn cashback. See Gateway allow / deny.
Cashback gateways (empty) Comma-separated payment gateway ids (for example bacs, stripe) used by the allow or deny mode above.
Max cashback per order (empty = no cap) Global cap on the cashback credited from a single order. Leave blank (or set to 0) for no cap. A matching per-role cap takes precedence over this value.
Cashback campaigns (empty) One campaign per line in the format start | end | multiplier, dates as YYYY-MM-DD. See Campaign multipliers.

Per-product Rates

To give a single product its own cashback rate, edit the product and open the General tab of the Product data panel. The Wallet cashback (%) field sets the percentage of that product's line total credited back on completion. This rate overrides the role, tier, and global rates for that line. Leave the field empty to fall back to those rates; only a value greater than 0 is stored, so entering 0 or blank removes the per-product override rather than forcing 0% on the line.

Per-role Rates and Caps

The Role cashback rates textarea holds one role per line using a pipe-separated format. The third column is new in 1.83.x:

role | percent | max
Column Required Description
role Required A WordPress role slug, for example customer or wholesale_customer. The value is sanitised to a key, so use the slug, not the display name.
percent Required The cashback percentage for that role. Only a positive numeric value is kept. This overrides the tier and global rates for customers in that role.
max Optional The per-order cashback cap for that role, in store currency. Only a positive numeric value is kept; omit it (or leave a row with just role | percent) to fall back to the global Max cashback per order.

When a customer has more than one role carrying a rate, the role with the highest rate wins, and that same winning role's max is the one applied. If the winning role has no max (or a non-positive one), the global cap applies instead. So the cap always belongs to the role that actually set the rate, not to some other role the customer happens to hold.

# wholesale earns 1%, capped at $5 per order
wholesale_customer | 1 | 5
# vip earns 5%, no per-role cap, so the global cap applies
vip | 5

To build a tiered loyalty program, create roles such as Silver, Gold, and Platinum, give each an escalating rate (and optionally a higher cap), and use a membership plugin or custom automation to move customers between roles based on lifetime spend.

Apply Cashback to Shipping New 1.83.x

By default cashback is calculated only on eligible product line totals; shipping is ignored. When Apply cashback to shipping is on, the order's shipping total is added to the cashback base as an extra eligible line. Shipping carries no per-product rate, so it earns the order-wide resolved rate (role rate if one matches, otherwise the tier rate, otherwise the global rate).

Shipping is added to the base after the cart-total tier is determined, and the tier is computed from the product subtotal only. As a result, including shipping never lifts an order into a higher tier; it only earns cashback at whatever rate the order already qualified for.

Cart-total Tiers

The Cart-total tiers textarea holds one tier per line as threshold | percent. Each row sets a rate that applies when the eligible product subtotal is at or above the threshold. The tier rate sits below the role rate but above the global rate in the resolution order, so it only takes effect for lines with no per-product rate when the customer's roles carry no rate.

# spend $100+ to earn 3%, $250+ to earn 5%
100 | 3
250 | 5

When the subtotal satisfies more than one tier, the highest threshold the order meets wins. The subtotal used for tiers is the product subtotal only; shipping (even when shipping cashback is on) is never counted toward the threshold.

Gateway Allow / Deny

The gateway gate decides whether an order earns any cashback at all, based on its payment method. It runs before rate resolution, so a blocked gateway suppresses the entire award.

Mode Behavior
all Every gateway earns cashback. The gateways list is ignored. This is the default.
allow Only orders paid with a gateway in the Cashback gateways list earn cashback.
deny Every gateway earns cashback except those in the Cashback gateways list.

List gateway ids comma-separated, for example bacs, cheque, stripe. Use the gateway id (the WooCommerce payment method id), not its checkout label.

Campaign Multipliers

Scheduled campaigns multiply the resolved cashback award for a window of time, on top of the per-product, role, tier, and global rates rather than replacing them. The Cashback campaigns textarea holds one campaign per line as start | end | multiplier with dates in YYYY-MM-DD form (a full YYYY-MM-DD HH:MM:SS timestamp also works).

# double cashback for a weekend, then 1.5x open-ended
2026-07-04 | 2026-07-06 | 2
2026-08-01 | | 1.5

A blank end date means the campaign is open-ended. Boundaries are inclusive at both ends, and times are compared against the same GMT clock the award uses. When more than one campaign window is active at once, the highest multiplier applies. The multiplier scales the summed award before the per-order cap is enforced, so a campaign can never push an award past the role or global cap.

Merchant Setup: Step-by-Step

  1. Go to WooCommerce > WalletPro > Settings > Cashback.
  2. Check Enable cashback.
  3. Set Cashback percent to your baseline percentage (for example 2).
  4. Decide whether to turn on Apply cashback to shipping.
  5. Optionally add Role cashback rates, one per line as role | percent | max, with the max omitted where you want the global cap to apply.
  6. Optionally add Cart-total tiers as threshold | percent to reward larger orders.
  7. Optionally set Cashback gateway mode and the Cashback gateways list to include or exclude specific payment methods.
  8. Optionally set Max cashback per order as a global cap. Leave it blank for no cap.
  9. Optionally add Cashback campaigns as start | end | multiplier for time-boxed promotions.
  10. For any product that needs its own rate, edit the product and set Wallet cashback (%) on its General tab.
  11. Save your changes.

From this point on, every qualifying completed order automatically accrues cashback without further intervention.

Refund Clawback

Cashback reversal is automatic and always on; there is no separate toggle to enable or disable it. When an order that earned cashback is refunded, WalletPro claws back a prorated slice of the awarded amount.

Customer Experience

Viewing Earned Cashback

Customers can see cashback activity in two places within their My Account area:

Spending Cashback

Cashback is ordinary wallet balance. Customers spend it the same way they spend any other wallet funds:

  1. At checkout, the Pay with Wallet option is shown if the customer has a positive balance.
  2. The customer selects how much of their wallet balance to apply (up to the order total, subject to any spending limits the merchant has configured).
  3. The wallet amount is deducted first; any remaining balance is charged to the customer's chosen secondary payment method.

Printable Statement

Customers can download or print a full wallet statement from their wallet dashboard. Cashback entries are labeled with the transaction type Cashback and include the order reference, making it straightforward to reconcile earning history.

Reporting

Cashback is recorded on the wallet ledger as its own transaction type (cashback), so it is tracked everywhere ledger data is surfaced:

See Financial Reports and Analytics for the full reporting surfaces.

Developer Reference

Order and Ledger Footprint

When an order is awarded cashback, WalletPro writes the following so the award is idempotent and reversible:

Item Where Purpose
_account_funds_cashback_done Order meta Set to yes once the award runs, so a re-fired completion event never double-credits.
_account_funds_cashback_amount Order meta The amount awarded, used as the basis for prorated refund clawback.
_account_funds_cashback_clawed Order meta The cumulative amount already clawed back, so repeated partial refunds reverse the right total and no more.
_account_funds_cashback_percent Product meta The per-product rate set by the Wallet cashback (%) field. Stored only when greater than 0.
Ledger entry, type cashback Wallet ledger The credit itself, with the order id as its reference and the note Cashback reward.

The award runs on WooCommerce's woocommerce_order_status_completed action and the clawback on woocommerce_order_refunded. Cashback amounts are computed with arbitrary-precision (bc-math) arithmetic at 4-decimal scale to avoid floating-point drift. For programmatic credits and reads of the wallet ledger in general, see the REST API and Hooks & Filters references.

Edge Cases and Behavior Notes

Scenario Behavior
Order contains only deposit or store-credit products No eligible lines, so no cashback is awarded. Buying wallet credit never earns cashback on itself.
Order paid with a gateway blocked by the gateway gate The whole award is suppressed before any rate is resolved, regardless of the configured rates.
Order is partially refunded A prorated slice of the awarded cashback is clawed back automatically, proportional to the cumulative fraction of order value refunded. This is always on; there is no toggle.
Customer's wallet balance is insufficient to absorb a reversal WalletPro debits whatever balance remains (floored at zero). It does not create a negative balance or pursue the shortfall.
Apply cashback to shipping is on The shipping total is added to the cashback base as an extra line earning the order-wide resolved rate, but it never raises the cart-total tier (the tier is computed from the product subtotal only).
Customer holds multiple roles with rates The highest role rate wins, and that same winning role's per-order cap is applied. If the winning role has no cap, the global cap applies.
Campaign multiplier active The summed award is multiplied by the highest active multiplier, then the per-order cap is enforced, so a campaign can never push an award past the cap.
Guest order (no customer account) Guests do not have a wallet, so no cashback is accrued. The credit is not backdated if the order is later assigned to an account.