Enterprise Promotion Architecture for Shopify
How to run many simultaneous promotions across a large catalog when the tools, not a priority list, decide which discount wins
A fictional Shopify Plus fashion retailer maps twelve conflicting Black Friday requirements to how Discount Prime actually resolves overlaps: no priority setting, one price-changing campaign per variant (the current holder keeps it), the smallest order-level discount wins, and cost floors only on Wholesale, Dropshipping, and Bundles. A per-product margin check and native Shopify features fill the gaps.
At a glance
- Challenge
- As catalogs and teams grow, overlapping promotions interact in ways nobody wrote down, and the final price is decided by tool behavior rather than the intended priority list.
- Approach
- Map each requirement to how the app actually behaves, confirmed on test orders: deliberate variant ownership through the conflict resolver, one order-level campaign at a time, a per-product margin check, and native Shopify features where the app has no equivalent.
- Discount Prime campaign types used
- Multiple campaign typesConflict management
Scenario-based case study: the merchant is fictional and modeled on patterns across Discount Prime stores. Prices, costs and outcome figures are illustrative assumptions for teaching, not measured results from a real store.
Short Answer
When many promotions run at once, write down how your discount tools actually resolve overlaps before you design the campaigns, because the tools decide the final price, not your intended priority list. In Discount Prime there is no campaign priority setting. Each product variant belongs to one price-changing campaign at a time (the campaign that already holds it keeps it until you move it), several qualifying Tiered Spend (order) campaigns resolve to the smallest discount, shipping tiers resolve to the largest, and Discount Prime discounts are set to combine with Shopify's native discounts. Design the calendar around those rules, enforce margin floors yourself where the campaign type has none, and use native Shopify features for what the app does not cover, such as Shopify B2B companies.
Merchant Scenario
NorthPeak Fashion is a fictional Shopify Plus retailer selling apparel and accessories in several European countries, with retail, VIP, employee, and wholesale customers. Two weeks before Black Friday, each team brings a requirement:
| # | Requirement | Owner |
|---|---|---|
| 1 | 25% off most of the catalog | Marketing |
| 2 | No discount on the new Winter Collection | Merchandising |
| 3 | 40% off the Outlet collection | Operations |
| 4 | VIP-only benefits | Loyalty |
| 5 | Wholesale customers keep their negotiated prices | B2B sales |
| 6 | Buy two knitwear items, get a scarf free | Merchandising |
| 7 | Spend $300, get 15% off | Marketing |
| 8 | Free shipping over $400 | Logistics |
| 9 | Luxury accessories never discounted | Brand |
| 10 | Employee pricing | HR |
| 11 | Different offers by country | Regional teams |
| 12 | Gross margin per product stays at or above 42% | Finance |
Every requirement is reasonable. Several of them conflict, and the conflicts are decided by tool behavior, not by meeting notes.
How Overlaps Are Actually Resolved
| Situation | Native Shopify behavior | Discount Prime behavior |
|---|---|---|
| Two product discounts on the same item | Depends on each discount's combination settings | One price-changing campaign per variant: the campaign already holding it keeps it; a later campaign skips it until you move it in the conflict resolver |
| Several order-level spend campaigns qualify | Depends on combination settings | The smallest positive discount wins (merchant-favorable) |
| Several shipping tiers or campaigns qualify | Depends on combination settings | The largest shipping discount wins |
| Bundle, cross-sell, gift, or upsell on an item that also has a product discount | Not applicable | Per campaign: "best" keeps the larger saving, "stack" adds them |
| App discount plus a native Shopify discount | Native discounts follow their own settings | Discount Prime discounts are set to combine with product, order, and (except shipping codes) shipping discounts. An optional "Prevent Shopify discounts" setting can remove campaign products from native discounts |
| Explicit priority numbers | Not available | Not available |
Types that do not compete for a variant: bundles, cross-sell, upsell, shipping, Tiered Spend (order), and Buy X Get Y when it is set to combine with others. Everything else, including Flat Product Discount, Tiered Quantity, Product Spend, Bulk Price Update, and Wholesale / B2B Pricing, claims variants exclusively.
One consequence matters more than any other: the ownership check works per variant, not per customer group. If a wholesale campaign holds a variant, a Black Friday campaign that starts later does not discount that variant for retail shoppers either.
Mapping Each Requirement
| # | Requirement | How to build it | Limits and decisions |
|---|---|---|---|
| 1 | 25% off most of the catalog | Flat Product Discount on the included collections | Excludes nothing by itself; exclusions are set in the campaign |
| 2 | Winter Collection not discounted | Exclude it in every campaign's product exclusions; check native discounts too | Order-level campaigns still count it (see #7) |
| 3 | Outlet at 40% | Flat Product Discount, or Bulk Price Update if you want the real Shopify price lowered | Outlet items held by another campaign are skipped; Bulk Price Update restores activation-time prices on revert and does not add a compare-at price by itself |
| 4 | VIP benefits | A campaign restricted to a VIP customer segment (for example VIP-only free shipping or a gift) | Restricted campaigns need the customer logged in; segment membership syncs to the customer within minutes |
| 5 | Wholesale contract prices | On Shopify Plus, consider native Shopify B2B catalogs; or Wholesale / B2B Pricing restricted to a wholesale segment | Discount Prime does not read Shopify B2B companies. A wholesale campaign holding a variant blocks retail campaigns on that variant (see above) |
| 6 | Buy two knitwear, scarf free | Buy X Get Y with the reward from another collection | With "another collection" rewards, the customer must pick the scarf in the app's reward modal; a scarf added directly is not rewarded |
| 7 | Spend $300, get 15% | Tiered Spend Discount (order level) | Applies to the whole order subtotal, so excluded and luxury items in the cart count toward the threshold and share the discount. If two order campaigns qualify, the smaller discount wins |
| 8 | Free shipping over $400 | Free Shipping & Cart Incentives | Threshold uses prices before or after product discounts depending on the combine setting; only the first delivery group is discounted |
| 9 | Luxury never discounted | Exclude from product campaigns; do not run an order-level percentage during the event, or accept that it shares in the order discount | No setting removes a product from order-level discounts |
| 10 | Employee pricing | Native Shopify (staff discount code or B2B catalog) or a campaign restricted to an employee segment | Same per-variant ownership rule as #5 |
| 11 | Country-specific offers | In Discount Prime, only shipping campaigns target markets or countries | Product and order campaigns cannot be limited by country in the app; test thresholds in each presentment currency, because widgets do not convert currency and some function paths may not either |
| 12 | 42% gross margin floor | Calculate the maximum safe discount per product and exclude products that breach it | Cost floors exist only for Wholesale, Dropshipping, and Bundles; Flat, Tiered, Order, and Buy X Get Y have none |
The Margin Floor in Numbers
A discount d off list price keeps a gross margin of (m − d) ÷ (1 − d), where m is the product's gross margin at list price (price minus product cost, divided by price). To stay at or above a floor f, the product needs:
m ≥ d + f × (1 − d)
Illustrative assumptions: floor 42%; product cost only (no shipping, fees, or returns).
| Offer on the product | Effective discount | List-price gross margin needed |
|---|---|---|
| 25% Black Friday | 25% | 56.5% or more |
| 40% Outlet | 40% | 65.2% or more |
| 25% plus 15% order discount measured after product discounts | 1 − 0.75 × 0.85 = 36.25% | 63.0% or more |
Example: a sweater at $100 with $45 cost has a 55% list margin. At 25% off it sells for $75, keeps $30, and its margin is 40%, below the floor. Either exclude it from the 25% campaign, give it a smaller discount, or accept the breach knowingly. Run this check from your cost export before the event; Discount Prime will not block it on these campaign types. Replace 42%, the discounts, and the costs with your own.
Walking One Cart Through
Illustrative cart for a logged-in VIP in Germany: Outlet boots at $180 list (40% off via a Flat campaign, so $108) and a luxury bag at $240 (excluded from product campaigns). List subtotal $420; after product discounts $348.
| Step | Result |
|---|---|
| Outlet boots | $108 |
| Luxury bag | $240 (no product discount) |
| Spend $300, 15% (order campaign measuring after product discounts) | $348 qualifies; 15% of $348 = $52.20 off the order subtotal, shared across both items, including the luxury bag |
| Free shipping over $400, measured before discounts | $420 qualifies: free shipping |
| Free shipping over $400, measured after product discounts | $348 does not qualify |
| Currency | If she pays in euros, test the shipping threshold in EUR; the shipping function is not confirmed to convert currency |
The same cart gives different results depending on two settings that most teams never write down. Decide them on purpose, and note that the luxury requirement is broken by the order campaign unless you drop or change it.
A Practical Architecture
- Inventory the rules in one table: campaign, type, products, customers, dates, and which setting decides before/after discounts.
- Assign variant ownership on purpose. Launch campaigns in the order you want them to hold variants, and use the conflict resolver to move products deliberately. Review the "Products excluded due to conflicts" list after every launch.
- Keep contract pricing out of retail campaigns' way. If wholesale or employee pricing would block retail promotions on the same variants, move it to native Shopify B2B catalogs or staff codes, or schedule it around the event.
- Limit order-level campaigns to one at a time during the event, or accept the smallest-wins rule.
- Run the margin check for every product in a percentage campaign.
- Check native discounts and Shopify Markets settings alongside the app.
- Know your plan's limits. Campaign types and live-variant limits depend on your plan; check the pricing page before planning a catalog-wide event.
Pre-Launch Tests
| Test input | Expected result |
|---|---|
| Product held by an earlier campaign, added to the Black Friday campaign | Appears in "Products excluded due to conflicts" |
| Winter Collection item, retail customer | No product discount |
| Cart of $299.99 after product discounts (order campaign measuring after) | No 15% |
| Two order campaigns both qualifying | The smaller discount applies |
| Two knitwear items, scarf added without the modal | Scarf not free |
| Same cart, scarf picked in the modal | Scarf free |
| VIP campaign, customer not logged in | VIP offer not applied |
| Free shipping threshold in EUR and GBP | Matches your intended threshold in each currency |
| Wholesale customer on a product held by the retail campaign | Price matches what you intended for that customer |
Measurement
- Primary: gross profit per order during the event, against the same period last year or a pre-event baseline, adjusted for refunds.
- Guardrails: share of units sold below the margin floor; discount given as a share of revenue; shipping subsidy per order.
- Inventory goals: outlet sell-through against its target, measured in units.
- Confounders: traffic and ad spend, the event calendar, and customer mix all change during Black Friday, so before/after comparisons are not causal on their own.
Common Mistakes
- Designing a priority ladder the tools cannot enforce.
- Assuming the newest campaign wins an overlap; the campaign that already holds the variant keeps it.
- Expecting a wholesale campaign and a retail sale to share the same variants.
- Running two spend campaigns and expecting the bigger discount to apply.
- Excluding luxury items from product campaigns but forgetting the order-level discount.
- Trusting a margin floor that the campaign type does not enforce.
- Testing thresholds only in the store's base currency.
Frequently asked questions
Can I set campaign priorities in Discount Prime?
No. There is no priority field. For price-changing campaigns, each variant belongs to one campaign at a time: the campaign already holding it keeps it, and a later campaign skips it until you move the product in the conflict resolver. Plan the launch order and review the "Products excluded due to conflicts" list after each launch.
What happens when two spend-based order discounts qualify in the same cart?
In Discount Prime, when several Tiered Spend (order) campaigns qualify, the smallest positive discount applies, which favors the merchant, not the customer. Run one order-level campaign at a time during an event if you want a predictable result. Shipping campaigns behave the other way: the largest shipping discount wins.
Will a Black Friday sale override my wholesale customers' prices?
Not in Discount Prime if the wholesale campaign already holds the variant, but the reverse problem can occur: variant ownership is per variant, not per customer group, so a wholesale campaign that holds a variant also keeps a later retail sale off that variant. Discount Prime does not read Shopify B2B companies; on Shopify Plus, native B2B catalogs can hold contract prices so the retail campaign can own the variants.
How do I keep luxury items out of a store-wide sale?
Exclude them from every product-level campaign and from native Shopify discounts. Note that a Tiered Spend (order) campaign discounts the whole order subtotal, so luxury items in the cart count toward its threshold and share its discount. If they must never be discounted, avoid an order-level percentage during the event or accept that trade-off.
Does Discount Prime stop discounts that break my margin floor?
Only on some types. Cost-based floors exist for Wholesale / B2B Pricing, Dropshipping Pricing, and Product Bundles, using Shopify unit cost. Flat, Tiered, Order, and Buy X Get Y campaigns have none. Check each product yourself: to keep a margin floor f after a discount d, its list-price gross margin must be at least d + f × (1 − d), for example 56.5% for 25% off with a 42% floor.
Go deeper
Run this architecture in your store
Every campaign type in this case study is included in Discount Prime, with profit analytics to verify the margin impact.