When a wholesale discount is not applying — or not applying to the customers you expect — it’s almost never a Shopify bug. It’s one of five rule conflicts: the customer doesn’t match the eligibility condition, the discount can’t combine with one already on the cart, it’s scoped to the wrong products or variants, a Markets/currency setting interferes, or an app is applying its own pricing on top. Check eligibility first — it’s the single most common reason a wholesale price lands for some buyers and not others. Then work down the list below, one cause at a time, recreating a real eligible customer and cart as you go.
How to diagnose it (do this first)
Reproduce the problem as the buyer, not as an admin. Log in to the storefront as an actual wholesale customer (or use a test customer with the same tag/company), add the products that should be discounted, and watch the cart and checkout. Then change one thing at a time. Vague reports like “wholesale pricing is broken” almost always resolve into a specific, testable condition once you sit in the customer’s seat.
Two facts about Shopify make the rest of this predictable:
- Eligibility decides who gets a discount — customer tags, a B2B company/location, or a saved customer segment. If the buyer doesn’t match, nothing applies, no error shown.
- Combinations decide whether two discounts coexist. Shopify sorts every discount into one of three classes — product, order, or shipping — and two discounts of the same class do not stack. Shopify applies the better one, not both, unless you’ve explicitly allowed the combination.
The likely causes, in order
Run this as a checklist. The first match is usually your answer.
- Customer eligibility — tag, company, or logged-in state. The discount is keyed to a customer
tag (e.g.
wholesale), a B2B company, or a segment — and the buyer isn’t tagged, isn’t logged in, or belongs to the wrong company/location. Guest carts never match a customer-tag rule. - Combination rules — same-class collision. A wholesale automatic discount and a code (or a second automatic) are both product-class, so they don’t stack. Shopify keeps the better one and the wholesale price silently loses. This is the same mechanic behind why a code and an automatic discount fight each other.
- Product / variant scope. The discount targets a collection or specific products, but the variant in the cart isn’t in that set — a new variant, a re-created product, or a SKU that dropped out of the collection. The customer is eligible; the item isn’t.
- Markets / currency. With Shopify Markets, price lists and per-market currency rounding can override or reshape a discount. A rule tuned in your primary currency may not behave the same in another market’s price list.
- Codes vs automatic collision. The buyer enters a wholesale code, but an automatic discount of the same class is already applied — or vice versa. Whichever Shopify judges “better” wins, so the expected wholesale total never shows.
- An app applying its own pricing. A wholesale/B2B, tiered-pricing, or currency app is rewriting line prices in the cart. Its pricing and the native discount can double-count, cancel, or block each other. This is why testing with apps disabled is decisive.
Cause and fix, at a glance
| Cause | How to confirm | Fix |
|---|---|---|
| Customer not eligible | Log in as the customer; check tags / company / segment membership | Correct the tag/company; confirm the discount’s condition matches it exactly; require login |
| Same-class combination | Note which discounts are active; check each one’s class + “combinations” settings | Allow the combination, or change one discount’s class, or split into non-competing offers |
| Wrong product/variant scope | Confirm the exact variant in cart is in the targeted collection/products | Add the variant/product to the discount’s scope; re-check after variant edits |
| Markets / currency | Reproduce in the buyer’s market and currency | Align the price list / discount per market; verify rounding |
| Code vs automatic | Remove the code, then the automatic, and compare totals | Set combinations correctly, or standardize on one mechanism |
| App overriding pricing | Retest with the app disabled | Reconcile app pricing with native discounts, or let one own the logic |
How to fix each
Eligibility. Make the condition and the customer match exactly. If the rule checks the tag
wholesale, every wholesale buyer must carry that precise tag (case and spelling count), be logged
in, and — for B2B — be assigned to the right company and location. For anything beyond one flat tag,
group buyers into a customer segment and target the discount at the segment so membership is
explicit and auditable.
Combinations. Decide, per discount, whether it’s allowed to combine — and with what. If you genuinely need two product-class discounts to stack, Shopify’s native combinations often can’t do it cleanly, because same-class discounts are designed not to stack. That’s the recurring wall behind why stacked discounts quietly erode your margin: the platform is protecting you from unbounded stacking, so “make them all stack” is rarely a checkbox.
Scope. Keep the discount’s collection/product list in sync with your catalog. Variants added after the rule was created, or products duplicated during edits, silently fall outside scope. Re-add them and retest with that exact variant in the cart.
Markets/currency. Test in the buyer’s actual market. If a per-market price list already sets wholesale prices, layering a discount on top can double-discount or conflict — usually you want the price list or the discount to own the number, not both.
Codes vs automatic. Pick one primary mechanism for wholesale. Mixing a manual code with an automatic discount of the same class is the fastest way to get an unpredictable total.
Apps. Disable the pricing/B2B app and retest. If the discount behaves correctly without it, the app is the conflict — reconcile whose job it is to set the wholesale price, and let one side own it.
When a Function is the reliable answer
Native discounts and tags cover simple wholesale: one tag, one flat percentage, no stacking. Real B2B pricing rarely stays that simple — per-company rates, tier thresholds, minimum quantities, category-specific margins, and rules that legitimately need to combine. When your requirements fight Shopify’s same-class combination model, the dependable answer is a Shopify Function: custom discount logic that runs server-side at checkout, so eligibility and pricing are enforced where they can’t be gamed — not faked in storefront JavaScript that a buyer can edit away.
This is exactly the pattern behind customer-group tiered pricing done right and the backbone of a robust Shopify B2B / wholesale setup. If you’re at that complexity, we build the logic as custom apps and Functions so the wholesale price is correct for the right customer, every time, at checkout.
Common mistakes
- Assuming the discount is broken when the customer simply isn’t eligible or logged in.
- Expecting two same-class discounts to stack — Shopify keeps the better one by design.
- Editing variants or collections after building the discount and never re-checking scope.
- Running a pricing app and a native discount against the same carts without deciding who wins.
- Testing as an admin instead of as a real eligible customer in the real market and currency.
When to get help
If you’ve walked the checklist and the wholesale price still won’t land — or your B2B pricing needs per-company rates, tiers, or combinations Shopify’s native rules can’t express — that’s the point where custom logic pays for itself. A quick trace of your eligibility conditions, combination settings, and app stack usually pinpoints the conflict fast.
Wholesale prices not landing right? Send us your store URL and rules — we’ll trace the eligibility, combination or app conflict breaking your wholesale discounts and tell you how to fix it. Get a free profit audit.