Dynamic Pricing Recipe
Wholesale Pricing by Role
One catalogue, two prices. No second store, no coupon code, nothing for the customer to type.
Read this first: the price follows the role
A wholesale price in Dynamic Pricing is a rule attached to a WordPress user role. Anyone in that role sees the discounted price the moment they log in — on the shop, on the product page and in the cart. Everyone else sees list price and never knows the rule exists.
That means there is no separate price field to maintain per product, and no code for the customer to remember. It also means the role is the thing you have to get right: whatever puts customers into it — manual assignment, a registration form, a membership plugin — is outside Dynamic Pricing.
What you need
- WooCommerce Dynamic Pricing, activated
- A role for your trade customers. Any role works — one you added yourself, or one a membership plugin created
- At least one customer in it, so you can check the result
Two places to put it
The same discount can be configured store-wide or on a single product. Pick one deliberately, because when both exist the product rule wins — there is a measured table for that at the bottom of this page.
| Use | When |
|---|---|
| Role Pricing (store-wide) | Trade customers get the same percentage off everything. One screen, one row, done |
| Dynamic Pricing tab (per product) | The trade discount varies by product, or only some products have one |
Route 1 — the whole catalogue
- Go to WooCommerce → Dynamic Pricing and open the Role Pricing tab.
- Find the row for your wholesale role. Tick Enabled.
- Set Type to Percentage Discount and Amount to 25.
- Save Changes.
That is the entire configuration. There are no quantity fields on this screen on purpose — a role discount applies to every product, at every quantity.
What the customer is charged
Measured with the rule above, on two products at different list prices:
| Signed in as | List price | Charged |
|---|---|---|
| Retail customer | $100.00 | $100.00 |
| Retail customer | $40.00 | $40.00 |
| Wholesale customer | $100.00 | $75.00 |
| Wholesale customer | $40.00 | $30.00 |
25% off, whatever the product costs. Add a product tomorrow and it is covered without touching the rule.
Route 2 — one product
- Edit the product, and open the Dynamic Pricing tab in the Product data panel.
- Click Add Pricing Group.
- Set Applies To to Specific Roles, then pick your wholesale role from the list that appears.
- Leave Rule Processing Mode on Bulk.
- Fill the row: From 1, To *, type Percentage Discount, amount 25.
- Update the product.
The * in To means “no upper limit”. From 1 to * is how you say “at any quantity” — the same row shape a quantity break uses, with the tiers left out.
What the customer is charged
Measured on a $100.00 product with the rule above:
| Signed in as | Quantity | Unit price | Charged |
|---|---|---|---|
| Not signed in | 1 | $100.00 | $100.00 |
| Not signed in | 4 | $100.00 | $400.00 |
| Retail customer | 1 | $100.00 | $100.00 |
| Retail customer | 4 | $100.00 | $400.00 |
| Wholesale customer | 1 | $75.00 | $75.00 |
| Wholesale customer | 4 | $75.00 | $300.00 |
If you configure both, the product rule wins
A cart line that a product rule has already discounted is left alone by the store-wide role rule. They do not add up, and the customer does not automatically get whichever is cheaper.
Measured with both configured — a store-wide 25% for the wholesale role, and a per-product quantity break giving 10% from 5 units — on a $100.00 product:
| Signed in as | Quantity | Charged | Applied by |
|---|---|---|---|
| Retail customer | 1 | $100.00 | — |
| Retail customer | 5 | $450.00 | the product rule |
| Wholesale customer | 1 | $75.00 | the role rule |
| Wholesale customer | 5 | $450.00 | the product rule |
Look at the last row. At one unit the wholesale customer pays $75.00; at five they pay $90.00 each, because the product's quantity break took the line and the role discount was withheld from it. Buying more made it worse.
That is precedence working as designed rather than a fault, but it is not what a trade customer expects. If wholesale customers buy in quantity, put the whole trade price structure in one place — give the product rule its own Specific Roles tiers, as in Route 2, instead of relying on the store-wide rule to fill the gaps.
Variations on the same rule
| You want | Change |
|---|---|
| A flat amount off rather than a percentage | Type → Price Discount, amount 25 — $25.00 off each unit |
| A set trade price, not a reduction | Type → Fixed Price in the product tab, amount 75 |
| Several trade tiers — silver, gold | One role each, one rule each. Route 1 handles all of them on one screen |
| Trade customers also get quantity breaks | Route 2, with more than one row — see Quantity Breaks |
| A discount for logged-out visitors instead | Applies To → Guests |
| Trade pricing on one category only | The Category Pricing tab, on the same settings screen |