WooCommerce Tips

WooCommerce B2B Pricing Strategy: How to Run Wholesale and Retail From One Store Without Confusing Anyone

WooCommerce B2B Pricing Strategy: How to Run Wholesale and Retail From One Store Without Confusing Anyone
🏢

WooCommerce Strategy

Two Types of Buyers. One Store. One Price List Would Be a Disaster.

Serving wholesale and retail customers from the same WooCommerce store is a legitimate architecture — but only when you have deliberate answers to a handful of questions most store owners never ask until something goes wrong.

You started selling online for retail customers. Then a business reached out wanting to buy in bulk. Or a local retailer asked about reseller pricing. Or you realized your products have an obvious B2B application you hadn’t tapped yet.

The instinct is to add a “Wholesale” page and figure out the rest as it comes. That approach works until the day a retail customer finds your wholesale prices, or a wholesale buyer accidentally checks out without logging in and pays twice what they should. At that point the question shifts from “how do I add wholesale pricing” to “how do I architect this properly.”

This guide is about the second question. It covers the three tools available in WooCommerce for B2B pricing — role-based pricing, tiered pricing, and hidden categories — and the strategic logic for choosing among them. It also covers minimum order quantities and the specific places where price separation between retail and wholesale tends to break down.

The real challenge of dual-audience pricing

Retail customers and wholesale customers are not just the same person spending different amounts. They have different motivations, different expectations, and different relationships with your pricing.

A retail customer is making a personal purchasing decision. They respond to urgency, discovery, sale badges, and the emotional pull of a good deal. They expect prices to include tax. They’ve never thought about minimum order quantities. They’re browsing.

A wholesale customer is operating a business. They know what they need, they care about predictability, and they expect trade pricing to be stable and private. They often need prices quoted excluding tax because their accounting handles it separately. They’re procuring.

Running both audiences from one store is not impossible — thousands of stores do it successfully. But it requires deliberate design. The same storefront cannot communicate effectively to both audiences simultaneously unless you’ve made explicit choices about what each audience sees, when, and why.


How this usually starts

A kitchen supplies store opens primarily for home cooks. A small restaurant supply buyer finds the store, emails asking for trade pricing, and the owner says yes. Six months later there are twelve wholesale accounts and no formal system — just a shared coupon code that a retail customer eventually discovers. The code spreads on a deals forum. The owner now has to retire it, notify wholesale accounts of a new code, and accept that any future system will require more structure than a shared percentage-off coupon.

Three pricing tools, three different jobs

WooCommerce doesn’t include multi-audience pricing out of the box, but it gives you the infrastructure to build it. The three tools used most often are role-based pricing, tiered pricing, and hidden categories. They sound related but they solve different problems.

Tool What it controls Best for
Role-based pricing Who sees which price (by identity) Wholesale accounts with negotiated fixed discounts
Tiered pricing Unit price as a function of quantity purchased Anyone who buys in volume — retail or wholesale
Hidden categories Which products are visible (by access level) Trade-only products or wholesale-only catalog sections

Understanding the job each tool is designed for prevents the most common mistake: trying to use one tool to do the work of another.

Role-based pricing: identity-first access control

Role-based pricing means showing different prices to customers based on which WordPress user role they carry. A user assigned the role wholesale_customer logs in, browses your store, and sees a different price than an anonymous visitor or a regular retail customer sees. The discount is automatic and invisible — no code to enter, no special page to visit.

This is the right tool when your price difference is about who the customer is, not how much they buy. A verified wholesale account gets 30% off everything in their category, regardless of whether they buy three units or three hundred. The relationship, not the quantity, is the basis for the pricing.

How it works technically

WordPress user roles — Subscriber, Customer, Editor, and any custom roles you create — are the backbone of this system. When a logged-in customer visits your store, WooCommerce checks their role, and any pricing logic that targets that role fires automatically. The key step is creating a custom role (e.g., wholesale_customer) and assigning it to approved buyers.

Role-based pricing requires either custom PHP code or a plugin that implements the pricing logic. WooCommerce core does not include it natively. The detailed technical walkthrough — role creation with add_role(), the price filters involved, the tax display considerations, and the registration approval workflow — is covered in the WooCommerce role-based pricing setup guide.

The crucial operational piece: account approval

Role-based pricing is only as reliable as the account approval process behind it. If anyone can self-register as a “Wholesale Customer” without verification, you’ve created a coupon that any retail visitor can claim by filling in a form. The role must be assigned after you’ve verified the account — not automatically on signup.

For stores starting out with fewer than a few dozen wholesale accounts, manual assignment in WordPress admin is completely appropriate. You vet each account personally, then change their role from Customer to Wholesale Customer. It doesn’t scale to hundreds of accounts, but it’s exactly right for a dozen.


The logged-out problem

Role-based pricing only applies when the customer is authenticated. If a wholesale account browses while logged out, they see retail prices — and if they check out while logged out, they pay retail prices. This catches wholesale buyers off guard more often than you’d expect. Brief your wholesale accounts to always log in before shopping, and consider redirecting them to a login prompt if they try to access the cart unauthenticated.

Tiered pricing: quantity-driven rewards for everyone

Tiered pricing — also called volume pricing or quantity discounts — means the unit price decreases as the quantity in the cart increases. Buy 1–4 units at full price. Buy 5–9 and each unit is 10% less. Buy 10 or more and the unit price drops further still.

The key distinction from role-based pricing: tiered pricing is not about who the customer is. A retail customer buying 12 units and a wholesale customer buying 12 units can both hit the same tier. The trigger is the quantity, not the identity.

This makes tiered pricing useful in different scenarios. It’s the right tool when you want to incentivize any customer to buy more, not just when you want to segment wholesale accounts from retail ones. Consumable goods, craft materials, B2B replenishment products — anything where volume increases are genuinely possible across your customer base.

Where it serves B2B specifically

Tiered pricing is particularly useful in B2B contexts where your wholesale accounts are not a fixed group you’ve verified and approved, but rather a general population of buyers who happen to order in larger quantities. If a small landscaping company finds your fertilizer products and orders 50 bags, they don’t need a formal wholesale account — they just need the price to reflect the volume. Tiered pricing handles that automatically, without requiring any role assignment or account vetting.

The tradeoff is that the same discount is visible and available to anyone who reaches that quantity. If your tier structure offers meaningful savings at volumes a retail customer could plausibly reach, some retail customers will take advantage of it. That’s not inherently a problem — the whole point of tiered pricing is to incentivize larger orders — but it means tiered pricing alone doesn’t give you the audience separation that role-based pricing does.


Tiered pricing is a Pro feature in Smart Cycle Discounts

Smart Cycle Discounts includes tiered quantity pricing in the Pro version. The free version includes percentage, fixed-amount, and BOGO discounts — which cover most single-audience promotions. If tiered pricing is a core requirement for your B2B setup, that’s worth factoring into your tooling decision. The tiered pricing documentation covers the setup in full.

Hidden categories: when access control is the whole point

Sometimes the pricing difference between wholesale and retail is not about modifying prices on shared products — it’s about having a different product catalog entirely. Trade-only product lines. Products available only to resellers. Items with unit sizes (24-packs, commercial volumes) that make no sense for retail buyers.

In these cases, hidden categories are the right tool. A product category restricted to logged-in wholesale accounts simply isn’t visible to retail visitors or guests. It doesn’t appear in shop listings, category pages, or search results for anyone without the required role or permissions.

Hidden categories can be implemented via several mechanisms — WooCommerce doesn’t include it natively, but plugins and code snippets can restrict category visibility by role. The approach also pairs naturally with role-based pricing: a wholesale account can see the hidden category and gets role-based pricing on the products within it.

When hidden categories are not the right answer

If your wholesale products are the same SKUs as your retail products, just at different prices, hidden categories are the wrong tool. You’d be maintaining duplicate product entries — one version in the public catalog, one in the hidden wholesale category — which doubles your product management burden and creates inventory sync headaches. Role-based pricing on shared products is the right architecture for that scenario.

Hidden categories make sense when the products genuinely differ: different pack sizes, trade-specific product lines, or SKUs that retail customers should never encounter because the pricing or presentation would be confusing to them.

Choosing the right tool for your situation

Most stores don’t need all three tools. The right combination depends on a few questions about your specific situation.

Your situation Best tool Why
Small number of vetted wholesale accounts needing consistent discounts Role-based pricing Identity-based. Clean separation. No quantity minimum needed.
Open volume incentives for any buyer who purchases in bulk Tiered pricing Quantity-based. Available to all. No account vetting required.
Trade-specific products retail customers should never see Hidden categories Visibility control. Right for different product lines, not price variants.
Wholesale accounts with special pricing AND volume incentives on top Role-based + tiered, combined Role controls who gets the base discount; tiers reward larger orders within that group.
Mixed store with both retail promotions and wholesale pricing running simultaneously Role-based pricing with exclusion mode for retail campaigns Wholesale accounts are excluded from retail sales that don’t apply to them.

The combination row in that table is important: role-based pricing and tiered pricing are not mutually exclusive. A wholesale account who gets a role-based 20% discount can also benefit from tiered pricing that gives an additional reduction at high volumes. Whether you want that combination is a margin question, not a technical one.

Minimum order quantities: the underappreciated constraint

Minimum order quantities — requiring wholesale buyers to purchase a minimum number of units before a trade price applies — are one of the most commonly missed pieces of a wholesale setup.

There are two reasons stores need them. First, the economics: a 30% wholesale discount on a single unit at retail price might be worse for you than selling that unit at full retail. The wholesale price is supposed to make sense at volume, not at one unit. Second, audience separation: if a retail customer discovers they can access wholesale prices by purchasing a certain quantity, and that quantity is achievable in a single retail transaction, you’ve created an unintended arbitrage.

WooCommerce does not include minimum order quantities natively. The most common approaches are:

  • A code snippet that enforces a minimum quantity at checkout — straightforward to implement, but it shows the error after the customer tries to proceed, which is frustrating UX.
  • A plugin like WooCommerce Min/Max Quantities — controls minimum and maximum quantities at the product level, with validation built in.
  • Combining with role-based pricing — some wholesale setups enforce MOQs only for specific roles, so retail customers have no restriction while wholesale accounts must meet the minimum. This requires either a plugin that supports role-conditional quantity limits, or custom code.

Communicating MOQs clearly

Whatever technical implementation you choose, the minimum order quantity needs to be visible on the product page before a wholesale customer tries to add items to their cart. A surprise at checkout — “you must order at least 12 units” — after someone has selected their preference and clicked Add to Cart is poor UX, and it creates support conversations that didn’t need to happen.

The best implementations display the MOQ notice directly on the product page, adjacent to the quantity selector, for users who are logged in with a wholesale role. Retail customers see nothing different; wholesale accounts see the constraint clearly before selecting a quantity.


MOQs and tiered pricing interact

If you use tiered pricing, the first tier effectively acts as an informal MOQ — the discount only activates once the customer hits the minimum quantity threshold. For some stores, this removes the need for a separate MOQ enforcement layer. For others, the tier discount should kick in at a lower quantity than the true trade minimum. Know which scenario you’re in before deciding whether you need both mechanisms.

Keeping audiences apart: what actually goes wrong

The most common failure mode in dual-audience stores is not a technical one. It’s an operational one: wholesale pricing becomes visible to retail customers through a channel the store owner didn’t anticipate.

Price leakage paths to watch

Open registration forms. A registration form that automatically assigns the wholesale role on signup gives any visitor trade-price access. The role must be assigned manually after vetting. This point cannot be overstated — it’s where most stores eventually learn this lesson the hard way.

Publicly accessible wholesale price lists. If you publish a PDF price list on your site for wholesale buyers, that PDF is indexable unless you specifically restrict access. Retail customers who find it — and some will, often via a forum or a competitor’s screenshot — now have your wholesale prices as a reference point for whether your retail prices are fair. Keep price lists behind login or distribute them directly.

Campaign discounts that apply to wholesale accounts unintentionally. When you run a retail sale campaign — Black Friday, end-of-season clearance — does it also apply to your wholesale accounts? If your wholesale accounts are already at 30% off, a retail 20% off campaign should probably not stack on top of that. Using role exclusion in your campaign targeting (excluding your wholesale role from retail campaigns) prevents this. Smart Cycle Discounts’ role targeting supports both include and exclude modes specifically for this use case.

Wholesale buyers checking out while logged out. Covered earlier, but worth repeating in this context: the logged-out problem means a wholesale buyer pays retail prices when they forget to log in. This is more of a UX issue than a pricing leak, but it generates the same kind of confusion and support conversations.

Search engines indexing wholesale-only content. If your wholesale products or categories are not properly restricted, search engines may index them. A retail customer searching for your product might land directly on a wholesale-tagged page and see trade pricing. Use noindex meta tags or access restrictions on wholesale-only content.


When retail customers find your wholesale prices

If a retail customer discovers your wholesale prices and contacts you about it, the conversation is uncomfortable: either you explain that they don’t qualify (which feels exclusionary), or you honor the trade price (which sets a precedent you can’t sustain). The best outcome is that they never find those prices in the first place. Restrict access before the question comes up, not after.

Using Smart Cycle Discounts for role targeting and tiered pricing

Smart Cycle Discounts supports user role targeting natively in the free version. When configuring any campaign — percentage, fixed amount, BOGO, or (with Pro) tiered — you can set a role targeting mode: all (no filtering), include (only the selected roles see the discount), or exclude (everyone except the selected roles sees the discount).

Include mode is the primary B2B tool. You build a percentage-off campaign for your wholesale accounts, set targeting to include your wholesale_customer role, and the campaign is invisible to retail visitors. Wholesale buyers log in and the campaign price appears automatically on product pages, without a code.

Exclude mode is the retail campaign companion. When you run a sitewide sale, you exclude your wholesale role so trade accounts aren’t double-discounted. Both modes are in the free version — they’re part of the base campaign configuration.

Tiered pricing with role targeting (Pro)

Smart Cycle Discounts’ tiered pricing feature is available in the Pro version. When combined with role targeting, it creates a nuanced B2B structure: wholesale accounts who meet volume thresholds get a further reduction on top of their base trade discount. You configure one campaign with role-include targeting and a tiered discount structure — the tier ladder applies only to the targeted role.

The practical setup follows the same five-step wizard as any other campaign type. Role targeting is configured in the campaign’s basic information step. Tiered pricing is selected as the discount type in the discount configuration step, where you define quantity thresholds and discount values per tier. The tiered pricing documentation covers the configuration in detail.

Worth noting: because Smart Cycle Discounts applies discounts through WooCommerce’s price filters at render time, discounted prices appear on product pages, category pages, and cart as sale prices — including your theme’s “Sale!” badge and strikethrough. Wholesale buyers see the trade price throughout the shopping journey, not just at checkout. The discount is not written to the stored _sale_price database field, so it won’t appear in WooCommerce’s “On Sale” block or third-party sale filters — but for role-targeted wholesale pricing, that’s neither here nor there, since those surfaces target all customers simultaneously.

For the complete picture of how role-based campaign targeting fits into a broader WooCommerce customer segmentation strategy — including location-based targeting and how to layer multiple axes — see the guide on WooCommerce customer segmentation for discounts.

Frequently asked questions

Can I show different prices to wholesale and retail customers without a plugin?

In principle, yes — you can write PHP code that hooks into WooCommerce’s woocommerce_product_get_price filter and applies a discount when the current user has a specific role. In practice, this requires understanding which filters to target, testing across product types, and maintaining the code through WooCommerce updates. For most stores, a plugin is more reliable than custom code for this specific problem.

Does role-based pricing work for guest visitors?

No. Role targeting applies only to authenticated users. A guest has no role and won’t be matched by include-mode targeting — they’re effectively invisible to any role filter. If you want an offer accessible to all customers including guests, use standard campaign settings without role filtering. If you want an offer only for known customers, role filtering is one approach; requiring login before prices are shown is another.

Can wholesale accounts and retail campaigns run simultaneously without interfering?

Yes, but it requires intentional configuration. The cleanest setup: your wholesale pricing is a permanent role-targeted campaign (or a plugin-level discount), and your retail campaigns use exclude mode to skip the wholesale role. That way, a retail flash sale applies to retail customers; wholesale accounts see their trade prices unchanged. Without the exclusion, campaign discounts can stack on top of role discounts in ways you didn’t intend.

What happens if I have multiple wholesale tiers — say, silver and gold accounts?

You create a separate WordPress role for each tier (e.g., wholesale_silver and wholesale_gold), and build a separate campaign for each role targeting the appropriate discount level. This is entirely workable, but adds complexity — two roles to manage, two pricing configurations, potentially two sets of MOQ rules, and two approval workflows. Start with a single tier and add a second only when you have a genuine commercial reason to differentiate between account levels.

How do tiered pricing and role-based pricing interact in the same cart?

If a campaign uses both role targeting and tiered pricing (Pro), both conditions apply together: only the targeted role sees the campaign, and within that audience, the tiered discount fires when quantity thresholds are met. There is no double-discounting within a single campaign. Smart Cycle Discounts’ priority system handles conflicts when multiple campaigns could affect the same product — the highest-priority campaign wins.

Do I need a separate WooCommerce store for B2B customers?

For the vast majority of stores: no. A second store doubles your maintenance burden — two product catalogs to keep current, two inventory systems, two order histories. The cases where a separate store makes genuine sense are narrow: if your B2B operation has a completely different brand identity from your retail store, or if the product catalogs have near-zero overlap, or if your B2B buyers need features (purchase orders, account-level credit terms, multi-user accounts) that no plugin can add cleanly to a retail WooCommerce setup. For everything else, one store with deliberate pricing architecture is the better answer.

Where to go from here

The strategy question — which pricing tool fits your situation — is more important than the implementation question. Most stores that end up with broken dual-audience setups built the mechanics first and worked out the architecture later. That order is harder.

A few clear starting points:

  • If you have a small, known set of wholesale accounts with negotiated pricing, start with role-based pricing. One role, one discount tier, manual account approval. The role-based pricing setup guide covers the complete implementation.
  • If you want to incentivize any buyer to purchase in larger quantities — regardless of whether they’re B2B or retail — add tiered pricing on top of or instead of role-based discounts. The WooCommerce tiered pricing guide covers tier structure, quantity thresholds, and margin considerations.
  • If you need trade-only product lines, add hidden category logic only for those products — not as a substitute for proper pricing architecture on your main catalog.
  • Make campaign exclusions deliberate: any retail sale you run should either explicitly include or explicitly exclude your wholesale accounts. An unexamined retail campaign that silently reaches trade accounts is the most common way the two audiences start interfering with each other.

The underlying principle is that your retail and wholesale pricing strategies are both legitimate — they just need to know where the other one ends. A little structural clarity up front prevents the support headaches, the awkward customer conversations, and the margin erosion that come from letting two pricing audiences bleed into each other.


Key takeaways

  • Role-based pricing, tiered pricing, and hidden categories each solve a different problem. Choosing the wrong tool wastes effort and creates gaps.
  • Role-based pricing is for audience separation by identity. Tiered pricing is for incentivizing volume from any buyer. Hidden categories are for access-controlled product lines.
  • User role targeting (include/exclude) is a free feature in Smart Cycle Discounts. Tiered pricing requires the Pro version.
  • The most common failure mode is not technical — it’s operational: open registration, publicly accessible price lists, and retail campaigns that silently hit wholesale accounts.
  • Role targeting only fires for authenticated users. Brief wholesale accounts to always log in before shopping, or enforce login at the cart.
  • Minimum order quantities are underused. Without them, the economics of your wholesale pricing may not hold at low volumes.
  • Exclude mode on retail campaigns keeps wholesale accounts from receiving double discounts during sitewide sales.
  • A second WooCommerce store is rarely the answer. One store with deliberate pricing architecture handles the core requirement without doubling your maintenance burden.

Webstepper

The Webstepper Team

WordPress Plugin Developers

We’re a husband-and-wife team building WordPress tools that solve problems we faced ourselves running online stores. Our plugins are built from experience — no guesswork, just practical solutions.