B2B
If you offer wholesale (or any non-public-catalog purchasing flow), this guide explains how Mercer surfaces Shopify B2B to your buyers.
This guide assumes B2B is enabled on your Shopify plan (Plus or
Commerce Components) and you’ve configured at least one company,
catalog, and price list. Mercer reads native B2B data — customer.b2b?,
customer.company, customer.current_location, variant.quantity_rule,
variant.quantity_price_breaks, and the customer.companies array
for multi-company switching. No custom metafields are required.
If your store is B2C-only, you can skip this guide. None of the B2B UI renders for non-B2B customers — no extra markup, no extra requests.
What Mercer ships
| Surface | Renders | Where |
|---|---|---|
| Catalog badge | ”Wholesale” pill + active company name | Header (B2B users only) |
| Company switcher | Dropdown of customer.companies for multi-company users | Header (B2B users with 2+ companies) |
| Quantity rules | ”Min 6, in increments of 6” summary + stepper clamping | PDP and quick-add (B2B users only) |
| Tier price table | ”10–24: $84, 25–49: $76, 50+: $68” volume table | PDP below price (B2B users only) |
| Cart aside | ”Net 30 — billing terms” reminder + company display | Cart drawer + cart page |
All five render only when customer.b2b? is true. B2C customers see
zero B2B markup and pay zero markup cost.
Catalog badge
When a B2B customer is signed in, the header shows a small “Wholesale” pill next to the cart icon. Clicking it doesn’t do anything by default (it’s a status indicator, not a control); you can wire it to a custom URL via theme settings if you want it to link to a wholesale-specific page.
Company switcher
If a B2B customer belongs to multiple companies (e.g. a rep buying
for several accounts), Mercer renders a header dropdown that lists
each company. Switching uses Shopify’s standard account/login_to_b2b
form to swap the active company. The page reloads with the new
company’s pricing and catalog applied.
Customers with one company see no switcher; the catalog badge displays the company name as a static label.
Quantity rules
Shopify B2B lets you set per-variant quantity rules:
- Min — minimum order quantity (e.g. “must order 6”)
- Max — maximum order quantity (e.g. “max 240 per order”)
- Increment — order step (e.g. “in multiples of 6 — case packs”)
Mercer surfaces these in two places:
- A rules summary box above the qty stepper on the PDP and inside the quick-add modal: “Min 6, in increments of 6”. Mercer auto-hides this box when the rule is the default (min=1, max=∞, increment=1) — no point printing “any quantity allowed”.
- Stepper clamping: the qty stepper enforces the rules
client-side. Typing “5” on a min-6 product snaps to 6 on blur;
incrementing past max blocks. The stepper data island (
data-min,data-max,data-increment) is the source of truth forpdp.js.
Cart drawer + cart page also enforce the rules on quantity changes.
Setting up quantity rules
- In Shopify admin, go to Customers → Companies → [your company].
- Click into a price list / catalog.
- For the variants where you want rules, set Min, Max, and Increment.
- Save. The rules surface immediately for B2B buyers in that company.
Tier price table (volume pricing)
Shopify B2B lets you set quantity-based price breaks per variant (“10+: $84, 25+: $76, 50+: $68”). Mercer renders these as a tier table below the price on the PDP.
The active row (matching the current stepper quantity) is highlighted. Each row shows:
- The qty band (“10 — 24”, “25 — 49”, “50+”)
- The wholesale price for that band
- The retail SRP (compare_at_price) with strikethrough — when the
variant has a
compare_at_priceset
If the variant has no quantity_price_breaks, the tier table doesn’t
render. So if you have a B2B catalog without volume pricing, this UI
disappears silently.
Setting up tier pricing
- In Shopify admin, go to Customers → Companies → [your company].
- Click into a price list / catalog.
- For the variants where you want tier pricing, click Add quantity price break and configure each tier (minimum quantity + price).
- Save. The tier table surfaces immediately for B2B buyers.
Net 30 / payment terms
If your B2B customer’s location has payment terms configured (e.g. “Net 30”), the tier table header shows the term name and currency (“NET 30 · USD”). The cart drawer also shows a small reminder:
Wholesale order — billing terms apply.
Payment terms are configured per company location in Shopify admin under Customers → Companies → [company] → [location] → Payment terms.
Multi-company customers
A B2B customer can belong to multiple companies (most common: agency buyers, wholesale reps, or family offices). Mercer’s header dropdown lets them switch active company. The active company drives:
- Which catalog they see (which products / variants are available).
- Which price list applies (B2B vs retail; volume pricing).
- Which payment terms apply at checkout.
The customer’s most recently active company persists across sessions
via Shopify’s standard B2B session cookie. Mercer doesn’t override
this; it reads customer.current_location.company from the Liquid
customer drop.
Quick-add for B2B
The collection-page quick-add modal works for B2B catalogs too. The qty stepper inside the modal enforces the same rules as the PDP stepper. Volume pricing displays inside the modal as a compact tier table below the variant picker.
Two products are gated to PDP-only (no quick-add) regardless of B2B:
- Gift cards — recipient flow needs a full PDP
- Selling-plan-required products — subscription terms need a full PDP
For B2B specifically, products with min > 1 quantity rules still allow quick-add, but the modal opens with the qty pre-set to the minimum.
B2B and Markets
B2B and Markets compose. A B2B customer in Germany sees:
- The German Markets catalog (if a market is configured for Germany).
- Their B2B company’s catalog filtered to that market.
- Prices in EUR (per Markets) at their B2B tier (per company).
- The German language storefront (per Markets language).
- The Wholesale pill in the header (per B2B).
- Quantity rules and tier pricing in EUR (per B2B + Markets).
No special configuration is needed for B2B + Markets to compose; both surfaces read from Shopify’s native objects, and Mercer respects both.
Common B2B pitfalls
”Tier pricing doesn’t render”
Three things to check:
- The customer is signed in to a B2B account (
customer.b2b?is true). - The variant has at least one
quantity_price_breakconfigured in the price list. - The variant is in the company’s catalog. If the catalog doesn’t include this variant, the buyer can’t see it at all.
”The qty stepper isn’t enforcing min/max”
pdp.js is the script that reads the data island and clamps the
stepper. If it’s not loaded, clamping fails. Check that you’re not
overriding Mercer’s pdp.js in a Custom Liquid block; if you have
custom JS that prevents Mercer’s from running, the stepper falls back
to free-form input.
”Quick add lets buyers add 1 unit on a min-6 product”
Mercer’s quick-add modal opens with the qty pre-set to the rule’s minimum. If a buyer manually changes it to 1 inside the modal, the qty snaps back to 6 on blur. Cart-side enforcement (server) catches any client-side bypass on form submit.
”B2B customer sees retail prices”
Usually means the company’s catalog is set to use retail pricing instead of B2B pricing. Check Customers → Companies → [company] → Catalogs.
What’s next
- Read Markets if you also sell internationally.
- Read Theme Editor walkthrough for general composition.
- Read FAQ for more gotchas.