WooCommerce supports B2B wholesale natively through a combination of user roles, conditional pricing hooks, and purpose-built plugins. Out of the box, it lacks approval gating and tiered pricing — but those gaps are fillable with around 200–400 lines of custom code or a plugin like B2BKing. The architecture decision that actually matters is whether your B2B operation runs on the same install as your retail store.
What Does "B2B Wholesale" Actually Require in WooCommerce?
A functional wholesale layer has four distinct requirements: customer gating (only approved buyers see wholesale prices), role-based pricing (different price per role, possibly per quantity), MOQ enforcement (minimum order quantity at product or cart level), and order management differences (net payment terms, purchase orders, bulk reordering). Most plugins solve the first two well; MOQ and terms are where implementations diverge.
The WordPress user role system is the correct foundation. You create a custom role — wholesale_customer is conventional — and restrict price logic, page visibility, and checkout options to that role. Everything else layers on top.
How to Build the Customer Approval Flow
The approval flow is the most overlooked piece. Most tutorials jump straight to pricing and skip the fact that you need a way for wholesale applicants to register, get held in a pending state, and then get promoted to the approved role by a human or automated check.
Manual implementation (no plugin):
- Create a custom registration form using Gravity Forms, WPForms, or a shortcode-based form with fields for business name, tax ID, expected monthly volume, and resale certificate upload.
- On submission, create the WordPress user with a
pending_wholesalerole that has no capabilities — they can log in but see nothing privileged. - Email the admin via
wp_mail()with a review link. - On approval, use
wp_update_user()to change the role towholesale_customer. Send the applicant a confirmation email with login instructions.
With B2BKing:
B2BKing ships a registration form, approval queue inside wp-admin, and automated email sequences. Setup time drops from a week of custom development to roughly a day of configuration. The tradeoff is $149/year and a plugin dependency that touches pricing, checkout, and user management simultaneously — a wide surface area.
With WholesaleX:
WholesaleX (free core, paid Pro at ~$99/year) handles registration and approval with a cleaner UI than B2BKing but fewer edge-case features around dynamic pricing rules.
Role-Based Pricing: Plugin vs Custom Code
Role-based pricing hooks into woocommerce_product_get_price and woocommerce_product_get_regular_price. Here is the minimal custom implementation:
add_filter( 'woocommerce_product_get_price', 'topsyde_wholesale_price', 10, 2 );
add_filter( 'woocommerce_product_get_sale_price', 'topsyde_wholesale_price', 10, 2 );
function topsyde_wholesale_price( $price, $product ) {
if ( ! is_user_logged_in() ) {
return $price;
}
$user = wp_get_current_user();
if ( ! in_array( 'wholesale_customer', (array) $user->roles, true ) ) {
return $price;
}
$wholesale_price = get_post_meta( $product->get_id(), '_wholesale_price', true );
return $wholesale_price ? $wholesale_price : $price;
}
This stores a per-product wholesale price in post meta (add a custom field in the product editor) and returns it for users with the wholesale_customer role. Simple, auditable, zero plugin dependencies.
Tiered pricing (e.g., buy 10–24 units at $18, 25+ at $15) requires cart-level logic or quantity-based price tables. This is where custom code gets expensive fast. B2BKing and WholesaleX both ship quantity table UI that would take 3–5 days to build from scratch.
Plugin Comparison
| Feature | B2BKing ($149/yr) | WholesaleX Pro ($99/yr) | Wholesale Suite ($148/yr) | Custom Code |
|---|---|---|---|---|
| Approval workflow | ✅ Built-in | ✅ Built-in | ✅ Built-in | 🔧 Build it |
| Tiered / quantity pricing | ✅ Full | ✅ Full | ✅ Full | 🔧 Build it |
| MOQ enforcement | ✅ Product + cart | ✅ Product level | ✅ Product + cart | 🔧 Build it |
| Net payment terms / PO | ✅ Yes | ⚠️ Partial | ✅ Yes | 🔧 Build it |
| Dynamic pricing rules | ✅ Advanced | ✅ Advanced | ✅ Advanced | 🔧 Complex |
| B2C visibility control | ✅ Full | ✅ Full | ✅ Full | 🔧 Build it |
| HPOS compatible | ✅ Yes | ✅ Yes | ✅ Yes | N/A |
| Performance overhead | Medium | Low–Medium | Medium | Minimal |
If you are already using WooCommerce HPOS (High-Performance Order Storage) — and you should be for any store with meaningful volume — verify compatibility before installing any wholesale plugin. All three major plugins have declared HPOS support as of 2025.
How to Enforce Minimum Order Quantities
MOQ enforcement has two levels: per-product minimums and cart minimums. Per-product is simpler — restrict the quantity input minimum via woocommerce_quantity_input_min filter and validate on woocommerce_check_cart_items. Cart-level minimums (e.g., minimum $500 order for wholesale) live in woocommerce_check_cart_items as well, returning a wc_add_notice() error if the cart total falls short.
add_action( 'woocommerce_check_cart_items', 'topsyde_enforce_wholesale_cart_minimum' );
function topsyde_enforce_wholesale_cart_minimum() {
$user = wp_get_current_user();
if ( ! in_array( 'wholesale_customer', (array) $user->roles, true ) ) {
return;
}
$minimum = 500.00;
if ( WC()->cart->get_subtotal() < $minimum ) {
wc_add_notice(
sprintf( 'Wholesale orders require a minimum of %s.', wc_price( $minimum ) ),
'error'
);
}
}
This blocks checkout without removing items from the cart, which is the correct UX for wholesale buyers who may need to adjust quantities rather than abandon.
B2C + B2B on One Install vs Two Sites
This is the operational question that has the highest architectural consequence. The answer depends on SKU count, order volume, and how different your B2C and B2B experiences need to be.
Same install is appropriate when:
- You share > 80% of SKUs between retail and wholesale
- Your B2B catalog is a subset of the retail catalog with different pricing
- You have under ~5,000 SKUs
- Your B2B customers are comfortable with the same storefront, gated appropriately
Separate install makes sense when:
- B2B requires a fundamentally different product catalog, navigation, and checkout experience
- You need separate branding (e.g., a trade portal at
trade.yourdomain.com) - Your B2B order volume is high enough that combined database load creates performance risk
- You are using net payment terms, quote workflows, or ERP integrations that would complicate the retail checkout
According to Statista, B2B ecommerce revenue in the US reached $1.7 trillion in 2023, and Adobe Commerce data from 2024 shows 61% of B2B buyers prefer self-service ordering over sales rep contact. That pressure toward digital-first B2B means the "just email us for wholesale pricing" approach is losing ground fast — your wholesale portal needs to actually work.
For separate installs, WordPress Multisite is one option, but for B2B/B2C separation it often creates more coupling than it solves. Two independent WooCommerce installs on the same server, sharing nothing except a database server, is usually cleaner. If you are running a catalog-only B2B portal where buyers request quotes rather than check out directly, the WooCommerce product catalog with quote workflow pattern is worth evaluating before you build out a full checkout experience.
Hiding Retail Prices and Products From Wholesale Buyers (and Vice Versa)
Bidirectional visibility control is where most DIY implementations break. Retail customers should not see wholesale price tables. Wholesale customers may not need to see sale pricing or retail-specific promotions.
For price visibility, return an empty string from the price filter for retail customers when they view a product that has a wholesale-only flag. For product visibility, use pre_get_posts to exclude products tagged wholesale-only from retail queries:
add_action( 'pre_get_posts', 'topsyde_filter_wholesale_products' );
function topsyde_filter_wholesale_products( $query ) {
if ( is_admin() || ! $query->is_main_query() ) {
return;
}
$user = wp_get_current_user();
if ( in_array( 'wholesale_customer', (array) $user->roles, true ) ) {
return; // wholesale customers see everything
}
$query->set( 'tax_query', array(
array(
'taxonomy' => 'product_tag',
'field' => 'slug',
'terms' => array( 'wholesale-only' ),
'operator' => 'NOT IN',
),
) );
}
All three major plugins handle this with checkbox UI, which is meaningfully faster to configure across a large catalog.
Performance Considerations for Dual-Role Stores
Role-based pricing breaks WooCommerce's default fragment caching and full-page caching. A cached price shown to a retail visitor is correct; the same cached page shown to a wholesale buyer will display the wrong price. This is the single largest technical risk of a same-install B2B/B2C setup.
Solutions, in order of reliability:
- User-role-aware full-page cache exclusion — exclude logged-in wholesale customers from page cache entirely. Most managed hosting platforms support this via their caching layer configuration.
- Fragment caching with nonce invalidation — cache the page shell, serve prices via AJAX after role check. Higher complexity, better performance ceiling.
- Separate cached versions per role — supported by some enterprise caching layers, overkill for most stores.
According to Google's Core Web Vitals data (2024), pages with TTFB above 800ms see a 32% higher bounce rate. If your wholesale pricing requires an uncached authenticated request, optimize the database query path — index the _wholesale_price meta key and consider object caching (Redis or Memcached) for user role lookups.
If you are evaluating hosting that can handle the caching complexity a dual-role store introduces, the TopSyde pricing page shows infrastructure options starting at $89/mo per site that include Redis object caching and role-aware cache configuration.
Booking and Scheduling for B2B Service Businesses
Some wholesale operations (trade showrooms, equipment rental, B2B service providers) need appointment or booking functionality alongside their wholesale pricing. The WooCommerce booking plugin alternatives guide covers the budget-friendly options that integrate cleanly without adding unnecessary dependency weight to a store that already has a wholesale plugin installed.
What About Maintenance Windows During Wholesale Rollout?
Rolling out a wholesale layer to an existing live store is a significant change — new roles, pricing overrides, and registration flows all need staging validation before production deployment. The WooCommerce maintenance mode guide covers how to handle the transition without exposing broken price logic to either customer segment during the rollout.
If your store is running without Jetpack and you need to evaluate caching, security, and performance tooling that doesn't add plugin bloat alongside your wholesale layer, the WooCommerce without Jetpack alternatives guide is the relevant reference.
For stores that have outgrown their current hosting and need infrastructure that can handle the additional complexity of a wholesale layer, the TopSyde spec sheet documents the full technical stack including object caching, staging environments, and deployment pipelines.
Frequently Asked Questions
Can I use WooCommerce wholesale pricing without a plugin?
Yes. The woocommerce_product_get_price filter and WordPress user roles are sufficient for basic per-product wholesale pricing with no plugin. You need custom code for the registration form, approval workflow, tiered pricing tables, and MOQ enforcement — each adds development time. For stores with more than a handful of wholesale-specific requirements, a plugin like B2BKing or WholesaleX recovers its cost quickly.
Does role-based pricing break page caching?
It does for full-page caching. Cached pages store a single rendered price that is wrong for any role other than the one that generated the cache. The standard fix is to exclude logged-in wholesale users from the page cache and serve their sessions uncached, or to implement AJAX-based price loading. Most managed WordPress hosts with Redis object caching can reduce the performance penalty significantly.
Should B2B and B2C run on the same WooCommerce install?
For stores sharing most of their catalog and operating under moderate order volume, yes — a single install with role-based gating is simpler to maintain. The case for separation strengthens when you need distinct branding, a fundamentally different checkout experience (net terms, POs, quote workflows), or when combined database load creates measurable performance degradation. Two independent installs on solid hosting is cleaner than Multisite for most B2B/B2C splits.
Which wholesale plugin is best — B2BKing, WholesaleX, or Wholesale Suite?
B2BKing is the most feature-complete for complex wholesale scenarios, particularly around dynamic pricing rules and payment terms. WholesaleX has a lighter performance footprint and a cleaner UI for straightforward tiered pricing. Wholesale Suite (a bundle of three plugins) is strong for stores that need granular control but accept higher plugin complexity. All three are HPOS-compatible as of 2025 and integrate with major page builders.
How do I handle tax exemption for wholesale customers?
Tax exemption requires either manual tax class assignment to the wholesale_customer role or a plugin that supports tax exemption certificates. B2BKing and Wholesale Suite both include tax exemption handling. Custom implementations need to filter woocommerce_product_get_tax_class and store exemption certificate data in user meta, with admin review of certificate validity before granting exemption status.
Topics

Content & SEO Strategist
7+ years SEO & content strategy, Google Analytics certified
Elena drives content strategy and SEO at TopSyde, helping clients maximize organic visibility and AI search presence. She combines technical WordPress knowledge with data-driven content optimization.



