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 you’ve configured companies, catalogs, and pricing
in Shopify. Check Shopify’s current B2B availability and setup guidance
for the capabilities available on your plan. Mercer reads native B2B data — customer.b2b?,
customer.current_company, customer.current_location,
variant.quantity_rule, variant.quantity_price_breaks, and the
customer.company_available_locations array for multi-location
switching. Payment-term labels and the storefront PO requirement use
the company-location metafields below.
If your store is B2C-only, you can skip this guide. B2B controls appear only for signed-in B2B customers. The quick-order section can optionally show a plain product list to other visitors.
What Mercer ships
| Surface | Renders | Where |
|---|---|---|
| Company / location switcher | Company/location chip; dropdown for buyers with 2+ locations | Top-of-header B2B bar |
| Quantity rules | ”Min 6, in increments of 6” summary + quantity controls | PDP, Quick View, and B2B quick order |
| Tier price table | ”10–24: $84, 25–49: $76, 50+: $68” volume table | PDP, Quick View, and B2B quick order |
| B2B quick-order | Multi-variant grid with one-click add-selected-to-cart | Reusable section (merchant-addable on any template) |
| Cart aside | PO/reference field; payment-term display when its metafields are populated | Cart drawer + cart page |
The B2B controls render when customer.b2b? is true and the relevant
data is available.
Header B2B bar
When a B2B customer is signed in, Mercer renders a dedicated B2B bar at the top of the header (above the announcement bar). Its company / location switcher identifies the buying account and lets customers with multiple locations change their active location.
Company / location switcher
If a B2B customer has access to multiple company locations (e.g. a rep
buying for several accounts, or one company with several sites), Mercer
renders a switcher chip with a dropdown that lists each location. The
gate is the number of available locations
(customer.company_available_locations.size > 1), not the number of
companies — a buyer with one company but two locations still gets the
switcher. Each row is a company location, labelled “Company name —
Location name”. Switching navigates to Shopify’s native
company_location.url_to_set_as_current endpoint (a link, not a
login_to_b2b form), with a ?_company_location_id= request-path
fallback when that URL isn’t exposed. The page reloads with the new
location’s pricing and catalog applied.
Buyers with a single location see a compact read-only chip (company name + active location, plus a payment-terms summary when the label metafield is populated) but no switcher dropdown.
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 displays quantity rules on the PDP, in Quick View, and in the B2B quick-order grid:
- A rules summary box: “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 PDP stepper reads the input’s
min,step, andmaxconstraints, which account for the variant quantity already in the cart.
Cart drawer + cart page also enforce the rules on quantity changes.
Setting up quantity rules
- In Shopify admin, open Markets → Catalogs and select the catalog.
- Under Products and pricing, choose Manage → Manage products and pricing.
- Use Quantity rules → + Add for a product or variant. Set its increment, minimum, and maximum, then save.
See Shopify’s quantity-rule and volume-pricing instructions for the full workflow. Buyers receive the rules from their applicable catalog.
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 on the PDP, in Quick View, and in B2B quick order when its price-break display is enabled.
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 the same catalog’s Manage products and pricing view, use Volume pricing → + Add for the product or variant. Add the quantity price breaks, review them, and save. Follow Shopify’s volume-pricing instructions for the quantity requirements.
Net 30 / payment terms
Shopify’s native payment terms control checkout. Configure them under Customers → Companies → [company] → [location] → Payment terms; see Shopify’s payment-term setup .
Mercer’s storefront display reads the company-location metafields below. When the label is populated, an existing tier table shows the term name and presentment currency (for example, “Net 30 · USD”), and the cart aside shows a payment-terms block. A positive due-days value adds “Net N days”. Configuring native terms alone does not populate these storefront labels. For every signed-in B2B buyer, the cart drawer and cart page also show an acknowledgement below the checkout button, whether or not these metafields are populated:
Submitting confirms this account’s checkout settings apply.
Company-location metafields
Create these definitions for Company locations, using the exact namespace and keys shown. Each takes one value.
| Namespace and key | Type | Value |
|---|---|---|
mercer_b2b.payment_terms_label | Single line text (single_line_text_field) | The location’s native payment-term name, such as Net 30 |
mercer_b2b.payment_terms_due_in_days | Integer (number_integer) | Positive NET due days; leave empty for other terms or no terms |
mercer_b2b.purchase_orders_required | True or false (boolean) | true when your storefront policy requires a PO/reference |
- Open Settings → Metafields and metaobjects → Company locations.
- Add a definition for each row, setting its namespace/key and type.
- Open Customers → Companies, choose the company and location, and populate the values in that location’s Metafields section.
Shopify documents custom metafield definitions and company/location metafields . Mercer reads these values automatically; no dynamic-source connection in the theme editor is needed.
Keep the first two values in sync whenever native payment terms change. Clear both if the location no longer has terms, and clear due days when its terms are no longer NET. These values describe the checkout terms; they do not change them. An app can maintain the same values through Shopify’s Admin API. Installing the theme does not create or synchronize the metafields.
Purchase order / reference field
The B2B cart aside also renders a Reference / PO number field
(attributes[Purchase Order]), persisted as a cart attribute that
carries through to the order. It’s optional by default, but becomes a
required field (validated client-side) when the buyer’s location has
mercer_b2b.purchase_orders_required set to true. This is a storefront
policy stored in a metafield, separate from native payment terms. It
renders in both the cart drawer and the cart page.
Multi-location customers
A B2B customer can have access to multiple company locations (most common: agency buyers, wholesale reps, or one company with several sites). Mercer’s header dropdown lets them switch the active location. The active location 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 location persists across sessions
via Shopify’s standard B2B session cookie. Mercer doesn’t override
this; it reads customer.current_company and
customer.current_location from the Liquid customer drop, and lists
switch targets from customer.company_available_locations.
Quick-add for B2B
The collection-page quick-add modal works for B2B catalogs too. The picker modal renders only the variant option chips and a single Add button — there is no quantity stepper inside the modal, and no tier table. (The volume tier table lives on the PDP, the quick-view modal, and the B2B quick-order grid, not the quick-add picker.)
These products are routed to the PDP for purchase regardless of B2B:
- Gift cards — recipient flow needs a full PDP
- Selling-plan-required products — subscription terms need a full PDP
- Products with more than 50 variants, or a partially loaded variant set — the full selection cannot be represented by the quick-add picker
For B2B specifically, products with min > 1 quantity rules still allow quick-add when a valid addition is available. The quantity added takes the variant’s existing cart quantity into account: it reaches the minimum first, then the next valid increment. For a minimum of 6 and increment of 6, an empty cart gets 6; a cart already holding 4 gets 2; a cart holding 6 gets another 6. Add is blocked when the remaining maximum or available inventory cannot accommodate the next valid total.
B2B quick-order section
The b2b-quick-order section is a merchant-addable order grid for
signed-in B2B customers. Buyers enter quantities for multiple variants,
then add the selected rows to cart in one action.
The section self-gates on customer.b2b?. For non-B2B visitors, the
b2c_visibility setting controls whether the section renders nothing
or a plain product list. The quantity grid itself is never exposed to
B2C customers.
Quick order reuses Mercer’s existing quantity-rule and tier-table
snippets, so minimums, maximums, increments, and quantity price breaks
appear inline where Shopify exposes them. Submission uses Shopify’s
native Ajax Cart API through Mercer.cart.add([...]). It does not
create quotes, draft orders, or PO workflows.
A collection source loads at most the first 250 products in batches of 50. Larger collections retain a link to the full collection. A manually selected product list supports up to 50 products.
| Setting | Type | Notes |
|---|---|---|
source | select | collection or product_list |
collection | collection | Used when source is collection |
product_list | product_list | Used when source is product_list |
show_sku | checkbox | Shows variant SKUs |
show_inventory | checkbox | Shows inventory status for tracked variants |
show_quantity_rules | checkbox | Shows min / max / increment rules |
show_price_breaks | checkbox | Shows quantity price breaks |
color_scheme | select | Default, Editorial dark, Warm neutral, Accent pop, Soft contrast |
b2c_visibility | select | hide or product_list |
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 header company / location switcher (per B2B).
- Quantity rules and tier pricing in EUR (per B2B + Markets).
The result depends on your Shopify catalog and market configuration. Mercer renders the pricing and localization Shopify supplies; the payment-term display still needs the metafields documented above.
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 quantity input’s constraints 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”
Check how many units of that variant are already in the cart. Quick-add adds the remaining quantity needed to reach a valid total, so adding 1 unit can be correct when 5 are already in the cart and the minimum is 6. With an empty cart it adds the minimum. Shopify revalidates quantity rules at checkout.
”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.