For most brands, the best way to run Shopify wholesale is native B2B on the store you already have: wholesale buyers log in to the same storefront and see their own catalog, prices and payment terms, while consumers keep seeing retail. A separate store or an app is the right call only in specific cases. The hard part is deciding pricing, terms, minimums and inventory ownership before the first account logs in.
Wholesale options on Shopify
There are four ways to take wholesale orders, from least to most structured:
- Draft orders. Accounts email their order, you build a draft order at wholesale prices and send an invoice. Nothing to set up, but every order is manual.
- Wholesale apps. Apps that show wholesale prices to tagged customers and add order forms or quote flows. Some apply the price through discounts or draft orders behind the scenes, which can clash with your other discounts, so check how the price reaches checkout.
- Native B2B on your existing store. Companies, catalogs, price lists, payment terms and quantity rules built into Shopify Plus, sharing one catalog and inventory with retail.
- A separate wholesale store. A second storefront only for trade buyers, running native B2B or an app.
| Option | Best for | Ongoing effort | Main watch-out |
|---|---|---|---|
| Draft orders | A handful of stockists ordering occasionally | High per order | No self-serve; doesn’t scale |
| Wholesale app | Non-Plus stores, or needs native B2B doesn’t cover, such as quote requests | Low to medium | How prices are applied; dependence on one vendor |
| Native B2B, same store | Most brands with an overlapping catalog | Low after setup | Requires Shopify Plus; wholesale-only SKUs visible to consumers |
| Separate wholesale store | Different catalog, legal entity or team | Highest | Duplicated apps, product data and inventory sync |
One store or two
Default to one store: one product catalog, one inventory count, one theme and one set of apps. B2B orders carry the company and location, so you can still separate them in reports.
A second store earns its overhead when at least one of these is true:
- The wholesale catalog is substantially different: case packs, display units, retailer-only SKUs or product content written for buyers rather than consumers.
- Wholesale runs through a different legal entity, currency, tax setup or payment provider.
- You want the entire wholesale storefront behind a login, invisible to search engines and consumers.
- A separate team owns wholesale with its own P&L.
The cost is real: syncing products and inventory between stores through an app or your ERP, paying for apps twice and updating two themes. On Shopify Plus, expansion stores are included; on other plans, each store is its own subscription. Whether your setup needs Plus at all is covered in Shopify vs Shopify Plus; this post focuses on the build.
Company accounts, catalogs and price lists
Native B2B is built around three objects:
- Companies: the business you sell to.
- Locations: each place that company orders for, with its own shipping and billing addresses, payment terms, catalogs, tax details and checkout settings. A retailer with three shops is one company with three locations.
- Customers (buyers): the people who place orders, each assigned to one or more locations with a role such as ordering only or location admin.
Before importing, build a sheet with one row per location: legal name, addresses, buyers, price tier, payment terms and tax status. Gaps in that sheet become support tickets after launch.
Catalogs and price lists
A catalog decides which products a location can see and buy, and its price list sets what they pay. A price list can apply a percentage adjustment to all products, set fixed prices on specific variants, and add volume pricing (price breaks at higher quantities).
Two pricing decisions matter most:
- Tiers versus negotiated prices. Launch with two or three tiers, for example standard wholesale around half of retail and a lower distributor price. Account-specific pricing multiplies catalogs and admin work.
- Percentage versus fixed prices. A percentage-based price list follows your retail price, so if you run DTC sales by lowering the product price itself, wholesale drops with it. Use fixed prices for core SKUs, or run DTC promotions through discounts.
Moving from WooCommerce, where wholesale often ran on a plugin with customer roles? Map each role to a tier and catalog; the WooCommerce to Shopify migration checklist covers the rest.
Payment terms, minimums and quantity rules
Payment terms
Each location gets its own terms: net terms such as Net 30, due on fulfillment or due on a fixed date. Buyers can also pay by card, and cards can be saved to the company for later orders. Each location can also require a deposit at checkout.
Credit limits and collections belong in your accounting system or ERP. A practical policy: new accounts pay by card at first, then move to terms once they’ve paid on time. For new or at-risk accounts, turn on the location setting that submits orders as drafts for review.
Minimums and quantity rules
| Rule | Native in B2B? | Example |
|---|---|---|
| Minimum quantity per variant | Yes, in the catalog | At least 6 units |
| Order in increments | Yes, in the catalog | Sold in cases of 6 |
| Maximum quantity | Yes, in the catalog | Limited release, maximum 24 |
| Volume price breaks | Yes, in the price list | Lower unit price from 48 units |
| Minimum order value | No | $300 opening order, $150 reorder |
An order-value minimum needs a cart and checkout validation app built on Shopify Functions. A theme message helps as guidance, but buyers can get around it, so the block has to happen at checkout.
Whatever the rules, publish them on your wholesale terms page so nothing surprises buyers at checkout.
Keeping wholesale pricing hidden from DTC shoppers
With native B2B, wholesale prices only appear after a buyer logs in and selects a location. Logged-out visitors see retail. The leaks happen around that:
- Wholesale-only SKUs. A case pack published to the online store can surface in search, collections, the sitemap and product feeds. Hide it from DTC browsing, exclude it from feeds and confirm a logged-out visitor can’t buy it by URL, or use a separate store.
- Discount stacking. Check how your discounts behave for company buyers, so a DTC promotion doesn’t land on top of a wholesale price.
- Email. Exclude company buyers from DTC campaigns and flows. A retailer who gets a consumer promotion will ask why their price is worse.
- Applications. Some consumers apply for wholesale to get the discount. Require a business name, tax or resale ID and a storefront or website, and approve accounts manually.
- Theme-based pricing. If an app changes prices in the theme with scripts, check whether wholesale prices show up in the page source for logged-out visitors.
Add a “Wholesale login” link in the header or footer so buyers don’t shop logged out by mistake.
Inventory, ERP and fulfillment integration
Decide which system owns each piece of data before you connect anything:
| Data | Usual system of record | Sync direction |
|---|---|---|
| Products and retail prices | Shopify or a PIM | Out to the ERP |
| Wholesale price lists | ERP, if it holds contract pricing | ERP to Shopify catalogs |
| Companies, locations, terms | ERP or accounting system | ERP to Shopify |
| Inventory | ERP, WMS or 3PL | Into Shopify |
| Orders | Shopify | Shopify to ERP |
| Invoices and payment status | Accounting system or ERP | Back to Shopify |
Many ERP connectors handle DTC orders well but only partly support companies, catalogs and payment terms. Confirm B2B support with a test order before you sign.
Inventory allocation is the decision teams skip. In one store, wholesale and DTC share stock, so one large retailer order can sell out your best seller for consumers. Keep a DTC safety buffer, allocate wholesale stock in your ERP or WMS, or accept the trade-off deliberately.
Fulfillment needs its own checks:
- Buyers can enter a PO number at checkout. Make sure it reaches packing slips, invoices and the ERP.
- DTC free-shipping thresholds can hand free freight to a 20-case order. Review rates against wholesale order sizes.
- Large retailers often require EDI and routing guides. Shopify doesn’t handle EDI on its own, so plan for an EDI provider if those accounts are coming.
Launching to your first wholesale accounts
Don’t invite every account on day one. Pilot first.
- Pick five to ten accounts that order regularly and will tell you what’s broken.
- Import their companies, locations and buyers, then assign catalogs, terms and checkout settings.
- Test as a buyer at each account: login, prices, quantity rules, minimums, checkout on terms, ERP sync and invoice.
- Turn on order review so your team approves each pilot order.
- Send a one-page guide covering login, reordering from order history and where terms appear.
- Run the old process in parallel for a few order cycles, then roll out to the remaining accounts.
After launch, watch the share of orders placed self-serve versus by email, order corrections, time from order to invoice and reorder frequency by account.
Pre-launch checklist:
- A test buyer sees wholesale prices logged in and retail logged out
- Quantity rules and the order minimum block an invalid order at checkout
- Wholesale-only SKUs are excluded from DTC search, collections and product feeds
- DTC discounts don’t apply to wholesale orders
- Company buyers are excluded from DTC email campaigns and flows
- A test order on terms reaches the ERP with company, PO number and terms
- The DTC inventory buffer or allocation rule is agreed
- Someone owns account approvals, price list changes and overdue invoices
When I build wholesale channels as part of Shopify development work, most of the time goes into pricing policy, ERP mapping and the pilot. The admin configuration is the quick part.
Get it built
If you want a wholesale channel your accounts actually order through, I can plan and build it, from price lists to ERP sync. Shopify builds and migrations start from $6,000, or start with a Growth Audit, $1,500 fixed and credited if we continue. See pricing or get in touch.