Wholesale pricing guide

How B2B Onboard price levels work: percentage, fixed or Shopify-managed prices, the level file, quantity breaks and quantity rules, the routes by Shopify plan, and what stays after uninstalling.

What a price level is

A price level is the wholesale pricing an approved buyer sees: a percentage off retail or fixed prices from a file, plus optional quantity breaks and quantity rules. You create and edit levels under Settings → Wholesale pricing → Price levels. Two price levels cannot have the same name. You never have to open Markets or Catalogs in Shopify admin yourself.

The app compiles each level into Shopify's own B2B pricing objects, so your theme shows the prices and Shopify checkout charges them:

  • Catalog — the level's catalog, named after the level with “(B2B Onboard)” after it.
  • Price list — attached to the catalog, in your store currency, with the level's percentage as its adjustment, plus any fixed prices and quantity breaks.
  • Publication — makes every product, and products you add later, available in the catalog.
  • B2B market (Basic, Grow and Advanced plans only) — the market the catalog belongs to. Approved company locations are added to it. On Shopify Plus there is no market: the catalog is assigned to the company location directly.

Nothing is added to your theme: no theme edits, no price rewriting, no cart hooks. Gift cards always keep their retail price on a level.

Keep at retail price: on a level with a percentage off retail, the Keep at retail price card lists products buyers on the level pay the full retail price for, for example lines that are already discounted or brands with fixed pricing. It is on Products on this level (level page → Manage products), under Rules for products on this level. Click Choose products, pick up to 250 products and click the card's Save. On the level page, Products on this level shows how many products are kept at retail price. The app writes the retail price as the product's price on the level and follows your retail price when it changes, usually within a few minutes. These products get no quantity breaks; quantity rules still apply. A product with a fixed price in the level file uses that price instead. The list does not count toward your plan's fixed-price rows. Remove a product from the list and save the card: it goes back to the level's price, usually within a few minutes. On a level with fixed prices and other variants at retail, products that aren't in your level file already stay at retail price, so the card shows no list there.

Products buyers on this level can buy: by default buyers on a level can buy every product, including products you add later. The Products buyers on this level can buy card, on Products on this level (level page → Manage products) under Rules for products on this level, offers two other choices: All products except the ones you choose, or Only the products you choose. Click Choose collections or Choose products, pick up to 20 collections and 250 products (for more products, put them in a collection; a list can cover up to 100,000 products) and click the card's Save. Each of the two cards saves on its own. The change reaches buyers within a few minutes. Products you add to or take out of a chosen collection later follow the choice: the first change usually within a minute, further changes within about ten minutes. With All products except the ones you choose, a new product reaches buyers within a few minutes too, not instantly. Gift cards follow the product list like any other product. The wholesale fee product is not affected by the list, so fees are still charged. If you delete a collection that is on a list, Storefront readiness tells you; on an All products except list nothing is added back until you update the list. Buyers on the level can't open or buy the other products: they are missing from collection pages, the order sheet and checkout, and their product pages show "not found". Your theme's storefront search can still list such a product by name; opening it shows "not found" and it can't be added to a cart. The level's prices for those products stay saved, so they apply again if you put a product back on the list. If a buyer location also gets a catalog you made in Shopify, its products stay available to that location; Storefront readiness points it out. A company with its own prices gets the product list of the level it came from. On a level whose prices are set in Shopify admin, the products are chosen in Shopify admin too.

A level can also carry checkout rules: an order minimum or maximum, a required purchase order number, hidden payment methods, (on Shopify Plus) net terms at checkout, a handling fee (and on Shopify Plus a surcharge on every line), and shipping options hidden at checkout on every plan. See the wholesale checkout rules guide.

The level's page shows What gets written — a list of exactly these objects and rules — and the time and size of the last write. Beside the form, the panel turns into What happens on save while there are unsaved changes: it names each write the save will make and whether buyers see it at once or after a background write. Changing the percentage alone is a single price-list change (no product is rewritten), and rounding only applies to fixed prices (quantity-break variants and rows from a file). While prices are being written a banner shows how many variants are done so far; if a write fails or stops reporting progress, the banner offers Retry sync.

Percentage, fixed or leave as set

Each level sets its base price in one of three ways:

  • Percentage off retail — the price list takes a percentage off every product's retail price and follows retail when you change it. Choose a rounding: no rounding, round down to .95, or round to whole units. Currencies without decimals, such as JPY, always use whole units.
  • Fixed prices from a file — upload a level file of SKUs and fixed prices (see The level file). Variants that are not in the file either get a percentage off retail or stay at retail; you choose which. Your plan includes a number of fixed-price rows across all your price levels (see The level file).
  • Leave prices as set in Shopify admin — the app only attaches buyers to the catalog and writes nothing to its prices. Use this when you already maintain the price list yourself.

Changing the percentage or the rounding updates the price list straight away. Products that have quantity breaks carry a fixed price (a Shopify rule), so after such a change the app writes those products' prices again; the banner on the level shows the progress.

The level file

Each level the app created takes one file in CSV format, the level file, uploaded, downloaded and removed on Products on this level (level page → Manage products). A row can give a SKU a fixed price, its own quantity rules (minimum quantity, pack size and maximum quantity), its own quantity breaks as a percentage, or a combination. The file needs a header row with sku and at least one of price, min_qty, pack_size, max_qty or break_percent_1:

  • sku — the variant SKU, exactly as in Shopify.
  • price — the fixed price per unit, in your store currency, as a number with up to two decimals (for example 12.50). Leave it empty on a row that only sets quantity rules or that has break_percent cells.
  • min_qty — the minimum quantity a buyer orders of that variant. Empty means one pack.
  • pack_size — the pack size: the variant is sold in multiples of this number. Empty means 1.
  • max_qty — the maximum quantity per order. Empty means no maximum quantity.
  • break_qty_1 and break_price_1 up to break_qty_10 and break_price_10 — optional quantity breaks for that SKU as prices. A break price needs a fixed price on the same row. A break quantity is a whole number of 2 or more, and each break quantity must be higher than the one before.
  • break_qty_1 and break_percent_1 up to break_qty_10 and break_percent_10 — optional quantity breaks for that SKU as an extra percentage off this level's price, on a row without a price. A percentage is a number above 0 and below 100 (5, 7.5 or 5%). The columns break_percent_off_1 and break_discount_1 are read as break_percent_1.

The columns min_quantity, sold_in_multiples_of and max_quantity are read as min_qty, pack_size and max_qty. Other columns are ignored, so a file you already have keeps working: a file with only sku and price (and break columns) uploads exactly as before.

Example:

sku,price,min_qty,pack_size,max_qty,break_qty_1,break_price_1
TEA-BOX-6,,,6,,,
CUP-4,3.10,8,4,,24,2.90
LIMITED-1,,,,24,,

Here TEA-BOX-6 is sold in packs of 6 (minimum quantity 6), CUP-4 gets a fixed price of 3.10 with a minimum quantity of 8 in packs of 4 and a lower price from 24, and LIMITED-1 has a maximum quantity of 24 per order. In a file with a quantity rule column, a row with only a SKU is skipped and counted. In a file without one, an empty price is an error, so a price blanked by mistake is caught, except on a row with break_percent cells, where the price is always left empty.

Quantity breaks as a percentage. On a percentage level of 20% with no rounding, this file has no price column at all:

sku,pack_size,break_qty_1,break_percent_1,break_qty_2,break_percent_2
TEA-BOX,6,12,5,48,10
CUP-SET,,10,7.5,,
MUG-1,4,,,,

TEA-BOX (retail 30.00) costs 24.00, 22.80 from 12 and 21.60 from 48, in packs of 6. CUP-SET (retail 12.00) costs 9.60, and 8.88 from 10. MUG-1 only gets a pack size of 4 and the level's 20% off retail. Each break is the extra percentage off the product's level price (24.00 minus 5% is 22.80), with the level's rounding, exactly as the level's own quantity breaks are computed. On a fixed-price level the product's price is the level's price for products not in the file (the percentage off retail, or retail), with its own breaks on top. The level's rounding applies to that price too, also when it is retail: with Round to .95 a product with percentage breaks and a retail price of 19.80 costs 18.95, and with Round to whole units it costs 20.00, while products not in the file stay at exactly 19.80.

These prices follow retail: when you change TEA-BOX's retail price to 40.00 in Shopify admin, the app writes 32.00, 30.40 and 28.80, usually within minutes. A product with its own percentage breaks uses those breaks, as a whole, instead of the level's quantity breaks, wherever the level's scope is and also when the level has none. A product with a fixed price in the file keeps its own break prices, or the level's quantity breaks where they reach it. Percentage break rows never count toward your plan's fixed-price rows.

Which levels take what. On a level with fixed prices from a file, rows can set fixed prices, quantity rules or both. On a percentage level, the file sets quantity rules and percentage breaks; a row with a price is refused with a message that names the line and tells you to switch the level to fixed prices or remove the price. On a level that leaves prices as set in Shopify admin, the file sets quantity rules only: a row with a price or a percentage break is refused, and so is switching a level to that choice while its file has percentage breaks (remove the break_percent columns first). On every level, a row with a price takes break prices, not percentages, and one row cannot mix break prices and break percentages; the message names the line and the fix. A level you brought in with Manage here (badge From Shopify, pricing Set in Shopify admin) takes no file, because the app never writes its prices. The quantity breaks scope “SKUs from the uploaded file” means the rows with a fixed price; rows with their own percentage breaks keep those.

Own values win. A product with its own value in the level file uses that instead of the level's quantity rules, as a whole: an empty min_qty means a minimum quantity of one pack and an empty max_qty means no maximum quantity, even when the level sets them. Products without their own row follow the level's quantity rules where the level's scope reaches them.

Removing quantity rules or percentage breaks. Delete a row and upload the file again, choose Remove level file, or clear the level's quantity rules and save. The app removes those quantity rules and quantity breaks from Shopify in the background, usually within a few minutes; the level shows Synced when it is done. A product that loses its own row follows the level's quantity rules, or none, and gets the level's quantity breaks where they reach it, or the level's price without quantity breaks. While the change is applied, such a product can briefly show the level's price without quantity breaks. Prices you set yourself in Shopify admin are never removed. Up to three such changes can wait to be applied; a fourth save that removes quantity rules asks you to save again when the level shows Synced.

Commas or semicolons both work as the separator. With semicolons, a decimal comma (12,50) is accepted too. Quoted fields are fine. If a SKU appears twice, the later row is used as a whole and the page warns you, including when that row drops the fixed price.

A file can have up to 50,000 rows and be up to 4 MB. Across all your price levels, your plan also includes a number of fixed-price rows: 1,000 on Free, 10,000 on Starter, 25,000 on Growth and 150,000 on Pro. Only rows with a fixed price count toward it. Your plan also includes the same number of rows with quantity rules (a minimum, maximum or pack size of their own, with or without a price), across all your price levels of every kind. Rows with percentage breaks only count toward neither. The level page shows how many of each are in use. A new file that would take you over either total is refused with a message that says so; upgrade your plan or remove rows. Switching a level back to fixed prices counts its kept file toward the fixed-price rows the same way; a file with no more rows with quantity rules than the one it replaces is never refused for them. Saving other changes is never refused, and files and rows you already have are never removed.

When you choose a file under Upload level file, the dialog counts its rows and SKUs, how many have a fixed price, how many have quantity rules and how many have their own quantity breaks, and lists any problems with their line number and the fix, for example Line 12: pack size 6 does not divide minimum quantity 10. Use 12. Nothing is written until the file has no errors and you click Upload. The file is checked against the rules saved on the level page, so save those first; if new rules conflict with the current file, remove the file, save the rules, then upload the corrected file. Afterwards the level page names any SKU in the file that matched no product; those rows get nothing until you fix the SKU.

Download the level file. At the top of Products on this level, Download current file gives you the level's file with its current values in the same columns the upload reads; on a level without a file the button is Download template, a header with two example rows (EXAMPLE-ROW-1, EXAMPLE-ROW-2) that the upload refuses until you delete them. Download with all products lists every SKU in your store, with the level's values filled in where the level has them and empty rows elsewhere, plus a product (not imported) column with the product name; the upload ignores every column whose name ends in "(not imported)" and skips rows with only a SKU. Variants without a SKU are left out; the file holds at most what one upload takes (50,000 rows, 4 MB), and the list says when it stopped.

The file is prepared in the background, usually within a minute; a large store's all-products file can take a few minutes. You can leave the page: the download stays listed under Downloads on that page for 7 days, with Queued, Being prepared, Ready (and Download) or Failed with the reason. One file of each kind is prepared at a time per level.

Edit and upload it again. Change cells, delete rows, and upload the file as usual. Uploading a downloaded file unchanged changes nothing: The file matches the level file. Nothing changed. The price column only ever holds fixed prices you uploaded: on a level with a percentage off retail, or with prices set in Shopify admin, the download has no price column, so filling in pack sizes or minimum quantities and uploading it never sets a fixed price. An edited file replaces the stored one, so price rows kept from an earlier fixed-price file are dropped.

Products on this level

Open a level and click Manage products under Products on this level. The page lists one row per variant. Own values shows the products in the level file (search by SKU, filter by own price, own quantity breaks or own quantity rules); All products searches your whole store by name or SKU. Each row shows the price a buyer on the level pays and why, in words (for example Fixed price · level file, 20% off retail · own quantity breaks, Retail price · not in the level file or Kept at retail price; a product the level's product list leaves out shows Not on this level's product list and no price), the retail price, the quantity breaks and the minimum quantity, pack size and maximum quantity, each marked own (from the level file) or level (from the level page). These are the same prices the product page block in Shopify admin shows. A SKU in the file that matches no product says No product has this SKU. If Shopify does not answer, product names and prices show as — with a Try again button; the page never shows a price it could not check against the retail price. On a level made from a catalog you set up in Shopify, the page only shows what buyers pay; prices are changed in Shopify admin.

The upload, the downloads and Remove level file are at the top of this page (see The level file). The level page keeps the level's own settings, and its Products on this level card counts the products with their own values in the level file.

Quantity breaks and rules

Quantity breaks give an extra discount when a buyer orders more of one variant. Add up to 10 quantity breaks (Shopify's limit per product), each with a starting quantity and an extra percentage off the base price. The page shows an example price per quantity break for a retail price you choose, and a preview of the table a buyer sees.

Shopify only allows breaks on a fixed base price. On a percentage level the app therefore writes a fixed price, computed from the percentage, for each product the breaks apply to, and writes it again when you change the percentage or the product's retail price. A product can also get its own percentage breaks from the level file (see The level file). On a level that leaves prices as set in Shopify admin there are no breaks, only quantity rules.

Quantity rules set a Minimum quantity per product variant, a Pack size (the variant is sold in multiples of it) and a Maximum quantity per product variant in one order. With only a pack size set, the minimum quantity is one pack. Shopify enforces them in the cart and at checkout and shows them on the quantity field. A product with its own value in the level file uses that instead (see The level file).

Shopify only accepts a quantity break that fits the rules on the same products: each break quantity must be at least the minimum quantity, not above the maximum quantity, and a multiple of the pack size, for example Break quantity 20 must be a multiple of the pack size (6). The app checks this when you save a change to the breaks, the rules or the level file, for the quantity breaks on the level, for the breaks in your level file and against each product's own quantity rules in the file, and names the break that does not fit. The level file's own breaks are checked when the breaks apply to all products or to the SKUs in your file; with chosen collections or products the app cannot tell which file rows fall inside, so it leaves them to Shopify.

Breaks and rules share one scope: all products, chosen collections, chosen products, or (on a fixed-price level) the SKUs with a fixed price in your level file. Without breaks, the rules apply to all products. Products outside the scope keep the base price only.

The quantity breaks table and the quantity rules are rendered by your theme. Shopify's current theme generations, such as Dawn and Horizon, show them on the product page for B2B buyers.

Routes by plan and the three-level cap

  • Basic, Grow and Advanced: a level reaches buyers through its own B2B market. Shopify allows 3 active catalog assignments across B2B markets on these plans, and B2B markets you created yourself count towards the three. The Price levels page shows how many are in use. When all three are in use, you can still create a level: it is saved as Blocked by plan cap and nothing is created in Shopify until a slot is free, then Retry on the level creates it. The app never assigns a level the plan cannot show to the buyer.
  • Shopify Plus: each level is a catalog assigned directly to the buyer's company location, with no limit on the number of levels.

A company location in two B2B markets at once loses its quantity rules in Shopify, so keep each buyer on one level.

To delete a level the app created, open it and choose Delete price level. This removes its catalog, price list and B2B market from Shopify. While company locations are still on the level, the app refuses and asks you to move them to another level first.

Already using Shopify B2B

If you set up B2B catalogs or B2B markets in Shopify admin before installing the app, you do not have to rebuild them. The Price levels page lists them in a Found in Shopify card, with the number of company locations, the currency, the adjustment (for example 20 % off retail) and the number of fixed prices on each.

Choose Manage here to use one as a price level. Nothing changes in Shopify: the catalog keeps its name, its prices and its buyers. The level shows a From Shopify badge and its pricing reads Set in Shopify admin. From then on the app puts approved buyers on it and can give it order rules and payment options, but it never writes its prices: you keep editing those in Shopify admin. Renaming the level changes its name in the app only. If another level already has the catalog's name, the level gets the name with a number after it, for example Gold (2).

Which ones can be managed depends on your plan, the same way as levels the app creates:

  • Basic, Grow and Advanced: a B2B market with exactly one catalog that has a price list.
  • Shopify Plus: a B2B catalog assigned to company locations. A B2B market on a Plus store stays managed in Shopify.

A row the app cannot manage says why, for example when the market has several catalogs or the catalog has no price list. If one of them is the catalog or market approvals already use (set before price levels existed), it carries a Current default for approvals badge, and managing it here keeps approvals landing on it.

To let go of it again, open the level and choose Stop managing. The catalog, its prices and its buyers stay in Shopify; approval just stops using the level. Fixed prices on a catalog you manage this way do not count towards your plan's fixed-price allowance. Its company locations then read Catalog set in Shopify or B2B market set in Shopify again.

Until you manage them here, a company whose locations are priced by one of these is not shown as having no wholesale pricing. On the Companies list, the company's page and the B2B Onboard blocks in Shopify admin, its Price level reads Catalog set in Shopify (Shopify Plus, a catalog assigned to the company location) or B2B market set in Shopify (other plans, a B2B market that includes the location). A location on one of your price levels, including one you manage from Shopify, shows that level instead. See Changing a buyer's level.

Putting a buyer on one of your price levels does not take their location out of a catalog or B2B market you made in Shopify admin: Shopify lets a location be in both, and the app never changes those on its own. When you use Change level on such a location, the dialog names the catalog or market and offers Also remove it from <name>, unticked. Only if you tick it does the app take that one location out; the catalog or market and its prices stay in Shopify. The company's page shows a location that is on a level and still in one of these as also in <name>. The Approve page does the same when you add an application to an existing company: it names the catalog or market and offers an unticked Also remove it from <name>, and only if you tick it does the app take that one location out, after the approval is done.

When you first open the app, the setup wizard's Welcome step tells you if it found any you could manage, for example We found 2 B2B catalogs set up in Shopify; once your form is live, you can manage them as price levels under Settings → Price levels. It only counts the ones the app can manage; nothing is changed until you choose Manage here.

Which level a new buyer gets

Choose a Default price level under Settings → B2B Company. When you approve an application and the app creates the company, its location is placed on that level, so the buyer sees the level's prices and quantity rules from the first login. Only levels that are live in Shopify can be picked; the select appears once your first level is.

The default is where approval starts, not the only option: the price level you choose on the Approve page comes first, then the approval profile's level, then the default level. See How approval picks a level.

If the default level is deleted, the B2B Company page warns you and approved companies get no price level until you pick another one.

How approval picks a level

Every approval that creates or joins a B2B company decides one price level for the company's location — when the buyer joins an existing company with several locations, the chosen location (the one you pick on the Approve page, or the one whose address matches the application). The first of these that applies wins:

  1. Your choice on the Approve page. Once at least one level is live in Shopify, the Buyer setup card shows a Price level list instead of the catalog or B2B market picker. The suggested level is marked: (suggested by profile), (suggested by Rule 2) or (shop default). The What will happen card names the level before you approve. When you add the application to an existing company whose location is also in a catalog or B2B market set in Shopify, a note under the list says so, with the unticked Also remove it from <name>.
  2. The approval profile. Under Settings → B2B Company, each approval profile has a Price level setting: Shop default level, No price level, or a specific level. A form rule that picks a profile brings that profile's level with it.
  3. The default price level you chose for the store.

No wholesale pricing is always the last choice in the list. The company is created with its payment terms and tax settings, and the buyer sees retail prices. If your store assigned a B2B market or catalog before price levels existed, the list also offers it, marked (set before price levels), so you can keep doing what you did before.

If the level you or a profile picked can't be applied (for example, it was deleted or isn't live in Shopify yet), the buyer is still approved and you see a Price level not applied notice with the reason. The app never quietly puts the buyer on a different level instead.

When a level is applied, the buyer's approval email gets one extra sentence after your text: Your wholesale prices are active when you log in. It never names the level or shows prices, and your saved email template isn't changed. The application's timeline records Price level applied with the level's name and who chose it.

Shopify Flow: the Approve B2B Registration action has an optional Price level field. Enter the level's exact name (capitals and extra spaces don't matter). Leave it empty to use the profile or the default level. See the Flow guide.

Bulk approval and automatic approval use the profile, then the default level. Test runs show the level a real approval would apply.

Changing a buyer's level

The Companies list shows, for every company, its Price level (the level's name and pricing), its payment Terms and its Tax treatment: Exempt when the location collects no taxes at all, Reverse charge or Reseller exemption when it carries the rule B2B Onboard applied on approval, otherwise Not exempt. These are read from Shopify each time the page opens, so a change you make in Shopify admin shows here too. A company on no level shows Put on a level, which opens the company's page. A company on no level whose locations are priced by a catalog or B2B market you made in Shopify admin shows Catalog set in Shopify (Shopify Plus) or B2B market set in Shopify instead. When at least one of a company's locations is on a level, the list shows that level. If Shopify can't be asked about these catalogs and markets, the label is left out and the company reads as on no level. When a company's locations disagree, the list says Locations on different levels or Mixed, and the company's page shows each location.

On the company's page, the Wholesale setup card at the top shows the price level, payment terms, how orders are placed (submitted directly or sent to review as draft orders), tax exemption and tax ID, and one line per location with its level. A location on no level that a catalog or B2B market you made in Shopify admin prices reads catalog set in Shopify or B2B market set in Shopify, here and in the Locations card beside it; when no location is on a level, the Price level row shows the same label with View in Price levels, which opens Settings → Price levels, where the catalog or market is listed under Found in Shopify. Change level still moves the location onto one of your levels. A location on one of your levels that is also still in such a catalog or market reads · on <level> · also in <name>. Payment terms and tax are edited in Shopify: Edit terms and tax in Shopify opens the company there.

To move a buyer, click Change level on the card, or Change / Put on a level next to a location. In the dialog:

  1. If the company has more than one location, pick the Location. Each location is moved on its own.
  2. Pick the new Price level. The location's level is marked (current). Levels that aren't live in Shopify yet, or were built for the other Shopify plan, are listed but can't be picked.
  3. Click Move to the level. The location leaves its old level, if it has one, and joins the new one.

Also in a catalog or B2B market set in Shopify: if the location is also in a B2B market or catalog you made in Shopify admin, the dialog says so in a note above the levels. Its prices can still apply to this buyer whatever level you pick; on Shopify Plus, with a catalog, the buyer gets the lower of that catalog's price and the level's price at checkout. Below the levels, Also remove it from <name> is unticked. Leave it unticked and nothing changes in that market or catalog. Tick it and, once the move is done, only this location leaves it; the market or catalog and its prices stay in Shopify. To take out a location that is already on the right level, keep its current level, tick the box and click Remove from <name>. If it was the last company location in a B2B market, the market stays in Shopify but no longer applies to any buyer, so it is no longer listed under Found in Shopify.

If the move worked but Shopify didn't take the location out, the card shows a warning, <Location> is still in <name>, with Shopify's reason and Open in Shopify admin. The move is kept, so the buyer keeps the new level; remove the location in Shopify admin, or try again from Change level.

No wholesale pricing takes the location off its level (the button reads Remove from level). The company keeps its payment terms and tax settings. The buyer sees retail prices, unless a B2B market or catalog you made in Shopify admin still includes the location: its prices then keep applying, the dialog says <name> still prices it, and it does not offer to remove the location from it.

What the buyer sees: the new prices on their next page load, usually within a minute. Products already in an open cart stay in the cart and are repriced at checkout.

Earlier fixed prices: after a move, fixed prices the old level no longer needs are removed by the nightly price check, and prices you set yourself in Shopify on products that are not in the level file are left alone.

Every change is written to the audit log, and when the company came from an application, its timeline records Price level changed with the old and new level names. Taking a location out of a market or catalog set in Shopify is written to the audit log too. If the dialog can't make the change (for example, the level was deleted, isn't live in Shopify yet, wholesale pricing is switched off for the store, or the market or catalog set in Shopify changed since the page loaded), it says why in one sentence and nothing is changed.

On Shopify's Company page: if you work in Shopify admin under Customers → Companies, you can see B2B Onboard there too. Open a company, use the page's app block picker (Add block) and pin B2B Onboard company. The card shows the company's Price level (or Catalog set in Shopify / B2B market set in Shopify, as on the Companies list), payment terms, tax exemption, the application it came from, whether anything under Verification and agreements needs review, and its tax exemption certificates. Its links open the matching page in the app: Put on a level and Open in B2B Onboard open the company's page here, where Change level lives; View application opens the application; Manage opens the certificate on Action required. Each company location page has its own block (B2B Onboard company location) with that location's level, payment terms, how orders are placed and tax. The card only shows and links; every change is made in the app. A company that B2B Onboard didn't create says so, with a link to the app. On a customer's page (Customers → open the customer) pin B2B Onboard customer to see their application, their certificates and, when they belong to a company you manage, that company's level and anything that needs review.

On Shopify's Order page: open an order in Shopify admin, use the page's app block picker (Block, under Blocks) and pin B2B Onboard order. On a wholesale order the card shows the buyer's company and location, its Price level, the location's payment terms (its current terms, not the order's own), the order total against the approved credit limit (with Over limit when it is larger), and, when the company has one, whether a resale certificate and the trade agreement were on file when the order was placed (a certificate that lapsed later still reads On file when ordered; one added later reads Not on file when ordered · added and its date). The block needs permission to read orders: until you allow it, it says so with a link to the app, where Show wholesale orders on the dashboard asks for it. A retail order reads Not a wholesale order.

On the product page in Shopify admin: open a product under Products, use the page's app block picker (Add block) and pin B2B Onboard product. The card lists each of your price levels with what buyers on it pay for this product: the fixed price from its level file, or the percentage off the retail price, with the quantity breaks when the level or the product's own row in the level file has them. A product with several variants shows the lowest and highest price. Not on this level means the level's level file has no price for the product, so buyers on it pay the retail price; a gift card shows sold at retail unless the level file gives it a price. A product on the level's Keep at retail price list shows Kept at retail price. A product the level's product list leaves out shows Not on this level's product list. The card shows what the level defines and only links: Open level opens the level in the app, where its prices are changed.

Own prices for one company (Shopify Plus)

On Shopify Plus you can give one company prices no other buyer gets, for example negotiated prices for a key account. It is on every B2B Onboard plan; on other Shopify plans the company's page doesn't offer it.

On the company's page, the Wholesale setup card shows Set own prices next to the company's price level. The dialog, Own prices for <company>, creates a price level only this company uses: its own catalog and price list in Shopify, named <name> (B2B Onboard) like every level's. In the dialog:

  1. Name starts as <company> prices; change it if you like.
  2. Percent off retail starts at the percentage of the level the company is on now, when that level gives a percentage off. Fixed prices come later, on the level's page.
  3. Put <company> on it now is ticked. Untick it to create the level and move the company later with Change level.
  4. Click Create own prices.

The company moves, it doesn't stack. Its locations leave their shared level and join the new one, as with Change level; they are never on both. When two price lists apply to one buyer, Shopify gives the buyer the lower price and takes quantity rules and quantity breaks only from the price list that won, so a stacked level could never charge more than the shared one and could drop its rules. After the move, the card's Price level row reads Own prices and an Own prices row names the level, with Open level and Remove own prices. The buyer sees the new prices on their next page load, usually within a minute.

Fixed prices: open the level and switch it to fixed prices from a file, as on any level (see The level file). Its rows count toward your plan's fixed-price rows across all your price levels.

Checkout rules follow the level the company came from. The company keeps that level's order minimum and maximum, purchase order rule, payment options, fees and shipping options, and a change you make there reaches the company too. On the company's own level these cards are read-only, with a note that names the level they follow and an Open company link. If the company was on no level, or its locations were on different levels, its own prices come without checkout rules. See the wholesale checkout rules guide.

Not carried over: quantity breaks, quantity rules, the level file (its fixed prices, its quantity rules and its quantity breaks per product) and prices set in Shopify admin stay on the level the company came from. When that level has any of them, the dialog says Not carried over from <level>: … Add them on the level page. Because the company is no longer on that level, they no longer apply to it until you add them to its own level.

Companies with several locations: one level covers all of the company's locations, and the dialog says how many it moves. A location you add to the company later isn't put on the level by itself; use Change level, which lists the company's own level for its locations (and never another company's). If not every location could be moved, the card says how many were and the Own prices row reads used by N of M locations; move the rest with Change level.

A catalog or B2B market you made in Shopify: if a location is also in one, the dialog shows the same note as Change level and an unticked Also remove it from <name> (with several locations, Also remove <location> from <name>). Leave it unticked and nothing changes there; that catalog's prices can still apply, and the buyer gets the lower price. Tick it and only this location leaves it, once the move is done. See Changing a buyer's level.

Remove own prices moves the company's locations to the level you pick (the level it came from is pre-selected while it still exists) or to No wholesale pricing. It then deletes the level, its catalog and its price list in Shopify, with any fixed prices uploaded for it. If a location could not be moved, nothing is deleted and the card says how many moved; press Remove own prices again to finish.

Approving a new buyer into the company: when you approve an applicant into a company that has its own prices, the company keeps them. The approval adds no catalog or B2B market and doesn't change the company's level, so the new contact buys at the company's own prices. On the Approve page, choosing Add to <company> shows one sentence instead of the price level picker: <company> has its own prices, so this approval leaves its pricing as it is. Change it from the company page. Choose Create new and the picker is back. Bulk approval, Shopify Flow and auto-approval do the same, even when they name a price level or an approval profile has one. The application's timeline reads Kept on its own prices: <level>, and a simulated approval on a test run says the company keeps its own prices.

Own prices are never offered as a level for approvals: not on the Approve page, not as the default level or an approval profile's level, and not by name in a Shopify Flow approval. They belong to one company only. If an approval for another company still names one, the level isn't applied and the approval says The chosen price level gives one company its own prices, so approvals can't use it. Creating, moving and removing are written to the audit log, like every level change.

Where own prices show: the Price levels page lists your shared levels only, with one line under the table such as 2 companies have their own prices and a View companies button. On the Companies list and in the B2B Onboard blocks in Shopify admin, such a company's level reads Own prices with its discount, for example Own prices · 30% off retail. The product block in Shopify admin lists your shared levels only; a company's own prices are on its company page.

Nightly sync

Every night at 02:30 UTC, B2B Onboard checks each store that has a price level, one level at a time. The check also runs within a few minutes of a product change in Shopify admin, so quantity breaks and fixed prices computed from the old price are corrected the same day. A level with fixed prices from a file and no quantity breaks computed from retail does not depend on retail prices, so a product change does not re-check it; it is checked every night, when you run a check and after you upload a new file. A level you edited in the last 10 minutes, or one that is still syncing, is skipped. When the check was started by a product change, it runs again about 10 minutes after the level's last save; otherwise the level is checked on the next run or the next night.

What it repairs, on each level's own price list and only for prices the app wrote: a fixed price that drifted from what the level sets is written again, a price the level needs but that is missing is added, and a fixed price or quantity break the level no longer needs (for example after you switched a level from fixed prices to a percentage, or removed rows from the CSV) is removed. Quantity rules the level sets are put back the same way.

Right after a save: removed quantity breaks and fixed prices leave Shopify within a few minutes of the save; the level shows Syncing until then. That covers removing every quantity break, narrowing which products get them, switching a level from fixed prices to a percentage, and products leaving the level file: they go back to the level's base price. Switching back to fixed prices with the file kept writes its fixed prices again. Prices you set yourself in Shopify on products that are not in the level file are left alone. If the level shows Needs a check half an hour later, press Check this level on the level's page to finish it; the nightly check also does. Switching a level to prices set in Shopify admin removes nothing: the prices the app wrote stay, and the save tells you how many.

What it only reports: prices or rules on the level's price list that the level did not write, catalogs and markets you made yourself, a market, catalog or price list a level needs that was deleted in Shopify admin, a buyer location on two levels or outside the countries you sell to, your checkout rules, your theme and your customer accounts. None of these are changed.

The result is on Settings → Wholesale pricing → Storefront readiness, where you can also start a check yourself. The Wholesale storefront readiness guide explains every row.

If a level's catalog, price list or B2B market was deleted in Shopify admin, the level's page says what is missing and offers Retry. Retry creates only the missing objects again, keeps the ones that are still there, and writes the level's prices again. When the deleted object held the level's buyers (the B2B market, or the catalog on Shopify Plus), Shopify removed them with it, and the page asks you to assign them to the level again on their company pages.

Wholesale numbers on the dashboard

When your store has Shopify B2B and at least one price level, the dashboard shows two cards below the application numbers. Both come from the nightly sync, not from a live count, so opening the dashboard never slows down; each card says when its numbers were counted. If a night's count does not finish, the card keeps the previous numbers and their time. A check you start yourself on Settings → Wholesale pricing → Storefront readiness updates them too.

Locations on a price level counts every company location in your store, for example 7 / 12, in three groups. It counts per company location, not per company: a company with one location on a level and another priced in Shopify counts once in each group.

  • On a price level — the location is on one of your price levels (including a catalog or market you manage from Found in Shopify).
  • Set in Shopify — the location is on no level, but a catalog or B2B market you made in Shopify admin prices it. Nothing is missing; the card shows these on a muted line, such as 2 set in Shopify.
  • No wholesale pricing — neither: the buyer pays retail. The card says 3 need a level and opens Companies, where Change level puts a location on a level. When none is left it reads All locations have wholesale pricing.

A location lands in the same group as on its company's page in Companies. While a location has no wholesale pricing, the Setup Guide shows Give approved buyers a price level; it is checked off once every location has wholesale pricing.

Wholesale orders, 30 days shows how many orders companies placed in the last 30 days and their total in your store currency, for example 41 and €18,250.40 · from Shopify. An order counts when it was bought for a company and is not cancelled; the total is Shopify's current order total. This card needs your permission to read orders: click Show wholesale orders and Shopify asks you to allow the app to read orders (Shopify gives apps the last 60 days). If you decline, the card stays as it was and nothing is read. After you allow it, the card says Counting. Numbers appear after the next sync. until the first count is in: usually within a few minutes, otherwise after the nightly check.

Each night the app reads at most 5,000 orders of the last 30 days. A store with more shows the count with a plus, for example 5000+, and the total of the orders counted. The plus also appears when Shopify asks the app to slow down or the nightly check runs out of time before every order was read; the numbers are then the orders counted so far. The app only ever reads orders: it never asks to change or create orders, and it does not ask for draft orders. It stores two numbers, the count and the total, and no order or buyer data. If you remove the permission in Shopify admin, the card offers the button again.

A buyer sees retail prices

When an approved buyer tells you they see your retail prices, it is usually one of four causes. Each one shows somewhere in the app:

  • The buyer's location is on no price level. This happens when the application was approved with No wholesale pricing, or before you had a level. The company's page in Companies shows it in the Wholesale setup card, and the dashboard's Locations on a price level card counts it under need a level. Use Change level on the company's page to put the location on a level (see Changing a buyer's level).
  • The level does not reach the buyer (Basic, Grow and Advanced). Without Shopify Plus a level reaches buyers only through its B2B market. A level saved as Blocked by plan cap has no market in Shopify yet, and a level whose B2B market was deleted in Shopify admin has lost its buyers with it. The Price levels page shows each level's status and how many of the three catalog assignments are in use; the level's page says what is missing and offers Retry (see Routes by plan and the three-level cap).
  • The buyer is not logged in as a company contact. Shopify shows the level's prices only to a buyer who is logged in as a contact of the company, with Shopify's new customer accounts. A guest, a buyer logged in with classic customer accounts, or a customer who is not a contact of the company sees retail prices. Settings → Wholesale pricing → Storefront readiness shows whether new customer accounts are on (see the Wholesale storefront readiness guide). To see what a buyer sees, log in on your storefront as a contact of a company on the level.
  • The level's catalog or price list was edited in Shopify admin. A price list changed by hand, or a catalog, price list or B2B market deleted in Shopify admin, changes what buyers pay. Settings → Wholesale pricing → Storefront readiness lists prices on a level's price list that the level did not set and marks deleted objects as Needs attention; the level's page offers Retry for a missing object (see Nightly sync).

A theme customization or another app's script can also show a different price than Shopify charges. The app does not change your theme, so it cannot detect or fix this; check a product page while logged in as a test buyer.

Uninstalling

If you uninstall B2B Onboard, the catalogs, price lists, prices, quantity breaks and rules, payment terms and companies stay in Shopify exactly as they are. Your buyers keep their prices; nothing is rolled back. You can edit or delete these objects in Shopify admin afterwards.