Shopify B2B & the wholesale channel
WooCommerce runs wholesale well, and the reason is also the catch: you build the channel from plugins you choose, on hosting you are responsible for, with updates nobody schedules for you. A brand with some technical comfort gets a trade store that does exactly what it wants for a low monthly cost. A brand without that comfort gets a store that breaks on a Sunday.
If you already sell direct on WordPress and a shop has asked for trade prices, the build below is the short path. It assumes you want trade buyers ordering on their own, which is the only reason to build anything rather than send invoices.
The five pieces of the stack
A working WooCommerce trade channel is five decisions, and roughly three plugins.
Roles. WordPress gives you user roles, and wholesale is a role. Approved buyers get a wholesale role; everyone else is a customer. Every other rule in the stack keys off that role, which is why this is the first decision and why changing it later is painful.
Prices per role. A wholesale price field per product, shown only to the wholesale role. Set fixed numbers rather than a share off retail, so a consumer promotion cannot reach your trade margin.
Order rules. Minimum order value, minimum quantity per product, and quantity increments so a case of six cannot be bought in threes. These belong at the cart, where they can actually block a checkout, not only on the line sheet.
Registration and approval. A trade application form that creates a pending account, plus a manual approval step. Approval by hand is not a bottleneck at the volumes a small brand sees, and it is your only real gate against consumers finding the trade prices.
Payment and tax. Terms as a payment method that only the wholesale role can see, and tax exemption handling for resale where your country uses it. This pair is where self-hosted stacks genuinely beat the hosted platforms, because you can make payment options behave exactly as you want.
The role and rule layer is covered in more depth in WooCommerce B2B. What follows is the part that decides whether you should be doing this at all.
What it really costs to run
The monthly bill is the small part. Budget for four things.
Hosting that can handle a catalogue with per-role pricing, which is heavier than a plain shop because prices are computed per user rather than cached for everyone. A shared plan that was fine for a consumer store will get slow.
Plugin licences, typically annual, for the wholesale suite and anything it depends on. These renew, and an expired licence usually means no updates rather than a dead site, which is worse because it fails quietly.
Someone to do updates. WordPress core, WooCommerce, the theme and every plugin move independently. A trade store that has not been updated in a year is a security problem, and one that is updated without a staging copy is a checkout problem.
And your own time on the build, which for a competent operator is a few days and for a first-timer is a few weeks of evenings.
Against that, put what you are avoiding: a higher platform plan, and per-order fees on some hosted stacks. For a brand doing meaningful trade volume on thin margins, the self-hosted stack genuinely wins. For a brand with six accounts, it is a hobby with a maintenance schedule.
The pricing decision that the plugins will not make
Every wholesale plugin offers to set trade prices as a percentage off retail, because it is one field instead of hundreds. Resist it on anything that matters.
Take a ceramic mug at thirty-two dollars retail, costing you eleven dollars landed. A trade price of sixteen dollars leaves five dollars a unit, and a case of four is sixty-four dollars with twenty dollars of margin. Now express that as half off retail and run a holiday promotion where mugs are twenty-six dollars for ten days. Any trade order in those ten days prices at thirteen dollars, and your twenty dollars a case becomes eight.
Fixed numbers per product, reviewed once or twice a year, are the answer. The method for arriving at those numbers is in how to price wholesale, and it is platform-independent.
Where self-hosted stacks break
Three failure modes are common enough to plan for.
The first is plugin conflict. A wholesale plugin, a currency switcher and a caching layer all want to change the price a visitor sees. When two of them disagree, a trade buyer sees retail prices, or worse, a consumer sees trade prices. Always test the trade role in a private browser window after any update.
The second is caching. Page caching is how a WordPress store stays fast, and per-role pricing is exactly the thing caching gets wrong. Exclude the trade pages and the cart from the cache, then check them as a logged-in buyer rather than trusting the setting.
The third is email. Order confirmations, invoices and account approvals all leave through whatever your host allows, and self-hosted sites are prone to landing in spam. A buyer who never got the approval email assumes you ignored them.
When WooCommerce is the right answer
It fits when three things are true: you already run WordPress and are comfortable maintaining it, your trade catalogue or rules are unusual enough that a hosted platform would fight you, and you would rather pay in attention than in monthly fees.
It fits badly when wholesale is your first serious technical project, when nobody on the team owns updates, or when you need a shop with several buyers and locations to work cleanly out of the box.
If you are weighing it against the alternatives, the hosted comparisons are in BigCommerce wholesale and three ways to sell to stores. None of the three will matter much until you have accounts.
Build the channel before you build the store
The most expensive version of this project is a perfectly configured trade store with no buyers in it. Three real stockists, invoiced by hand, will teach you more about what your store needs than any amount of planning: which products shops actually take, which case pack they want, whether they ask for terms, how often they reorder.
So the order is: get the first accounts, run them manually, note every time you do something twice, and build the store to remove those repetitions. That is also the cheapest way to avoid paying for plugins you never needed.
If the missing piece is the list of shops, paste a product link into WholesalePilot and look at the preview of retailers and distributors that stock comparable products. Knowing whether fifty plausible buyers exist for your category is the input that should decide how much store you build.
Questions brands ask about WooCommerce wholesale
Can one store serve consumers and trade buyers? Yes, and it usually should. Roles handle the split, and a separate trade site doubles the maintenance for very little gain.
Do you need a separate wholesale catalogue? Only if the assortment genuinely differs. Most small brands sell shops a subset of what they sell consumers, which a role-restricted category handles.
How do you handle minimums that buyers ignore? Enforce the important one at the cart, state the rest on the line sheet, and accept that you will still reply to occasional requests by hand.
What about net terms? Add an invoice payment method visible only to the wholesale role, and grant it per account rather than to everyone. The policy side is in should you offer net terms.
Is a page builder enough, without a wholesale plugin? For displaying a line sheet behind a login, yes. For anything that has to compute a different price at checkout, no.