B2B WooCommerce··14 min read

The Complete Guide to B2B WooCommerce in 2026

WooCommerce powers about 37% of e-commerce sites on the internet. Most of those are retail — DTC brands, small stores, boutique sellers. But a growing slice runs wholesale, distribution, and B2B. Search volume for "b2b woocommerce" is up 900% year-over-year as agencies migrate clients off Shopify Plus and Magento.

The problem: WooCommerce was designed for retail. Getting it to behave like a B2B system isn't impossible, but there's no "enable B2B mode" checkbox. You assemble it from twelve or so concrete configurations — some native, some via code, some via plugins. Miss one and you'll have a retail store dressed in wholesale clothing.

This guide is the map. We cover what B2B actually requires, how WooCommerce handles each piece out of the box, where you need to extend it, and the specific plugins (ours and others) that fill the gaps.


What makes a store "B2B" (and why retail WooCommerce breaks)

A real B2B store differs from retail in six ways. If you can't say yes to most of these, you're running a retail store with a wholesale discount — not a B2B system.

  1. Customers are identified — buyers log in, see their account-specific pricing, and operate inside a controlled environment. Guests don't browse the catalog.
  2. Pricing varies by customer — the same SKU costs different amounts for different buyers. Pricing is tied to the account, not the product.
  3. Tax behaves differently — some customers are tax-exempt (resellers, non-profits, EU B2B). Some aren't. You can't apply a flat rule.
  4. Shipping is controlled — customers don't pick "cheapest shipping" from a menu. They get the carrier and service level their contract specifies.
  5. Payment terms exist — net 30, net 60, invoice-on-account. Not everyone pays with a credit card at checkout.
  6. Orders get assisted — sales reps place orders for customers. Customer service checks order status as the customer. Admins debug carts without asking the customer to send screenshots.

Retail WooCommerce assumes the buyer is a stranger, pays immediately, picks their own shipping, and gets one global price. Every one of those assumptions breaks in B2B. The rest of this guide is how to unbreak them.


The twelve configurations

We'll cover the twelve specific things you have to set up, grouped into four categories. You don't need all twelve for every store — but you'll need most of them, and missing the wrong one will hurt.

CategoryConfiguration
Access1. User roles · 2. Login-required catalog · 3. Approval flow
Pricing & Tax4. Role-based pricing · 5. Tiered quantities · 6. Tax-exempt customers · 7. EU VAT / reverse charge
Checkout8. Role-based shipping · 9. Role-based payment · 10. Minimum order quantities
Operations11. Assisted ordering · 12. Audit logging

Access: who sees what

1. User roles

WordPress ships with roles like subscriber, customer, administrator. For B2B, you'll create your own: wholesale_customer, reseller, distributor, dealer_tier_1, dealer_tier_2. Each role is a label you hang permissions, pricing, and access rules on.

Don't overthink the taxonomy. Start with 2-3 roles for the buyer tiers you actually have. You can always add more later. What you can't easily do is retroactively split one wholesale_customer role into three different pricing groups without migrating thousands of users.

Create roles with the User Role Editor plugin or programmatically:

add_action( 'init', function () {
    add_role( 'wholesale_customer', 'Wholesale Customer', [
        'read' => true,
    ]);
});

2. Login-required catalog

Most B2B stores don't want pricing (or even product details) visible to the public. Reasons:

  • Competitors can't scrape wholesale prices
  • SEO juice stays in the retail site (if separate)
  • The catalog is treated as confidential

The simplest approach: redirect every non-logged-in visitor away from /shop/* and /product/* to a login page. Several plugins handle this (WooCommerce Private Store, WP Login LockDown). Or a short snippet in your theme:

add_action( 'template_redirect', function () {
    if ( ! is_user_logged_in() && ( is_shop() || is_product() || is_product_category() ) ) {
        wp_safe_redirect( wp_login_url( home_url( $_SERVER['REQUEST_URI'] ) ) );
        exit;
    }
});

3. Approval flow

New B2B accounts shouldn't auto-activate. You want a moderator to verify the customer is a legitimate business (tax ID, business license, LinkedIn) before granting access.

Two approaches:

  • Manual approval: users register, get a pending status, an admin approves them in WP admin. Plugins like New User Approve or User Registration Approval handle this.
  • Self-service with verification: VAT/tax ID validated automatically via external API (VIES for EU VAT, EIN lookup for US), and approved accounts get auto-assigned to a role.

Pricing & Tax: where most B2B stores break

4. Role-based pricing

Same SKU, different prices for different roles. The most common patterns:

PatternExampleHow to implement
Fixed wholesale price$100 retail → $60 for wholesale_customerCustom meta field per product per role
Percentage discount20% off for resellerGlobal rule, applies to the whole catalog
Tier-based discountDealer Tier 1: 30% off, Tier 2: 40% offMultiple roles, percentage per role

Native WooCommerce has no built-in role pricing — you need either a plugin (B2BKing, WooCommerce Wholesale Prices, Addify Role Based Pricing) or code. See our detailed wholesale pricing setup guide for the full walkthrough.

5. Tiered quantity pricing

"Buy 1-9: $60 each. Buy 10-49: $55 each. Buy 50+: $50 each."

This is common in B2B because the price-per-unit usually falls as volume rises. WooCommerce natively supports "sale price" but not volume breaks. Plugins that do: Dynamic Pricing & Discounts, Advanced Dynamic Pricing, WooCommerce Wholesale Prices.

Watch out for the interaction with role-based pricing. Some plugins apply role discount first, then tiered; some do it in reverse. This matters if your "tiered pricing" column already assumes a role discount was applied.

6. Tax-exempt customers

Resellers don't pay sales tax. Non-profits don't. Government buyers don't. You need a per-customer flag that removes tax at checkout.

WooCommerce has native support via the is_vat_exempt customer flag — but no UI to control it. See WooCommerce Tax-Exempt Customers: The Complete Setup Guide for the three ways to configure this (code snippet, role-based, plugin) and the audit trail you should keep.

7. EU VAT and reverse charge

If you sell cross-border within the EU to other businesses, you don't charge VAT — the buyer self-accounts via the reverse charge mechanism. This requires:

  • VAT number validation at checkout (via VIES)
  • Different tax treatment for EU B2B vs EU B2C vs non-EU
  • Reverse charge note on the invoice
  • OSS reporting for quarterly VAT returns

Native WooCommerce handles the tax math once you tell it someone is exempt. It does not validate VAT numbers or generate reverse charge invoices. For stores doing real EU B2B volume, don't roll this yourself — use a dedicated EU VAT plugin. Our EU VAT and WooCommerce guide walks through the full flow.


Checkout: what the customer sees at the final step

8. Role-based shipping methods

A retail customer picks from USPS Ground, UPS, FedEx, or Free Shipping over $100. A wholesale customer doesn't — they get the carrier their contract specifies, and they don't see the others.

WooCommerce has no native "show shipping X only to role Y" — but it has a filter hook:

add_filter( 'woocommerce_package_rates', function ( $rates, $package ) {
    $user = wp_get_current_user();
    $is_wholesale = in_array( 'wholesale_customer', (array) $user->roles, true );

    if ( $is_wholesale ) {
        // Only show flat_rate:3 (freight) for wholesale
        return array_filter( $rates, fn( $r ) => $r->id === 'flat_rate:3' );
    }
    return $rates;
}, 10, 2 );

That works for simple rules. For anything dynamic (multiple roles, per-zone logic, per-product overrides) use a plugin. See How to Restrict Shipping Methods by User Role.

9. Role-based payment methods

Similar logic: a retail customer pays by credit card. A wholesale customer with Net 30 terms uses "Invoice on Account" (which is essentially a pending order with a delayed payment link).

Native filter: woocommerce_available_payment_gateways. Same pattern — check the user's role, unset the gateways you don't want them to see. For full walkthrough: How to Hide Payment Methods from Specific Customers.

10. Minimum order quantities (MOQ)

"Wholesale orders have a $500 minimum." Standard B2B rule. Implement it at cart level — don't block checkout after the customer fills out shipping information, that's terrible UX.

add_action( 'woocommerce_check_cart_items', function () {
    $user = wp_get_current_user();
    if ( ! in_array( 'wholesale_customer', (array) $user->roles, true ) ) return;

    $total = WC()->cart->get_subtotal();
    if ( $total < 500 ) {
        wc_add_notice(
            sprintf( 'Wholesale orders require a minimum of $500. Current subtotal: $%s', number_format( $total, 2 ) ),
            'error'
        );
    }
});

Operations: how the store is run day-to-day

11. Assisted ordering

Three scenarios you'll hit constantly:

  • Phone orders: a rep takes an order over the phone and places it in the customer's account
  • Customer support: an agent needs to see exactly what a customer sees to debug a cart or pricing issue
  • Onboarding: you set up the first order for a new account as a white-glove experience

All three need "login as customer" — the ability for an admin to temporarily impersonate a user. Without an audit trail this is dangerous (it looks like the customer placed the order if you don't track the impersonation). Our login as customer guide and place order on behalf guide walk through the safe patterns.

12. Audit logging

Every one of the above — who got tax-exempted, who got a price override, who placed an order as whom — needs to be logged. This isn't about paranoia, it's about:

  • Audits: tax auditors and financial auditors ask. Have the answer.
  • Disputes: "I didn't place that order" → you produce the log showing rep Maria logged in as the customer on March 12 at 14:08 UTC.
  • Debugging: when something looks wrong and you need to trace back "when did that customer's role change?"

Most of this is custom logging you build into your admin flows, or comes bundled with the plugins that handle the underlying feature (any plugin worth buying will log its actions).


The pragmatic stack

Here's the actual stack we recommend for most B2B WooCommerce stores. You don't need all of these — pick what applies.

NeedOption
Role-based pricingB2BKing, WooCommerce Wholesale Prices, or custom
Tiered pricingDynamic Pricing & Discounts
Tax exemptionTax Exempt (ours)
EU VAT validationEU VAT Assistant (free) or WooCommerce EU VAT Number
Role-based shipping/paymentRole Based Methods (ours)
Assisted orderingShop As Customer (ours)
Invoicing on accountWooCommerce Subscriptions + custom, or Order Delivery
Quote flowRequest a Quote for WooCommerce
MOQMin/Max Quantities for WooCommerce

Common mistakes

Treating B2B as "retail with login". The minute pricing, tax, and shipping start differing per customer, you're in B2B. Stop fighting it — configure the system for B2B explicitly.

Installing 15 plugins that overlap. Every plugin adds cart/checkout hooks. When six of them try to modify the same cart, you get weird bugs that are almost impossible to debug. Pick 4-5 focused plugins that do their job cleanly.

Forgetting the sales rep workflow. If your reps have to call IT every time a customer says "my cart is wrong," you've built a bad system. Login-as-customer + price override + order assist should be first-class flows, not afterthoughts.

Not planning for audit. Everything needs a log. Who changed what, when, and why. The first time an accountant asks and you can't answer, you'll retrofit — which is always painful.

Skipping the approval flow. Every public B2B registration form is a magnet for scrapers, abuse, and fake businesses. Approve accounts manually or with automated verification.


Where to start

If you're standing up a new B2B WooCommerce store, here's the order we recommend:

  1. Define your roles. Write them down. Don't invent new ones mid-build.
  2. Set up role-based pricing. Test with real SKUs and real discounts.
  3. Configure tax exemption. Do at least one full end-to-end test order for an exempt customer.
  4. Lock down shipping and payment methods per role. Test as each role.
  5. Add MOQ. Test the "cart below minimum" UX.
  6. Set up assisted ordering for your reps. Train them on it.
  7. Turn on audit logging everywhere.
  8. Then open registration and launch.

If you're migrating an existing retail store to B2B, cut over in the opposite order: add the B2B roles first with no behavior changes, migrate users into them, then flip the rules on one at a time with a kill switch.


The twelve configurations above are the skeleton. Each one deserves its own deep-dive — we've linked out to detailed guides where they exist, and we'll keep filling in the rest. If you're building a B2B WooCommerce store and hitting something specific that isn't covered, tell us at [email protected] — the next article often comes from a reader's question.