WooCommerce Tips

WooCommerce Wholesale Pricing With Minimum Order Quantities: Role-Based Discounts Without a Full B2B Suite

WooCommerce Wholesale Pricing With Minimum Order Quantities: Role-Based Discounts Without a Full B2B Suite
📦

WooCommerce B2B & Wholesale Guide

Wholesale Pricing Without the Full B2B Stack

Role-based discounts, tiered volume pricing, and cart-level order minimums — configured together in WooCommerce without a dedicated B2B suite. Here is what that setup actually covers, and where you still have a gap.

Most B2B WooCommerce setups are either overpowered or underbuilt. A $300/year dedicated B2B suite gives you per-product minimum quantities, per-user price lists, company accounts, and purchase order workflows — most of which you do not need if your wholesale business is three tiers of pricing and a “don’t sell us less than a case” rule. On the other end, a simple coupon or manual price edit gives wholesale customers a discount but none of the quantity discipline you need.

There is a workable middle ground: role-based targeting combined with tiered volume pricing and a cart-level spend threshold as a minimum order proxy. It is not a perfect substitute for a full B2B suite, but it solves the most common wholesale pricing problems without the complexity or cost of one. This guide walks through exactly how that combination works, what it takes to configure it, and — honestly — where the gaps are.

What you are actually trying to solve

Before configuring anything, it helps to be clear about what B2B/wholesale pricing actually requires in most stores. The typical request is a combination of three distinct things:

  • Role visibility: wholesale customers should see different prices than retail customers. Sometimes that means a flat percentage off, sometimes it means a different tiered structure, sometimes it means prices only appear after login.
  • Volume incentives: the more a customer buys, the better the price per unit. This is the tiered pricing question — a $10 product might cost $8.50 at 10 units, $7.50 at 25 units, and $6.50 at 50 units.
  • Minimum order enforcement: wholesale accounts should not be able to place a 2-unit order. You need some floor — either a per-product quantity minimum or a cart-total minimum before wholesale pricing applies or the order can be placed.

A full B2B suite addresses all three with dedicated mechanics. The lightweight approach handles all three too — just with different trade-offs at the third item. Understanding those trade-offs up front saves you from configuring something and then discovering the gap too late.

What WooCommerce handles natively (and what it does not)

WooCommerce’s native user role system is more capable than most store owners realize. WordPress assigns roles to registered users, and WooCommerce respects those roles across its full permission and display system. You can create a custom “Wholesale Customer” role (or use a plugin like User Role Editor, which is free), assign it to approved accounts, and then target any campaign, visibility setting, or restriction to that role specifically.

What WooCommerce does not do natively is apply different prices based on role. The platform’s pricing model is per-product: a sale price is a stored number, and it applies to all customers equally. To get role-based pricing — whether that is a flat discount or a tiered volume structure — you need a plugin that hooks into the price calculation layer and adjusts prices conditionally based on the current user’s role.

WooCommerce also does not have a native per-product minimum quantity field that blocks checkout when the quantity is below a threshold. It has a minimum purchase quantity field on individual products (under Product Data → Inventory), but this sets the minimum for adding to cart, not a minimum for a wholesale-specific rule. For a true wholesale MOQ that applies differently to wholesale vs retail customers, you need either a plugin or the spend-threshold proxy described below.

WooCommerce’s native minimum quantity field

WooCommerce’s “Minimum purchase quantity” (under Product Data → Inventory) applies to all customers, not just wholesale accounts. If you set it to 12, retail customers also can’t add fewer than 12 to their cart. For a role-specific minimum, a spend threshold is the most practical cart-level proxy without a dedicated B2B plugin.

Role-based discounts: targeting your wholesale accounts

User role targeting in Smart Cycle Discounts is included in the free version. When you create a campaign, the campaign settings include an “Audience” section where you choose whether to include or exclude specific WordPress user roles. Setting it to “Include: Wholesale Customer” means only users with that role see the discount — retail visitors and guests see the regular price.

This operates at the campaign level, not the per-product level. A campaign can cover your entire product catalog or a specific selection of products. The role filter applies to the whole campaign, so every product in that campaign respects the targeting rule automatically.

The simplest wholesale setup is a flat percentage campaign: a “Wholesale Pricing” campaign targeting the Wholesale Customer role, applying a 20% discount to all products. Retail customers see no change. Logged-in wholesale accounts see prices 20% lower across the board.

This approach works well for stores where wholesale is genuinely just “same products, better margin” — one flat discount applied uniformly. It gets more useful, and more interesting, when you layer in tiered pricing.

For a broader look at the segmentation strategy behind role targeting — including when to use role exclusion instead of inclusion — the guide to WooCommerce customer segmentation and discounts covers the full range of approaches.

Tiered volume pricing: the quantity break structure

Tiered pricing is a Pro feature in Smart Cycle Discounts. It lets you configure quantity breakpoints on a campaign, so the discount percentage changes based on how many units are in the cart.

For a wholesale campaign, a typical tiered structure might look like this:

Quantity in cart Discount Effect on a $20 product
1 – 9 units No campaign discount (retail price) $20.00 / unit
10 – 24 units 10% off $18.00 / unit
25 – 49 units 20% off $16.00 / unit
50+ units 30% off $14.00 / unit

When this campaign also has the role filter set to “Include: Wholesale Customer,” only wholesale accounts see these tiered prices. A retail customer adding 50 units still sees $20.00 per unit. A logged-in wholesale account adding 50 units sees $14.00.

The tiered discount works on a volume model: the total quantity in the cart determines which tier fires, and that tier’s rate applies to every unit. It is not a bracket model where the first 9 units stay at full price and only units 10 and above get the discount. If a wholesale customer puts 25 units in the cart, all 25 units are priced at 20% off. That is the convention most store owners want for wholesale, and it is the calculation model SCD’s tiered type uses.

The full mechanics of how this quantity-break calculation works — including rounding, variable products, and what happens with mixed products in the cart — are covered in depth in the WooCommerce tiered pricing implementation guide.

Run the margin math on your highest tier first

Before committing to any tiered structure, calculate your effective margin at the deepest discount across your slowest-moving SKUs. The products you’d least like to discount at 30% are often the ones a bulk buyer grabs first. Know the number before you publish the campaign.

Minimum order quantities: the spend-threshold proxy

This is where the honest complexity begins. Smart Cycle Discounts does not have a per-product minimum quantity field that enforces a wholesale-specific floor — that is a B2B suite feature. What SCD does have (as a Pro feature) is spend-threshold discounts, which operate at the cart total level.

A spend-threshold campaign activates a discount when the cart total reaches a specified amount. You can use this as a minimum-order proxy: set a spend threshold that approximately corresponds to your desired minimum order quantity at the wholesale price, and structure the campaign so the discount only engages once that floor is met.

For example, if your minimum wholesale order is effectively “at least $150 in product,” a spend-threshold campaign set to activate at $150 combined with the role filter for Wholesale Customer means the wholesale discount only fires once the cart crosses that value. Below $150, wholesale accounts see the standard retail price. Above $150, they see the wholesale discount.

The distinction to understand is that this is a cart-level condition, not a per-product quantity block. A wholesale customer can technically add one unit to their cart — they just will not receive any wholesale discount until the cart total reaches the threshold. You are not blocking checkout for small orders; you are withholding the discount incentive until the minimum is reached. For most B2B stores, this achieves the same commercial outcome: wholesale accounts only see value in placing orders that meet the minimum, so they naturally do. But if you need a hard block — where a wholesale customer literally cannot check out with fewer than 12 units — that requires a dedicated minimum quantity plugin or a custom solution.

Spend threshold vs per-product quantity minimum: a real difference

A spend threshold is a cart-level discount condition. It does not prevent a customer from adding 1 unit and checking out — it only withholds the discount. If you need to actually block small orders from completing at checkout, a dedicated B2B plugin or custom code is the correct solution. The spend threshold is the right tool when your goal is “wholesale pricing only on qualifying order sizes,” not “prevent any under-minimum order from being placed at all.”

For a closer look at how spend thresholds work and interact with cart calculations, the guide on running wholesale and retail pricing from the same WooCommerce store covers the full strategy, including when the two customer types share product catalogs and how to avoid price confusion.

Putting it together: a working wholesale campaign

The complete setup combines two campaigns: a tiered pricing campaign for the volume discount structure, and optionally a spend-threshold campaign for the minimum order incentive. Both are scoped to the Wholesale Customer role.

Step 1: Create your Wholesale Customer role

If you do not already have a “Wholesale Customer” role in WordPress, add one. User Role Editor (free) lets you create custom roles with a single form. Give the role the read capability (the standard WordPress customer base capability) and assign it to approved accounts manually or via your account approval workflow. Smart Cycle Discounts will see any WordPress role — it does not care how the role was created.

Step 2: Create the tiered volume pricing campaign

In Smart Cycle Discounts, open the campaign wizard and select “Tiered” as the discount type (Pro). Under Product Selection, choose “All Products” if the wholesale pricing applies to your entire catalog, or select specific products if only certain lines are available to wholesale. In the Discount step, scroll to the User Role section and set the mode to “Include,” then select the Wholesale Customer role. Configure your quantity breaks in the same step. Set the campaign to run continuously with no end date — this is your standing wholesale price structure, not a time-limited promotion.

Step 3: Set campaign priority

Assign this wholesale campaign a high priority (4 or 5 on SCD’s 1–5 scale). If you run any store-wide sales, you want to think carefully about whether wholesale accounts should also receive retail promotional prices — usually they should not, or you risk accidental double discounting. A high priority wholesale campaign can override retail promotions for wholesale accounts when configured with the right stacking rules. The guide to WooCommerce discount conflict detection covers priority and stacking mechanics in detail.

Step 4: (Optional) Add a spend-threshold minimum

Create a second campaign using the “Spend Threshold” discount type (Pro). Set the cart minimum to the value that corresponds to your target minimum order size — calculate this against your tiered price at the first break, not the retail price. Set this campaign’s User Role section to the same Wholesale Customer role. When a wholesale customer’s cart crosses the threshold, the spend-threshold campaign activates. When the cart is below the threshold, that campaign’s discount does not fire — effectively gating the wholesale pricing behind the minimum order value.

Note: you can also structure this as a single campaign if spend-threshold is your primary wholesale mechanism. But the tiered + spend-threshold pair gives you more flexibility — tiered pricing as the wholesale pricing structure, spend threshold as the minimum-order gate.

Step 5: Test with a wholesale test account

Create a WordPress test user, assign the Wholesale Customer role, and walk through a purchase flow. Add below-minimum quantities and confirm the discount does not apply. Add above the threshold and confirm the tiered pricing fires correctly. Test with different product combinations if your catalog is mixed. Confirm the cart and checkout both display correctly — SCD applies discounts through WooCommerce’s price filters and supports block-based cart/checkout, but always verify against your live theme before going live with wholesale customers.

Honest gaps: what this setup does not give you

The campaign-based approach covers role targeting, tiered volume discounts, and cart-total minimums. It does not cover everything a B2B suite would give you. These are the real gaps, not the ones a plugin vendor would downplay:

  • Per-product minimum quantities for wholesale accounts specifically. WooCommerce’s native minimum quantity field applies to all customers. The spend threshold proxy applies to the cart total, not individual product quantities. If your business has a rule like “you must buy coffees in multiples of 12,” enforcing that per-product per-role requires code or a dedicated B2B plugin.
  • Per-user price lists. The campaign applies one set of tiers to everyone with the Wholesale Customer role. If Account A gets 25% and Account B gets 30% because they have a different negotiated rate, a campaign-based system cannot express that without creating separate roles — which becomes unmanageable past a small number of accounts.
  • Company accounts and purchase orders. If your wholesale buyers need to place orders on net-30 terms, require approval workflows, or need multiple buyers under one account, that is outside what a campaign system handles. That is B2B-suite territory.
  • Wholesale-only product visibility. If certain products should only be visible to logged-in wholesale accounts — hidden entirely from retail visitors — campaign targeting does not achieve that. Visibility control is a separate layer that requires a visibility/catalog plugin or custom code.
  • Price display before login. Wholesale accounts see the discounted price once logged in. Guests see the retail price. If you want “Log in to see wholesale pricing” shown on the product page for non-logged-in users, that is a theme or custom code change, not something a campaign handles automatically.

When you actually need a full B2B suite

The campaign-based approach is a good fit when your wholesale requirements are:

  • One or a small number of wholesale tiers, not per-account custom rates
  • Cart-level minimums rather than per-product quantity enforcement
  • Immediate payment (not net terms or purchase orders)
  • Products that are also sold at retail (not a wholesale-only catalog)
  • A manageable number of wholesale accounts that you can onboard manually

If you need per-account custom pricing, per-product wholesale minimums enforced at checkout, company accounts with multiple buyers, or purchase order workflows, a dedicated B2B suite is the right tool. Plugins like WooCommerce B2B, B2B King, or Wholesale Suite are built specifically for those requirements. The campaign approach is not a replacement for those when those features genuinely matter — it is an alternative for stores that need B2B pricing without B2B complexity.

The honest answer is that most smaller wholesale operations do not need the full feature set. They need “wholesale accounts see better prices when they buy enough,” and the combination described in this guide delivers exactly that.

A common path for growing stores

It is common to start with the campaign-based approach — lower cost, lower configuration overhead, works within your existing setup — and then graduate to a B2B suite when your wholesale operation grows to the point where per-account pricing or purchase order workflows become necessary. That transition is cleaner than starting with a full B2B suite when you only needed tiered pricing for three accounts.

Tiered pricing and spend thresholds for wholesale accounts

Role targeting is free in Smart Cycle Discounts. Tiered volume pricing and spend-threshold campaigns are available in the Pro plan. If your wholesale requirements fit what’s described in this guide, you can get it configured without a dedicated B2B plugin.

Frequently asked questions

Is user role targeting free or does it require a Pro upgrade?

User role targeting is included in the free version of Smart Cycle Discounts. You can restrict any campaign to specific WordPress user roles without upgrading. Tiered volume pricing and spend-threshold discounts are Pro features.

Can I have different tiered pricing for different wholesale tiers (Gold, Silver, Bronze)?

Yes, if you create separate WordPress roles for each tier and run separate campaigns per tier. A “Gold Wholesale” campaign targets the Gold role, a “Silver Wholesale” campaign targets the Silver role, and so on. Each campaign has its own tier structure. This becomes harder to manage as the number of tiers grows — at five or more distinct pricing levels, a dedicated B2B plugin with per-account price list management is likely cleaner.

Does a spend-threshold campaign prevent checkout for orders below the minimum?

No. A spend-threshold campaign in Smart Cycle Discounts applies a discount when the cart crosses a threshold — it does not block checkout for orders below it. A wholesale customer with a $80 cart when your minimum is $150 can still check out; they just will not receive the wholesale discount. If you need to hard-block checkout for under-minimum orders, that requires a dedicated minimum order value plugin or custom code.

Will wholesale customers see a “Sale!” badge on product pages?

Yes, on the storefront when they are logged in. Smart Cycle Discounts applies discounts through WooCommerce’s price filters, so the theme’s “Sale!” badge and strikethrough pricing render automatically for the logged-in wholesale customer. Retail visitors see the regular price and no badge. One caveat: these campaign discounts do not populate WooCommerce’s built-in “On Sale” shortcode or block, or third-party filters that read stored sale data — the discount is applied at display time, not written to the stored product price field.

What happens if a wholesale customer applies a retail coupon?

Campaign discounts from Smart Cycle Discounts and WooCommerce coupon codes operate independently by default. If you want to prevent wholesale accounts from stacking a retail coupon on top of their wholesale pricing, the Pro version offers discount configuration controls that govern whether a campaign discount can be combined with coupon codes. Without that restriction, both can apply simultaneously.

Can I show wholesale prices to guests before they log in?

Not with a campaign alone. Campaign targeting works based on the logged-in user’s role. A guest or a non-wholesale logged-in customer will always see the retail price. To show “Log in to see wholesale pricing” messaging on product pages, you would need a theme modification or a short plugin that adds that copy for non-wholesale-role visitors. The pricing logic itself — showing the correct price to the correct role — is handled correctly by the campaign once the user is logged in.

Does this work with WooCommerce variable products?

Yes. Smart Cycle Discounts supports variable products fully. When a tiered pricing campaign includes a variable product, all its variations receive the tier discount based on the quantity of that variation in the cart. The sale price displays correctly on both the main product page and individual variation selections for logged-in wholesale accounts.


Key Takeaways

  • User role targeting is free in Smart Cycle Discounts — you can restrict campaigns to specific WordPress user roles without upgrading.
  • Tiered volume pricing and spend-threshold discounts both require the Pro plan. Together, they give you quantity-break pricing and a cart-level minimum order floor.
  • A spend-threshold campaign is a minimum-order proxy, not a hard block. It withholds the wholesale discount below the threshold but does not prevent checkout. If you need a hard quantity block, a dedicated minimum order plugin or custom code is required.
  • The campaign-based approach works well for stores with one or a few wholesale tiers, cart-level minimums, and immediate payment. Per-account custom pricing, per-product quantity enforcement, and purchase order workflows require a dedicated B2B suite.
  • WooCommerce’s native “Minimum purchase quantity” field applies to all customers — it cannot enforce a per-role minimum without additional tooling.
  • Campaign discounts apply at display time through WooCommerce’s price filters. Wholesale customers see strikethrough pricing and “Sale!” badges when logged in, but discounted products do not populate WooCommerce’s native “On Sale” shortcode or third-party stored-price filters.
  • Start with the campaign approach and migrate to a full B2B suite if and when your wholesale operation outgrows it. The transition is easier when you have not over-engineered the starting setup.

Webstepper

The Webstepper Team

WordPress Plugin Developers

We build WordPress tools for WooCommerce store owners. Smart Cycle Discounts and TrustLens both came from problems we ran into running stores ourselves.