Wholesale Pricing
Wholesale buyers expect their own prices, and most shoppers expect a break for buying ten. WooCommerce gives each product one price, so stores add a wholesale plugin, then a tiered pricing plugin, then fight to make both agree with the cart, the currency switcher and the product feed.
Wholesale Pricing gives wholesale roles their own prices and adds quantity breaks for everyone. You set price rows on a product, a variation, a category or store-wide. Wholesale customers see their price and a quantity table on the product page, the cart works out every line on the server, and signed-out visitors keep seeing your public prices.
Set Up Wholesale Roles
- Open Stackless → Dashboard and switch on Wholesale Pricing. It’s in the Catalog group. It adds a Wholesale customer role with the same access as a regular customer.
- Go to Users, open each wholesale buyer and set their role to Wholesale customer.
- Open Stackless → Settings → Wholesale Pricing and check the settings below.
- Wholesale roles: customers with these roles get wholesale prices. It starts with Wholesale customer, and you can add any role except Administrator.
- Store-wide discount: [role]: a percentage off every product that has no rows of its own or in its categories. There’s one box per wholesale role, shown after you save the roles. Empty means none.
- Quantity breaks count: Every variation of a product together (the default), or Each cart line on its own.
- Quantity table: shows the viewer’s price for each quantity on product pages. On by default.
- Price label: text shown beside the price for wholesale customers, such as “Wholesale price”. Empty shows nothing.
There’s no wholesale sign-up form. You decide who gets the role.
Add Price Rows
Open a product and go to Product data → Wholesale. The tab shows on simple and variable products. Click Add price row and fill in:
| Column | What it does |
|---|---|
| Who | A wholesale role, or Everyone (quantity break) |
| From qty | The quantity where this price starts |
| Price rule | % off, Amount off per unit or Fixed unit price |
| Amount | The percentage, or the amount in your store currency |
Rows apply to the product’s current price, which is its sale price while a sale runs. A percentage is capped at 100, and a price never goes below zero. Each product, variation or category holds up to 30 rows.
These rows give wholesale customers 20% off, 30% off from 50 units, and everyone 5% off from 10 units:
| Who | From qty | Price rule | Amount |
|---|---|---|---|
| Wholesale customer | 1 | % off | 20 |
| Wholesale customer | 50 | % off | 30 |
| Everyone (quantity break) | 10 | % off | 5 |
Everyone rows start at 2 units. A row set to 1 is saved as 2, so the single-unit price that signed-out visitors, caches and the product feed see never changes.
Variations and Categories
- Variations: each variation has a Wholesale and quantity prices block. Leave it empty to use the product’s rows.
- Categories: under Products → Categories, adding or editing a category shows the same editor. Its rows apply to products in that category that have no rows of their own.
Which Rows Win
For each audience, Stackless uses the first place in this list that has rows for it:
- The variation
- The product
- The product’s categories, taken together
- The store-wide discount for the role
Each audience is looked up on its own. A product’s Everyone row for 10 units doesn’t hide a category’s wholesale rows or the store-wide discount for the role.
For a quantity, the row with the highest From qty at or below it applies. A customer who fits more than one row, like two wholesale roles or a role plus Everyone, pays the lowest of those prices. A rule that would raise the price, such as a fixed unit price above a sale price, is skipped.
What Customers See
Wholesale customers see:
- their single-unit price on product and shop pages, with the regular price struck through and your Price label beside it. Variable products show their price range at wholesale prices.
- a Price per unit table with each quantity range and its unit price, such as “1 to 49” and “50 or more”. It sits below the product summary, or after the add-to-cart block on block themes. On variable products it appears once a variation is picked.
- a note on each cart and checkout line: Price: Wholesale price (or your label), or Price: 50+ unit price
Signed-out visitors and customers without a wholesale role see your normal price. When a product has Everyone rows, they see the quantity table too, and the cart gives them the break. The table only shows when there’s a break to show, and its prices follow your shop’s tax display setting.
How the Cart Prices Lines
- Every time totals are calculated, each line is priced on the server from the product’s saved price. Nothing the browser sends sets the price.
- Changing the quantity moves a line up or down a tier. Dropping below a break puts the normal price back.
- With Every variation of a product together, 5 red and 5 blue shirts count as 10 for a 10-unit break. With Each cart line on its own, they count as 5 each.
- A line another module has already priced, such as a Pay What You Like amount, is left alone.
Multi-Currency
With Multi-Currency, the product page and the cart always agree:
- A percentage applies to the price the visitor would see in their currency: the product’s currency price if you set one, or the converted price.
- Amount off per unit and Fixed unit price are entered in your store currency and converted at the current rate.
Hide Price Until Login and the Product Feed
- Hide Price Until Login still decides who sees a price at all, and it wins over wholesale prices for anyone it hides prices from. If you limit its Roles that see prices, include your wholesale roles.
- The Google Product Feed keeps your public prices. It’s built without a signed-in customer, and Everyone rows never change the single-unit price.
Limits
- Everyone rows start at 2 units, so a quantity break can’t change the single-unit price.
- A cart line another module priced first is left at that price.
- On a product with paid add-ons, in a currency other than your store currency, a percentage tier follows the add-on pricing rules instead of scaling the product’s currency price.
- Wholesale prices are worked out in the cart. Orders you create by hand in the admin use the product’s normal price.
- Up to 30 rows per product, variation or category.
- The module pauses while Wholesale Prices (Wholesale Suite), B2BKing, WooCommerce Dynamic Pricing or Tiered Price Table for WooCommerce is active.
For Developers
stackless_wholesale_pricing_viewer_roles sets the wholesale roles a viewer is priced with. Return an empty array for public prices. stackless_wholesale_pricing_skip_item leaves a cart line out of wholesale pricing:
add_filter('stackless_wholesale_pricing_viewer_roles', function ($roles) {
if (get_user_meta(get_current_user_id(), 'trade_account', true)) {
$roles[] = 'stackless_wholesale';
}
return $roles;
});
add_filter('stackless_wholesale_pricing_skip_item', function ($skip, $cart_item) {
return $skip || !empty($cart_item['my_custom_price']);
}, 10, 2);
The quantity table is a template. Copy stackless/wholesale_pricing/tier-table.php into your theme to change it.