Sell a B2B-only version of a product
Applies toShopify
The b2b-only tag hides a whole product from retail shoppers. That works when a product is only ever sold to trade customers. When you sell the same item to both, in a different pack size or format for trade, the trade version needs its own product, with its own SKUs, so it can be tagged and priced on its own.
Pick the right route
Not every B2B-only product needs a duplicate. Choose by what you want to do:
| You want to | Do this |
|---|---|
| Show a whole existing product to B2B customers only | No duplicate: tag the product b2b-only, then check steps 5 and 6 below. See Make a product B2B-only or B2C-only |
| Sell a B2B version of a retail product, such as a case of 12 alongside single bottles | Follow every step on this page |
| Show a range to one customer group only, such as VIP trade customers | No duplicate: hide it from the other groups with the sparklayer.settings metafield. See Catalogs per customer group |
Before you start
- B2B Catalogs installed, and enabled on the theme you'll test on. See Install and enable B2B Catalogs.
- A B2B customer to test with, tagged
b2b, and a retail customer account. See Assign customers to a customer group. - The trade price for the new version, or the rule your price list uses for it.
Create the B2B-only version
Duplicate the original product
In your Shopify admin, open the original product at Products (opens in your Shopify admin in a new tab), then click More actions > Duplicate. Name the copy after the original plus its pack size or format, such as "Olive Oil, Case of 12", and copy the images. Set its status to Draft.
More detail
Keep it as a draft until it's tagged b2b-only in step 3. A product that goes live untagged shows to everyone, retail shoppers included.
Give every variant a new SKU
Open each variant of the copy and replace its SKU, so none is left the same as the original's. A simple pattern is the original SKU plus a suffix: OIL-500 becomes OIL-500-CASE12. Then, under Search engine listing, remove -copy from the URL handle.
More detail
SparkLayer matches prices to products by SKU, so every variant needs a SKU of its own. If the copy shares a SKU with the original, the trade price lands on the wrong product or doesn't show at all. See Do I need product SKUs when uploading pricing?
Tag it b2b-only and make it active
Add the tag b2b-only in the product's Tags field. Change its status to Active and click Save.
Should B2B customers still see the retail version too? If not, tag the original b2c-only, so they only see the trade version.
Price it for your B2B customers
Do this once the product is Active: SparkLayer only syncs active products, so it can't price a draft. How depends on your price list:
| Price list | What to do |
|---|---|
| Automatic (for example 30% off your Shopify prices) | Nothing to add: it prices every product, including the new one. Check the price looks right |
| Manual (exact prices) | Add a price for each new SKU, with the Price editor or a CSV upload, in every price list your B2B customer groups use |
Then check the new SKUs' prices at
SparkLayer Wholesale,Pricing,Price editor (in your Shopify admin).
Check B2B Catalogs is on your live theme
Open B2B Catalogs in your Shopify admin, and check your live theme shows as Enabled. Without it, the b2b-only tag does nothing: it's the most common reason a product still shows to retail shoppers.
More detail
If B2B Catalogs isn't installed yet, install it from the Shopify App Store (opens in a new tab) and enable it on an unpublished copy of your theme first, to check it. See Install and enable B2B Catalogs.
Test it as three kinds of visitor
Check the product as each of these. All three must pass.
| Test as | Sees the product? | What you should see |
|---|---|---|
| A signed-out visitor, in a private browser window | No | It's missing from collections and search. Its URL shows the access denied page |
| A signed-in retail customer | No | The same as a signed-out visitor |
| A signed-in B2B customer | Yes | It's in collections and search, at the trade price from their price list |
Common mistakes
A variant still has the SKU it was copied with. Check every variant of the copy, not just the first, and give each one its own SKU. See step 2.
Prices were added while the product was a draft, or it's on a manual price list without its new SKUs. Check the product is Active, then check its SKUs at
SparkLayer Wholesale,Pricing,Price editor (in your Shopify admin). See step 4.
Check the product is tagged b2b-only, and that B2B Catalogs is enabled on your live theme. See step 5 and Why don't my b2b-only and b2c-only tags do anything?.
No. Tags work on whole products, and Shopify can't hide a single variant from retail shoppers. If only one pack size is for trade customers, make it its own product, as on this page. See Variants and retail shoppers.
The new SKUs have their own inventory in Shopify. If the trade version comes from the same physical stock as the original, decide how you'll keep both counts right, for example by adjusting them when you restock.
Good to know
- Collection pages can show gaps. A hidden product can still take a place in a collection grid, and count towards product and filter totals. Keeping B2B-only products in their own collections avoids it. See Collection grids, search and filter counts.
- Hiding doesn't empty carts. A product already in someone's cart stays there, and add-to-cart links still work. See Hidden products in a cart.
Next steps
Last updated