Yes, you can combine discounts on Shopify, but only the pairs you explicitly allow, and only within classes that are actually compatible. Shopify sorts every promotion into three discount classes, product, order, and shipping, and combining discounts means letting two or more of those classes apply to the same order. The catch is that nothing stacks by default: each discount carries a Combinations setting you have to switch on, and a few pairs never combine no matter what you do.

That single detail is where most merchants get stuck. A shopper stacks a welcome code on top of an automatic sale, sees only one apply, and opens a support ticket. Below is the combination matrix, the real checkout limits, and the one change in 2026 that quietly broke a lot of old discount setups.

Which Shopify discounts can be combined?

Product, order, and shipping discounts can each combine with the other two classes, but two discounts of the same class usually cannot stack, with a couple of exceptions. A discount class is simply what a promotion acts on: product discounts mark down specific items, order discounts take a percentage or amount off the cart subtotal, and shipping discounts reduce or waive delivery. These are the building blocks of every Shopify discount combination.

Here is how the classes stack natively, before any app is involved:

Combine with →Product discountOrder discountShipping discount
ProductSame item: Plus only. Different items: yesYes (eligible stores)Yes
OrderYes (eligible stores)Yes, multiple (eligible stores)Yes
ShippingYesYesNo, only one shipping discount per order

At checkout the customer sees each qualifying discount as its own line in the order summary, deducted in a fixed sequence rather than all at once. Product markdowns hit individual items first, the order discount then applies to the reduced subtotal, and the shipping discount comes off last. That order matters: a 20% order discount is calculated after product discounts have already lowered the subtotal, so the two do not simply add up to a flat 20% off the sticker price.

“Product discounts apply first to individual items. Order discounts apply to the revised subtotal after product discounts. Shipping discounts apply last.” — Shopify Help Center, Combining discounts

How do you combine multiple discounts in Shopify?

You combine multiple discounts by turning on matching Combinations settings for each discount involved, because Shopify never stacks them for you. Open Discounts in your admin, click into a discount, scroll to the Combinations section, and check the classes it is allowed to join, whether product, order, or shipping. Save it, then repeat on every other discount you want it to stack with.

Both sides have to agree. If your free-shipping automatic discount allows order discounts, but your order code is not set to combine with shipping, they will not stack. This is the most common reason a Shopify discount code stops working at checkout, and it applies equally to shopify automatic discounts and manual codes.

How many discounts can stack on one order?

Shopify caps stacking at a small, fixed set of numbers. A customer can apply up to five product or order discount codes plus one shipping discount code on a single order, and a store can have a maximum of 25 active automatic discounts running at the same time. Multiple shipping discounts can never combine with each other, so only the best one wins.

Those limits are the practical ceiling on any Shopify discount combinations strategy. If you are hitting the discount code limit or juggling near the 25-discount cap during a sale, that is a signal to consolidate promotions rather than layer more of them.

How do you do buy one get one 50% off on Shopify?

Create a Buy X Get Y discount: set the customer to buy one qualifying item and get a second at 50% off. In your admin, go to Discounts, choose Buy X Get Y, define the “customer buys” quantity and the “customer gets” item at 50% off, then save. It can run as an automatic discount or behind a code.

One important limit: items already tied to a Buy X Get Y discount generally will not combine with additional product discounts on the same items. So a BOGO deal and a separate 20%-off-product code often will not both land on the same units, even with Combinations enabled. Plan BOGO as a standalone offer or pair it only with an order-level or shipping discount.

What changed after Shopify Scripts shut down

The biggest 2026 shift is that custom stacking logic no longer lives in Shopify Scripts. Shopify deprecated Scripts on June 30, 2026, retiring the checkout scripts that Plus merchants once used to build bespoke discount rules. The replacement is Shopify Functions, which powers both the native Combinations engine and custom discount apps.

There is a practical eligibility catch tied to this. To combine product discounts with order discounts, or to stack multiple order discounts, a store has to be on Checkout Extensibility without legacy checkout.liquid customizations. If your combinations silently refuse to work, an un-migrated checkout is the usual culprit. Our full guide on moving discounts from Scripts to Functions walks through the migration step by step.

When stacking discounts eats your margin

The technical question of whether discounts combine is easier than the financial question of whether they should. Every stacked discount compounds against the same margin, and a product markdown plus an order discount plus free shipping can quietly push a cart below break-even. Before you enable combinations for a big sale, run the numbers on how much discount you can actually afford.

This is also where a lot of brands rethink deep stacking altogether. Instead of layering coupons that erode margin one line at a time, group-buying tools like Farabiulder move the discount to volume, the price drops because more people buy together, not because you stacked three codes. If stacking is mainly a growth lever for you, it is worth comparing it against the best Shopify group buying apps before your next promotion.

Combining discounts on Shopify is entirely doable once you know the rules: set Combinations on both sides, respect the class matrix and the checkout limits, and make sure your store is on the post-Scripts stack. Get those three right and the stacking works exactly as your customers expect, without the surprise support ticket. { “id”: “scene_1_hook”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “avatar_on_camera”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “bottom-left circular inset (~28% width)”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “centered” }, “setting”: “dark charcoal setting with a Shopify-style discount field center-frame showing one code applied and a second greyed out”, “subject”: “presenter speaking straight to camera, bottom-left circular inset”, “camera”: “static medium shot, slight punch-in on the greyed-out second code as it lands”, “lighting”: “soft key light on presenter, subtle orange glow on the discount field”, “voiceover”: “Shopify will not stack your discounts by default and most merchants find out from an angry customer support ticket.”, “on_screen_text_only”: [“Discounts don’t stack by default”], “text_animation”: “the second discount code fades to grey and a thin orange underline sweeps beneath the headline”, “audio”: “soft ambience bed; one subtle ding as the greyed code lands”, “source_credit_label”: “help.shopify.com”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “hard cut exactly on the last spoken word, no trailing frame” } { “id”: “scene_2_problem”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “animation_plus_voiceover”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “none this scene”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “centered” }, “setting”: “animated order-summary panel on dark charcoal with discount lines counting up”, “subject”: “one big number center-frame representing the per-order discount ceiling”, “camera”: “static, slow push-in on the number”, “lighting”: “even, subtle orange rim on the number”, “voiceover”: “Shopify lets one order carry up to five discount codes plus a single shipping code so the ceiling is real.”, “on_screen_text_only”: [“5 codes + 1 shipping code”], “text_animation”: “the 5 counts up from 0 then the shipping code snaps in beside it with an orange underline”, “audio”: “soft ambience bed; one subtle tick as the number locks”, “source_credit_label”: “help.shopify.com”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “hard cut exactly on the last spoken word, no trailing frame” } { “id”: “scene_3_point_1”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “animation_plus_voiceover”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “none this scene”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “centered” }, “setting”: “three animated chips labeling the discount classes on dark charcoal”, “subject”: “three stacked labels product order shipping snapping into place”, “camera”: “static, gentle vertical reveal of each label”, “lighting”: “even, orange accent on the active label”, “voiceover”: “Every promotion is one of three classes product order or shipping and each can combine only with the other two.”, “on_screen_text_only”: [“3 classes: product, order, shipping”], “text_animation”: “each class label drops in one by one with an orange highlight on the current one”, “audio”: “soft ambience bed; one subtle tick per label”, “source_credit_label”: “help.shopify.com”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “hard cut exactly on the last spoken word, no trailing frame” } { “id”: “scene_4_midturn”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “avatar_on_camera”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “full-frame presenter”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “lower third, kept out of the bottom-right corner” }, “setting”: “presenter full-frame with a Combinations toggle animating on behind them on dark charcoal”, “subject”: “presenter speaking straight to camera delivering the turn”, “camera”: “static medium shot, slight punch-in as the toggle switches on”, “lighting”: “soft key light on presenter, orange glow on the toggle as it activates”, “voiceover”: “Here is the turn both discounts must have combinations switched on or Shopify silently applies just one at checkout.”, “on_screen_text_only”: [“Both sides must be enabled”], “text_animation”: “two toggles flip to on together with an orange highlight on the word both”, “audio”: “soft ambience bed; one subtle switch click as the toggles flip”, “source_credit_label”: “help.shopify.com”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “slide up into the table on the last spoken word, no trailing frame” } { “id”: “scene_5_table”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “animation_plus_voiceover”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “none this scene”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “centered as a three-row table” }, “setting”: “clean three-row combination matrix on dark charcoal”, “subject”: “the discount combination matrix revealing row by row”, “camera”: “static, locked on the table”, “lighting”: “even, orange highlight sweep on the key row”, “voiceover”: “The matrix is simple product pairs with order and shipping but two shipping discounts never combine on the same order.”, “on_screen_text_only”: [“Product + order: yes”, “Product + shipping: yes”, “2 shipping discounts: no”], “text_animation”: “rows reveal one by one, with an orange highlight sweep landing on the third row”, “audio”: “soft ambience bed; one subtle tick per row reveal”, “source_credit_label”: “help.shopify.com”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “hard cut exactly on the last spoken word, no trailing frame” } { “id”: “scene_6_cta”, “duration_mode”: “match_voiceover”, “target_seconds”: 7, “end_rule”: “end exactly on the last spoken word — no freeze frame, no held last frame, no trailing silence; if the voice ends early, the scene ends early”, “aspect_ratio”: “9:16”, “mode”: “avatar_on_camera”, “pacing”: “continuous delivery, no leading or trailing silence, no long pauses between phrases”, “style”: { “look”: “clean modern ecommerce explainer, high contrast, minimal, premium”, “background”: “near-black charcoal”, “accent”: “warm orange”, “text_color”: “white”, “font”: “Inter or Sora, bold”, “motion”: “snappy, hard cut, no dissolves”, “voice”: “neutral accent, calm and confident, steady continuous pace, no pauses between phrases” }, “layout”: { “avatar_position”: “bottom-left circular inset (~28% width)”, “bottom_right”: “completely empty and clean, no graphics of any kind”, “source_credit_position”: “top-left, small”, “on_screen_text_position”: “centered, kept clear of the bottom-right corner” }, “setting”: “presenter over a slow vertical scroll of the farabiulder.com combine-discounts post on dark charcoal”, “subject”: “presenter speaking straight to camera, bottom-left circular inset”, “camera”: “static medium shot, gentle slow scroll of the post behind”, “lighting”: “soft key light on presenter, subtle orange glow on the scrolling page”, “voiceover”: “Stacking works once you know the rules get the full breakdown on farabiulder dot com linked in the description.”, “on_screen_text_only”: [“Know the rules, stack with control”, “farabiulder.com/blog/shopify-combine-discounts”], “text_animation”: “closing line fades in, then the URL slides up beneath it with a thin orange underline”, “audio”: “soft ambience bed; one subtle confirming chime as the URL appears”, “source_credit_label”: “none”, “negative_prompt”: “render ONLY the strings in on_screen_text_only; no hex codes, color names, field names or JSON keys on screen; no captions, no music over dialogue, no silence at start or end, no freeze frame; the entire bottom-right quadrant must be empty and clean — no logo, no watermark, no icon, no sparkle or star, no glass or frosted panel, no card, no button, no glow, no reflection, no object or decoration”, “transition_out”: “fade to orange end card reading ‘farabiulder.com/blog’ immediately on the last word” }

Frequently Asked Questions

Can you use two discount codes on Shopify?

Customers can enter up to five product or order discount codes plus one shipping code in a single Shopify order, but the codes only stack if each one has the matching classes enabled in its Combinations settings. If either code is set to combine with nothing, only one will apply at checkout.

Can you combine discount codes?

Yes, but not automatically. Two discount codes combine on Shopify only when both have compatible discount classes turned on in the Combinations section, for example a product code set to combine with order discounts and an order code set to combine with product discounts. Same-class codes generally do not stack.

How to create bulk discount codes in Shopify?

In your Shopify admin, open Discounts, create a code-based discount, then use the bulk generate option or a bulk discount code app to produce many unique codes at once. Set the Combinations rules before you generate so every code inherits the same stacking behavior, then export the list to share with customers.