Loading tutorials…
Loading tutorials…
Shopify B2B (formerly the Wholesale Channel) is now native on Plus. Companies, price lists, net-30 terms, and customer-specific catalogs all work — but most brands set up Companies wrong and end up rebuilding 3 months later.
Who this is forShopify Plus brands launching B2B / wholesale, or already using B2B but with messy Company setup. Especially relevant if you sell to retailers, agencies, or buy-on-account customers.
What you'll need
Step 1
Shopify Admin → Settings → Customers → Companies. Enable companies. This unlocks B2B-specific UI throughout admin.
In Shopify Admin (Plus account), navigate to Settings → Customers → Companies. Click 'Enable' to turn on B2B features.
This adds: Customers → Companies in the left nav, B2B-specific fields on the customer detail page, and B2B price list features under Catalogs.
Important: B2B and DTC coexist on the same store. Customers without a Company association see DTC pricing; customers attached to a Company see B2B pricing.
Decide: will B2B and DTC live on the same store (simpler, recommended) or separate stores (use an expansion store for B2B-only)? Same-store is the default for 80%+ of brands.
If using same-store: the storefront detects logged-in B2B customers and shows them their B2B pricing automatically.
Step 2
Customers → Companies → Add company. Each company has at least one Location (billing/shipping address) and one Customer (buyer).
Customers → Companies → 'Add company.' Fill in: company name (e.g., 'Acme Retail Inc.'), tax exemption status, primary contact.
Add the first Location. A Location is essentially a billing/shipping address + an assigned customer (buyer). For a retailer with one store, one Location is fine. For a chain with 12 stores, 12 Locations.
For each Location, set: name (e.g., 'Acme Retail — Brooklyn'), shipping address, billing address (can differ), tax ID, default payment terms (Net 30, etc.), tax exemption status.
Assign Customers (buyers) to the Location. Each Customer is a person who logs in and places orders for that Location. One Customer can be on multiple Locations within the same Company.
Save. Send the Customer an invite to their B2B account via Customers → [customer] → 'Invite to account.'
Step 3
Catalogs → Price lists → Add. A price list is a set of product prices that applies to specific Companies or Locations.
Catalogs → Price lists → 'Add price list.' Set: name (e.g., 'Tier 1 Wholesale — 40% off'), pricing type (percentage off, fixed price, or per-product override).
Choose products: 'All products' for blanket discount, 'Specific products' for per-SKU pricing, or 'Specific collections.'
Set the pricing. For a percentage discount: '40% off retail' applies the discount to all selected products. For fixed prices: upload a CSV mapping variant ID → wholesale price.
Configure who sees this price list: Companies → assign companies, or Locations → assign specific locations. Most flexible: by Company.
Save. Customers attached to those Companies/Locations now see the price list pricing when logged in.
Repeat for each pricing tier: 'Tier 1' (top accounts), 'Tier 2' (mid-tier), 'Tier 3' (introductory). Most brands have 2-4 tiers.
Step 4
B2B supports Net-15, Net-30, Net-60, and prepayment. Configure per-Location or per-Company.
On a Company or Location detail page, scroll to 'Payment terms.' Options: Net 7, Net 15, Net 30, Net 45, Net 60, Net 90, Due on receipt, Fixed date.
Set the default per Location. Customers on Net 30 see 'Net 30' at checkout — they can submit the order without entering a credit card.
B2B orders on payment terms create an unpaid order that the customer pays via your AR system (Shopify's built-in invoicing OR external tools like Treet, Balance, or Tranzio).
Decide your AR workflow: (1) Shopify-native invoicing (basic, free, manual reconciliation), (2) third-party B2B payments app (Balance, Treet — pay you upfront, handle collections), (3) external AR + manual reconciliation in your accounting system.
Test: log in as the test B2B customer, place an order with payment terms, confirm checkout shows 'Pay on terms' and the order completes without a credit card. Verify the order shows up in admin as 'Payment pending.'
Step 5
B2B customers benefit from: customer-specific catalogs (hide DTC-only SKUs), bulk order forms, quick reorder, PO number fields at checkout.
Customer-specific catalog: in Catalogs → Catalogs, you can create a Catalog that includes only B2B-relevant products. Assign the Catalog to specific Companies. Customers see only the products in their Catalog.
Bulk order form: install a B2B order form app (Wholesale Hero, B2B Login & Lock Theme, BSS B2B). Adds a CSV/SKU-based quick order page.
PO number field: install a checkout UI extension that adds a 'PO Number' field at checkout. Plus checkout extensibility allows custom B2B fields. Saves customers from emailing PO numbers separately.
Quick reorder: many themes have a built-in 'Reorder' button on past orders. If yours doesn't, install a B2B theme app extension.
Theme: consider a B2B-optimized theme (Trade Theme, Dawn with B2B settings enabled). The default storefront works but B2B themes have purpose-built UX (volume pricing display, MOQ enforcement, etc.).
Step 6
Shopify Flow can automate B2B-specific events: new B2B order → notify rep, payment overdue → send reminder, customer onboarded → assign to tier.
Apps → Flow → Create workflow. Choose triggers: 'New order' (filter by Company assigned), 'Payment overdue' (filter by Net terms), 'Customer created' (filter by Company assigned).
Example workflows: (1) New B2B order > $5K → email AE + ops, (2) Payment overdue by 7 days → send reminder email, (3) New Company created → assign to 'Tier 3' price list automatically.
Test each workflow with a sandbox test before turning on in production.
Monitor: Apps → Flow → Workflow → Logs. Confirm executions are firing and not erroring.
Step 7
Run a complete onboarding with one real customer before bulk-loading. Find friction early; fix before scaling.
Pick a friendly customer — ideally an existing B2B customer who emails you orders.
Create their Company, Location, Customer profile. Assign to the appropriate price list. Set Net 30 (or your default terms).
Send them the account invite. Walk them through (call/Zoom): how to log in, where to find their pricing, how to place an order, how PO numbers/Net terms work.
Have them place a real order. Watch them do it. Note every confusion: a button label, a missing PO field, a confusing pricing display.
After the order: do they understand when to pay? Do they have your AR contact? Is the order confirmation email clear?
Fix every friction point before onboarding customer #2. Bulk-load only after 3-5 customers run smoothly.
Common mistakes
Setting up Companies as Customers
What goes wrong: Treating each B2B account as a regular Customer (skipping the Company layer) means no Locations, no price-list-by-Company, no Net terms. You end up replicating logic in apps or manual processes. Migration to proper B2B later is a 20+ hour rebuild.
How to avoid: Always use the Company → Location → Customer hierarchy. Even one-person B2B accounts get a Company with one Location and one Customer.
Granting Net terms without onboarding/credit check
What goes wrong: B2B customers default to Net 30 → unpaid orders pile up → AR aging exceeds 60 days for 20-30% of customers. Cash flow hits, write-offs follow. Average bad debt on un-vetted Net terms: 5-12% of B2B revenue.
How to avoid: Build an onboarding flow: B2B application form → review → manual approval → invite. Default Net 30 only after first prepaid order. Use a B2B payment platform (Balance, Treet) that handles credit checks.
Too many price lists (one per customer)
What goes wrong: Brands set up 200 price lists, one per customer. Adding new products means updating 200 price lists. Adding a customer means cloning a price list. Maintenance is 5+ hours/week.
How to avoid: Use tiered price lists (2-4 tiers max). Most B2B brands fit in: Tier 1 (top 10%), Tier 2 (volume), Tier 3 (introductory). Custom pricing for the largest 1-3 accounts only.
B2B catalog mixed with DTC catalog
What goes wrong: B2B customers see all 500 DTC SKUs including consumer-only bundles, sample packs, and discontinued items. Order errors are 3-5x higher. Customer service overhead per B2B account doubles.
How to avoid: Create a B2B-specific Catalog (Catalogs → Catalogs). Include only B2B-appropriate products. Assign to all B2B Companies.
No PO number field at checkout
What goes wrong: Customers email PO numbers separately, forget to email them, or skip them entirely. AR can't match payments to orders. Customer service spends 5+ hours/week reconciling 'which PO matches which order.'
How to avoid: Build a Checkout UI extension that adds a "PO Number" field at checkout (or install a B2B PO app). Make it required for B2B customers. Store on the order in admin.
No B2B-specific email/notification design
What goes wrong: B2B customers receive DTC-style 'Thanks for your order!' emails with consumer copy ('Track your package on Shop App!'). Looks unprofessional. Some customers email back asking if the order is for them.
How to avoid: Customize order emails for B2B: business tone, PO number, payment terms shown, AR contact info. Shopify supports email template branching by Company-attached customer.
Recap
Done — what's next
How to set up Shopify Functions (the Scripts replacement)
Read the next tutorial
Hand it off
B2B on Plus is powerful but most brands launch it half-configured. Customers don't use it because logging in doesn't show their pricing clearly, PO fields are missing, or Net terms aren't approved. A Shopify B2B specialist at $14-16/hr can configure the full B2B stack (Companies, catalogs, price lists, Flow, AR integration) in 2-3 weeks — typically $1,200-2,400 total.
See specialist rates
No. The old Wholesale Channel (a separate Plus expansion store) was deprecated. Modern Shopify B2B is native to Plus, runs on the same store as DTC, and uses Companies + price lists + Catalogs. Brands still on the old Wholesale Channel need to migrate — Shopify provides tooling.
Yes — this is the default and recommended. Customers without a Company association see DTC pricing. Logged-in B2B customers see their assigned price list. Same products, same store, different prices and checkout flow.
Set payment terms per Company or Location (Net 7, 15, 30, 60, 90). Customers on Net terms skip credit card entry at checkout and submit an unpaid order. You collect payment via your AR process — Shopify-native invoicing, a B2B payment platform (Balance, Treet, Tranzio), or external AR system.
Yes — but not natively. Most brands: (1) put a B2B application form on the storefront, (2) manually review, (3) create the Company + Customer in admin, (4) send invite. Apps like B2B Login & Lock and BSS B2B automate this flow.
Use a Shopify Function (Product Discount type) that reads cart line quantities and applies tiered discounts. Or use a volume-discount app. Built-in price lists are flat-percentage or fixed-price per product — not quantity-tiered.
Shopify Plus
Shopify Functions are the official Scripts replacement. They run server-side at checkout, written in JavaScript or Rust, deployed via CLI. Most Plus brands need 3-7 Functions to replicate their old Scripts. Here's how to build the first one.
Shopify Plus
Shopify Flow is the free Plus-included automation tool. Most brands install it, build one workflow, then forget about it. The brands that get value out of Flow build 10-20 workflows that run silently in the background.
Shopify Plus
Most Plus brands rush into expansion stores for multi-country sales when Markets does it on one store. Same inventory, same customer database, same admin — with per-country pricing, currency, and tax. Here's the right setup.
Shopify
Shopify killed checkout.liquid in August 2025. If you haven't migrated, your old pixels and order-confirmation customizations are silently broken. Here's the full checkout extensibility migration — pixels, CAPI, and post-purchase logic.