Two questions come up whenever a brand with a growing wholesale side looks at its store. Does wholesale need its own site, and does any of this need Plus.
The second answer changed on April 2, 2026, and most of what is written about Shopify B2B has not caught up. Company profiles, company locations, net payment terms, quantity rules, draft orders, purchase order numbers at checkout and self serve buyer ordering are on every paid plan now, Basic and Grow and Advanced included, at no extra cost.
So the interesting question is no longer which plan unlocks B2B. It is where a price hangs, because that is the part the plan still decides, and it sets the shape of everything built on top of it.
What the plan actually changes
Below Plus you get up to three active catalogs across all your B2B markets, and they attach to markets. On Plus you get an unlimited number, and they attach directly to specific companies and company locations.
That is a small sentence with a large consequence. Below Plus you are modeling your customer tiers as markets, and you have a budget of three. On Plus you are modeling them as locations, and the budget is gone.
The rest of the Plus reservation is narrower than the reputation suggests: deposit requirements, partial payments, and payment requests per fulfillment. Contextual checkout and contextual storefront sit on Advanced and Plus. Almost everything else, including the company structure itself and location level permissions for a location admin and an ordering only buyer, is on all of them.
The company is not the customer
Three objects carry B2B, and mixing them up is where most modeling goes astray.
A Company is the business entity. It holds contacts and locations but it does not hold prices.
A CompanyLocation is a branch, and it is the load bearing one. Billing and shipping addresses hang off it. So do tax exemptions, so a reseller exemption is set per location rather than per business. So do payment terms, attached through the location’s buyer experience configuration as a payment terms template, which runs from net seven to net ninety, or due on fulfillment or receipt, and is how one branch ends up on seven day terms while another is on thirty. Even a vaulted credit card is stored against the location rather than the company.
Notice what that list has in common. Almost everything that decides what an order costs and when it is paid for is attached one level below the business you think you are selling to.
A CompanyContact is a person acting for the company, and it is associated with an ordinary retail customer record underneath.
When an order is placed, the three combine into what Shopify calls a purchasing entity: a company, a company location and a company contact together. Not one of them. The order is only fully specified when all three are named.
This is why a customer’s head office is rarely the useful unit. Two branches of the same distributor can sit on different terms, different tax treatment and different prices, and the platform expects exactly that.
A catalog is two things, and forgetting one empties the store
Here is the detail that costs teams an afternoon, and it is the best reason to read the reference rather than a summary.
A catalog carries a price list, which sets what things cost, and a publication, which sets what the buyer can see. They are separate, and both are optional in the sense that the platform will let you ship without them.
Leave the publication off and a customer logged into their B2B account sees no products at all for that location. Not fewer products. None. It presents as a theme fault or a failed login, and it is neither.
Leave the price list off and something quieter happens: the buyer receives the initial variant prices converted into the market currency. Your retail prices, to a wholesale account, looking entirely normal. That one can run for a while before somebody notices, which makes it the more expensive of the two.
Percentages carry, fixed prices are the exceptions
A price list takes a percentage adjustment at its parent, and fixed prices for individual variants underneath it. Anything published without a fixed price is calculated from the percentage.
Two practical consequences. Adding fixed prices is capped at 250 per request and behaves as add and replace, so an existing price for a variant is overwritten rather than duplicated. And deleting a fixed price does not remove the product’s price, it drops the variant back to the percentage adjustment.
Which suggests the shape that holds up: model the tier as a percentage, and reserve fixed prices for the lines that were actually negotiated. A price list built entirely from fixed prices is a spreadsheet you now have to maintain through an API.
Sitting alongside that are quantity rules and volume price breaks, on every plan. Rules set a minimum, a maximum and an increment, so a case of twelve can be sold as a case rather than as twelve chances to order eleven. Breaks drop the unit price as the quantity climbs. Between them they cover most of what brands reach for a wholesale app to do, and they are worth exhausting before adding one.
The multiplication, and the way out of it
Say fifty pricing tiers and ten product assortments. Modeled as complete catalogs that is five hundred, and nobody maintains five hundred of anything.
The pattern Shopify documents is to split them. Make fifty pricing only catalogs, one per price list. Make ten publication only catalogs, one per assortment. Assign several catalogs to the same company location. Sixty objects instead of five hundred.
Two resolution rules come with it, and they are worth internalizing before you assign anything. Where more than one pricing catalog applies to a location, the buyer receives the lowest price. And a product is visible only if it appears in at least one applicable publication.
So an overlap that looks harmless is a discount nobody approved. Any audit of a B2B setup should start by listing which catalogs resolve for each location and what the cheapest resulting price is, rather than by reading the catalogs one at a time.
Note also that this whole pattern needs unlimited catalogs and direct assignment to a location, so it is a Plus technique. On a smaller plan the three catalog budget is the real constraint, and the modeling has to be coarser and more deliberate from the start.
What will catch you
Stranded objects. Moving a price list to a different catalog disassociates it from the old one, and if that catalog depended on it, it silently becomes publishing only and falls back to store default prices. Changing a catalog’s publication leaves the old publication in the system unless you delete it. The safe sequence is to read the current id, update, then delete the one you replaced.
An old field. PriceList.contextRule has been deprecated since API version
2023-04 in favor of catalogs. Anything written against it predates the model
described here.
No purchase options. B2B does not support subscriptions, pre orders, or try before you buy. If your wholesale program was going to run on standing monthly orders, that is a real constraint rather than a configuration detail, and it is worth knowing before the build rather than during it.
Where you can build. The Admin API’s B2B resources are reachable from development stores, Shopify Plus Partners through a sandbox organization, and Shopify affiliates. That shapes how the work gets staged more than most teams expect.
Invoicing is not special. Calculating a draft order for a purchasing entity, creating it, sending the invoice and completing it use the same mutations as any consumer draft order. The B2B part is the purchasing entity on the input, not a separate billing system. Teams routinely scope this as though it were one.
What the draft order does add is worth having: it locks the price and reserves the inventory while the buyer’s side works through approval. That is the difference between quoting a customer on Tuesday and still being able to honor it on Friday, and it is the argument for running approvals through draft orders rather than through email and a spreadsheet.
When a second store is still the right answer
Sometimes, and Shopify says so itself: one store for both, or a separate B2B only store, are both offered as legitimate shapes rather than one being a concession.
If wholesale trades under a different brand, ships from different inventory, or needs the purchase options B2B does not carry, then a separate store is a reasonable answer rather than a failure to configure one properly. Subscriptions are the usual reason, and we will say so rather than build around it.
For most brands the honest answer is the unglamorous one. One store, companies and locations modeled to match how the customer actually orders, and the wholesale experience carried by catalogs rather than by a parallel site nobody has time to keep in step with the first.
Where to start
Count two things before you build anything.
How many genuinely distinct price tiers do you have, and how many genuinely distinct assortments. If that pair is small, three catalogs is enough and none of this needs Plus. If it multiplies into something large, the split catalog pattern and direct assignment to a location are precisely what the upgrade buys, and now you can say so with a number rather than a feeling.
Then list your customers’ locations before their companies. The location is what carries the price, the terms and the tax, so the only modeling question that matters is which of your buyer’s sites order on different terms from each other.
Phil Bagdassarian
Max Laberge