We have a B2B catalog setup in Shopify Plus that discounts all products in the catalog 20% for logged in customers. The problem we are facing is that when those products go on sale/promotion on our B2C site, the discount gets stacked on top of the 20% trade discount on our B2B site. I know I can export, adjust fixed pricing, import but every time we add or remove products, I would have to update the catalog. And we have over 300K SKUs.
How can we do it so in the B2B catalog, the discount only looks at the ‘compare at price’ or how can we do it so the promotional pricing from our B2C site doesn’t stack or even show on our B2B catalog?
This is a classic headache with B2B Catalog Pricing on Shopify Plus, especially when you’re running dual B2C/B2B pricing logic and promotions at scale.
Right now, Shopify’s default behavior is:
B2B catalog discounts apply on top of whatever the product’s current price is.
If your B2C store runs a sale (using price + compare_at_price), B2B customers still see that sale price — and then your 20% catalog discount stacks on top.
There’s no built-in toggle to say “ignore B2C Sale Price” or “discount only from compare at price.”
With 300K SKUs, the “export → adjust → import” workflow is basically impossible to maintain.
Here are the realistic solutions that actually work on Shopify Plus:
1. Use a B2B “Price List” with fixed prices (recommended for high SKU volume)
Price Lists let you override the actual price your B2B customers see — so B2C sales never influence the B2B catalog.
Upside:
No stacking
B2B customers always see the right price
Completely ignores your B2C promotional pricing
Downside:
You need to push fixed prices for 300K SKUs
You’ll want an automated process (API script / middleware) to maintain these prices daily
This is what most large catalogs do on Shopify Plus — they sync prices automatically using the Admin API or a middleware service.
2. Block B2C sale prices from appearing on the B2B site (theme-level logic)
If your B2B customers browse the storefront (not using the B2B portal), you can hide B2C sale prices using Liquid:
{% if customer.b2b? %}
<!-- Show only regular price and apply B2B catalog logic -->
{{ product.price | money }}
{% else %}
<!-- Normal B2C sale logic -->
{{ product.price | money }}
{% if product.compare_at_price > product.price %}
{{ product.compare_at_price | money }}
{% endif %}
{% endif %}
This doesn’t fully solve the stacking, but it removes the visibility of B2C promotions on the B2B side.
3. Use Shopify Functions for custom pricing (most advanced option)
hare is true “rule-based pricing” — for example:
“For B2B customers, the price should always be 20% off compare_at_price”
“Ignore all B2C promotions”
“Never stack discounts”
You can build a Custom Pricing Function (Shopify Functions → Product Discounts).
This gives full control but requires development.
4. Stop using percentage-based B2B discounting and switch to tier-based logic
Instead of “20% off everything”, build rules like:
Collection A: fixed price list
Collection B: fixed price list
Everything else → fallback pricing rule
This avoids stacking but still needs automation for 300K+ SKUs.
Best practical solution for your scale:
Use a Price List + automate updates via API.
This is what Shopify Plus recommends internally for merchants with very large catalogs and different B2B pricing logic. It removes the stacking issue entirely and doesn’t require you to manually update 300K SKUs every time your B2C store runs a sale.
So the issue you’re running into is how Shopify B2B catalog discounts work - they apply to the current price, not the compare at price. When your B2C products go on sale, that sale price becomes the “current price,” and then your 20% B2B discount stacks on top of it.
Unfortunately, there’s no native way in Shopify to make catalog discounts apply to compare_at_price instead of the actual price. The percentage discount will always calculate from whatever price is currently set on the product.
A few options to consider:
1. Use fixed pricing in your B2B catalog instead of percentage discounts Yeah, I know you mentioned this requires maintenance, but with 300K SKUs, you could script the initial setup and then set up a scheduled job that runs daily/weekly to sync new products and adjust pricing based on compare_at_price. It’s more upfront work but would give you the control you need.
2. Separate your sale products from the B2B catalog temporarily When you run promotions on B2C, you could temporarily remove those specific products from the B2B catalog or create a separate catalog without the discount for sale items. Not ideal, but might work depending on how often you run sales.
3. Use metafields + custom logic Store your “base” B2B price in a product metafield, and use that to set fixed pricing in your catalog. When you update products or run sales on B2C, your B2B pricing wouldn’t be affected since it’s pulling from the metafield rather than the live price.
4. Rethink your B2C sale strategy Instead of adjusting the actual product price for B2C sales, use automatic discounts or discount codes that only apply to B2C customers. This way your product prices stay consistent, and the B2B 20% discount wouldn’t stack with anything.
With 300K SKUs, honestly option 1 or 3 would probably scale best. The initial setup is a pain, but once you have automation in place, it’s mostly hands-off.
Hello, @MandasaTech & @TheUntechnickle It seems that setting up anAPI script to run this would be the best approach. We don’t have a dev. team and little knowledge of setting this up. Is there some instruction on how to set this up? I appreciate both your help on this!!
I assume that when you’re running sales - you’re not modifying the product price directly in any way or form - that’s not the right way to run discounts, as they’re not true discounts but rather lead to cascading effects down your stack. (like the one you’re facing now)
We also make it easier for you to run a sale (using discounts) and display the correct final sale price and badge to users through a feature we call “Offer engine”.
Apply discounts based on the compare-at price to prevent discount stacking.
Ensure the discount is applied exclusively to B2B customers.
Please let me know if i missed any thing
With Checkout Boost, you can use “Use compare-at price” option while creating discount. When this option is selected, the system will disregard the product’s current price and calculate the discount based on the compare-at price defined for the product.
Additionally, you will need to configure a checkout rule with the condition to target specific B2B customers.
With this configuration in place, the discount will be applied exclusively to B2B customers, and the calculation will be based on the compare-at price rather than the dynamic product price.
Hi Everlights1, the key issue is that B2B catalogs are part of Shopify’s pricing system, not the discount system. They’re completely separate in Shopify.
Catalogs replace the original price and compare-at price in specific contexts. Compare-at-prices (another part of the pricing system) get ignored by built-in discounts. So, once a B2B catalog sets $100 → $80, your B2C discount only ever sees $80, which is why stacking happens.
Your practical options are:
Use customer-specific B2B discounts instead of catalogs so B2C and B2B discounts don’t stack.
Exclude B2B customers from B2C promotions.
Exclude products with compare-at prices from B2C discounts, which requires a Shopify Functions app.
Use a discount app that recalculates discounts against compare-at prices, with the constraint that the final price cannot exceed the catalog price.
If you want options 3 or 4 without custom development, this is exactly the class of problem we built Regios Discounts (4.7 stars, 123 reviews, Built for Shopify) to handle.
I built Metra Price Automation for this exact scenario. It manages the product price field directly instead of relying on Shopify’s discount layers, so your B2B/trade catalog prices stay locked while a B2C sale is running. Our app allows you to schedule sales directly, but even if you have a different data source handling your store’s pricing, Metra monitors product pricing changes and sets price overrides accordingly so that wholesale customers only pay their fixed % discount. Metra was built to handle large catalogs, so the 300K+ SKU count isn’t a problem. Every change is timestamped in an audit log too. Happy to show you a setup for your trade-discount scenario.
With 300K+ SKUs, manually updating fixed pricing isn’t practical. A Shopify Functions-based approach is likely the better solution. You can configure the discount logic to skip products that already have a sale price, preventing discount stacking while keeping everything automated.
I came across your thread about B2B catalog discounts stacking on top of B2C promotional prices across 300K+ SKUs.
Did you eventually solve it using fixed price lists, a discount app, or custom automation?
I’m researching pricing operations for large Shopify catalogs, not selling anything. What is still the most manual or risky part today: detecting conflicting promotions, updating the catalog, or verifying the final B2B prices?
This is a real limitation of how B2B catalog percentage adjustments work today, not something you’re misconfiguring. A catalog’s overall adjustment (your -20%) is calculated against the product’s current price at the time of checkout, not against compare-at price – there’s no toggle in the catalog UI (or in the Admin API’s PriceListAdjustment) to change that basis. The PriceListCompareAtMode field people sometimes point to is a red herring here: it only controls what compare-at value gets shown on the price list (ADJUSTED vs NULLIFY), it doesn’t change what the percentage is calculated off of. So when a B2C sale drops the price, your flat 20% stacks on top of that already-reduced number, exactly as you’re seeing.
Given your scale (300K SKUs), here are the two realistic paths, in order of how much they actually solve the root problem:
1. Automate fixed catalog pricing instead of doing CSV export/import. You already know fixed pricing per catalog product avoids the stacking (since it ignores the live price entirely), you just rejected it because manual CSV round-trips don’t scale. But fixed pricing doesn’t have to be manual: use the Admin GraphQL priceListFixedPricesByProduct bulk mutation to set compareAtPrice * 0.8 as the fixed B2B price for every variant, and trigger that recalculation automatically off a PRODUCTS_UPDATE (or bulk_operations/finish) webhook whenever compare-at price changes. At 300K SKUs you’d want to batch this through Shopify’s Bulk Operations API rather than one-by-one calls, but it’s fully code-driven so it scales with your catalog instead of your ops team’s time.
2. Replace the catalog’s overall adjustment with a custom pricing/discount Shopify Function. Since you’re on Plus, this is the cleaner long-term fix: instead of maintaining 300K synced fixed prices, write a Function scoped to your B2B company locations that reads compareAtPrice off each cart line at checkout and computes the 20% off that value dynamically. No sync job, no drift risk if a compare-at price changes and the webhook lags – it’s always correct at the moment of checkout. This needs a developer to build/deploy (Shopify CLI + Functions, Rust or JS), so if you don’t have one in-house it’s worth looping in a Shopify Plus partner, but it fully removes the stacking problem at the source rather than working around it.
If you want to sanity-check option 1’s mutation shape before building it, Shopify’s B2B catalog docs on managing price lists have the exact mutation signatures: Manage B2B catalogs