Shopify Now Lets You Combine Two Discounts on One Line Item — But Only on Plus
Shopify's GraphQL Admin API can now apply two separately-created product discounts to the same cart line instead of only the better one winning — a capability Shopify Scripts used to provide and nothing has replaced since Scripts stopped running in June. The part almost every article covering this skips: it's gated to Shopify Plus, there is no admin dashboard toggle anywhere, and it only works through a tag-matching field both discounts have to reference correctly. Here's exactly how the mechanism works, the GraphQL you actually need to write, and what a non-Plus store should do instead of searching for a setting that doesn't exist for them.
As of the 2026-04 GraphQL Admin API, Shopify can apply two separately-created product discounts to the same cart line instead of applying only the better one and silently dropping the other — something Shopify Scripts used to do and nothing has replaced since Scripts stopped executing on June 30. The part that trips almost everyone up: this is exclusively a Shopify Plus capability, there is no toggle for it anywhere in the Shopify admin, and it works through a tag-matching field that both discounts have to reference correctly or nothing combines.
A Plus merchant posted on the Shopify Community asking why they couldn't find the combination option in their dashboard at all — a reasonable question, because the answer is that there was never a dashboard option to find. This is API-only, and every blog post currently ranking for "combine discounts shopify" describes the discount classes in general terms without saying that plainly.
What actually changed on July 15
Before this release, if a customer's cart line qualified for two product discounts — say a 20% sitewide seasonal sale and a separate $10-off affiliate discount code, both targeting the same boots — Shopify applied whichever discount was more favorable to the customer and ignored the other one entirely. No error, no partial application, just one discount winning and the second one doing nothing, with no indication to the merchant that it had been silently dropped.
The new combinesWith capability on product discounts lets you say, explicitly, "this discount is allowed to stack with these other specific discounts on the same line" — so the seasonal sale and the affiliate discount can both apply to the same pair of boots at once, provided you've wired them together correctly.
The catch: Plus-only, and there's no dashboard setting
Shopify's own discount combination documentation is explicit about this: combining two product discounts on the same line item is available only on the Shopify Plus plan. Every other plan — Basic, Shopify, Advanced — keeps the old behavior. If two product discounts target the same line on a non-Plus store, Shopify still applies only the best-eligible one and drops the rest, exactly as before this release.
The second, less obvious catch is that even Plus stores don't get this from a settings page. It ships as a field on the GraphQL Admin API's discount input objects — DiscountAutomaticBasicInput and its code-discount equivalent — not as anything you can click through in Discounts > Create discount. If you're on Plus and looking for a checkbox that says "combine with other product discounts on the same item," it does not exist. You, or a developer, have to create or update the discount through the API directly.
How the tag-matching actually works
The mechanism is a mutual tag system, not a simple on/off switch between two named discounts. Every discount created or updated through the API can carry a tags list — its own identifying labels. Separately, a discount's combinesWith input has a field called productDiscountsWithTagsOnSameCartLine, which takes a list of tags it is willing to combine with. For two discounts to stack on the same line, the match has to hold in both directions: Discount A must list a tag that appears in Discount B's own tags, and Discount B must list a tag that appears in Discount A's tags. One-directional permission does nothing.
Concretely, creating an automatic discount that opts into this looks like:
mutation CreateSeasonalSale($input: DiscountAutomaticBasicInput!) {
discountAutomaticBasicCreate(automaticBasicDiscount: $input) {
automaticDiscountNode { id }
userErrors { field message }
}
}
# Variables
{
"input": {
"title": "Winter Collection 20% Off",
"startsAt": "2026-09-01T00:00:00Z",
"tags": ["seasonal-sale"],
"combinesWith": {
"productDiscounts": true,
"productDiscountsWithTagsOnSameCartLine": ["affiliate-partner"]
}
// customerGets, minimumRequirement, etc. as usual
}
}
The affiliate discount code created alongside it needs the mirror image: its own tags must include "affiliate-partner", and its combinesWith.productDiscountsWithTagsOnSameCartLine must include "seasonal-sale". Get the direction backwards on either side, tag one discount but forget the other, or typo a tag string, and the two discounts simply don't stack — the mutation itself validates the shape of the input, not whether some other discount out there happens to carry a matching tag, so a mismatch isn't something you catch at save time. You catch it by running a real test cart, the same way you'd have caught a broken Script.
One detail worth flagging for anyone who already migrated a discount off Scripts and onto a Shopify Function: combinesWith and its tag field apply to Function-based discounts too, not just the discounts you create through the standard Discounts admin page. If your replacement Function is meant to stack with a separate promotional discount on the same line, it needs the same tag wiring — Functions don't get this behavior automatically just because they generate a discount operation.
What non-Plus stores actually get, and why searching for this wastes time
If you're on Basic, Shopify, or Advanced and two product discounts are both eligible on the same line, Shopify still resolves it the old way: it silently picks the single best-eligible discount and drops the other, with nothing in the checkout, the order, or an email telling you it happened. That has not changed and, per Shopify's own plan-gated documentation, is not scheduled to change with this release. If you searched your way to this feature hoping to stack a loyalty discount with a seasonal sale on a non-Plus store, the honest answer is that this specific capability is not available to you at any price short of upgrading to Plus — not through an app, not through a workaround, because it's an API primitive gated at the plan level rather than a UI feature an app could unlock.
What non-Plus stores can still do is combine an order discount with a product discount, or a product discount with a free shipping discount — those combinations remain open on every plan, and are configured from the ordinary discount creation screen without touching the API at all. The gap is specifically two product discounts landing on the identical line at once. If your actual goal is "run a sitewide sale and a discount code together," that's an order-plus-product combination and already works everywhere; it's only the narrower same-item, product-plus-product case that needs Plus and GraphQL.
Where this sits relative to the Scripts sunset
This didn't ship in isolation. Shopify Scripts, which could rewrite a cart directly and apply multiple discount rules to one line without any of this tag machinery, stopped executing entirely on June 30, 2026, and the Script Editor closed on July 30. Merchants who used Scripts to stack a wholesale tier discount with a promotional code on the same product lost that capability with no replacement at the time. This release, three and a half months later, is the first piece of native infrastructure that closes part of that gap — but only for the subset of former-Scripts users who are also on Plus, and only if they're willing to configure it through the API rather than the admin UI Scripts used to provide. If you're still working through what broke when Scripts stopped running and stacked discounts were part of it, this is the mutation-level detail that migration guide didn't have yet because it didn't exist when Scripts sunset.
Who should build this, and who should skip it
- Build it if: you're on Shopify Plus, you regularly run overlapping promotions on the same products (a sitewide sale plus an affiliate or loyalty discount), and you have developer resources who can write and test a GraphQL mutation — this is not a five-minute admin task, it's a small integration project with real edge cases around tag typos and mutual matching.
- Skip it if: you're on any plan below Plus. There is nothing to configure; the feature does not exist for your store regardless of which app you install, and any app claiming to offer "true" same-item discount stacking on a non-Plus store is either combining discount classes that were already combinable, or not doing what it says. It's the same pattern as the checkout custom fields gap — a real capability that only exists above a plan tier, not something a workaround restores.
- Skip it if: you're on Plus but your overlapping-discount cases are rare or low-value enough that manually excluding one discount from a promotion (via collection or product exclusions) is simpler than maintaining a tag-matched combination rule that breaks silently if anyone edits a tag later.
If you're on Plus and want two or more promotions to stack correctly on the same product line, or you're trying to work out whether your old Script-based discount logic can be rebuilt with this instead of a full custom Function, this is the kind of Shopify Functions and Discounts API work we do — get in touch and we'll tell you plainly whether your case needs the tag-matching approach, a custom Function, or nothing at all.
Sources reviewed
- Shopify Changelog: Multiple product discounts on the same item
- Shopify Developer Changelog: Multiple product discounts can apply on a single cart line
- Shopify Help Center: Combining discounts
- Shopify.dev: DiscountCombinesWithInput
- Shopify.dev: DiscountAutomaticBasicInput
- Shopify.dev: discountAutomaticBasicCreate mutation