xDiscount is on the Shopify App Store. Founding merchants lock in lifetime founder pricing.
Docs

Discounts

Targeting Products

How an xDiscount discount targets products and variants, why whole-product targeting wins, out-of-stock skipping, and the 10,000-byte product limit.

Where Targeting Lives

Every discount in xDiscount applies to a list of products you choose. There is no “all products” switch and no collection picker, and a discount that targets nothing cannot be saved.

1

Open the Discounts page

Click Discounts in the app’s sidebar.

Open a discount

Click Create discount, or click the name of a discount you already have.

Find the Included products section

It sits between Title and Discount configuration on the discount form.

Above the product list is a summary line, and each product carries its own line underneath it.

Your selectionWhat the section shows
Nothing yetThe No products yet empty state, with a Choose products button
Whole products only3 products selected., and each product reads All 4 variants, including any added later
Some products narrowed3 products selected, 5 variants targeted., and a narrowed product reads 2 of 4 variants

If you try to save with nothing selected, the section shows “Choose at least one product for this discount to apply to.”, the page shows the banner This discount can’t be saved yet, a toast reads “Fix the highlighted fields before saving.”, and nothing is written.

Choosing Products

Included products is a working list, not a read-only summary. Everything on it can be changed in place.

ControlWhat it does
BrowseOpens Shopify’s own product picker, pre-filled with your current selection
Choose productsThe button inside the No products yet empty state. The same thing as Browse
Remove allEmpties the selection
The delete button on a rowRemoves that one product. Its accessible name is Remove plus the product’s title
Variants (4)Expands a product with more than one variant. Each variant is a checkbox, with its price and stock beside it
Show all 30 products / Show fewer productsThe list shows 24 products at a time
1

Open the picker

In Included products, click Browse, or Choose products if nothing is selected yet.

Pick your products

Search and tick as many products as you like. The picker is multi-select, and it opens pre-filled with what the discount already targets, so adding one product does not lose the other nine.

Narrow to variants if you need to

Back on the form, expand a product with Variants (4) and tick the individual variants you want discounted.

Save

Click Save. Nothing reaches your store until the whole form passes validation.

Product names come from your catalogue

Product names and variants are read back from your store’s synced catalogue rather than stored on the discount. If that read fails, the list still renders, labelled honestly: “Product names couldn’t be loaded, so these are shown by id. Your selection is unaffected.” A naming problem never touches your selection.

One discount per product

A product that another active or draft discount already covers — as one of its products or as one of its Buy X get Y gifts — is not offered in the picker at all. Two discounts reaching one product would both apply, and which one won would be settled by Priority rather than by you. Archive the other discount to release its products.

The discount you are editing always sees its own products, so editing it is never blocked.

The picker only opens inside Shopify

xDiscount runs inside the Shopify admin only. Opened anywhere else it shows Open xDiscount from your Shopify admin instead of the app, and the picker itself refuses with “The product picker is only available inside the Shopify admin.” Reopen xDiscount from Apps in your admin.

Whole Products vs Specific Variants

This is the single most important targeting decision, and the app infers it from how you used the list rather than asking you.

What you didWhat gets stored
Left the product without expanding its variantsWhole product, meaning every variant
Expanded it and ticked every variantWhole product. Ticking the last unticked variant puts the product back to whole-product targeting
The product has one variant onlyWhole product
Expanded it and ticked some variantsOnly those variants

An empty variant list means every variant, including variants you add in Shopify tomorrow.

Unticking every variant is refused, with a sentence on that product rather than a silent rewrite:

Keep at least one variant, or remove the product from this discount.

Why whole-product targeting is worth preferring:

  • New variants are covered automatically. Add a new size next month and a whole-product target picks it up. A list of specific variants never will, and the new one is silently left out.
  • It costs almost nothing against the size limit. A whole-product target stores no variant list at all. See Size Limits below.
  • It is what a merchant usually means. “20% off these five products” is nearly always every variant of those five.

Narrow to variants when the offer genuinely differs by variant, so clearing one colour, discounting the large size only, or running a promotion on a single SKU.

Excluding a variant is done by not selecting it. There is no exclusion picker. Narrow the product to the variants you want discounted, and everything you left unticked is untouched.

On the storefront, the offer card follows the variant the shopper selects. An offer narrowed to other variants is dimmed and flagged Not available for the selected variant the moment they pick one you left out, and comes back when they pick one you included — so the card never advertises a discount checkout will not give.

Targeting is read in pages of 250

A discount’s targeting is read 250 rows at a time, one row per whole product, or one row per variant where you narrowed. A discount that targets whole products only stays far inside that, which is one more reason to prefer it.

Skipping Out-of-Stock Variants

In the Discount configuration section there is a checkbox, Skip products that are out of stock, with the note “Checked at save time. Variants with no stock won’t be discounted.” It is off by default.

1

Open the discount

From Discounts, click the discount’s name.

Tick the box

In Discount configuration, tick Skip products that are out of stock.

Save

Click Save. xDiscount reads the stock level of the variants on your targeted products there and then.

Variants with no stock stop being discounted. Every other variant on the product carries on as normal. The setting is per discount, so two discounts on the same product can disagree, and only the one with the box ticked skips anything.

This is the same mechanism as the Inventory condition, set to the special case “at least 1 in stock”. Stock is read at the same moments, from the same source, and the same rule about untracked variants applies.

EventDoes stock get re-read?
You open the discount and click SaveYes, immediately, for every product it targets
The daily refresh runs at 03:00 UTCYes, for Active discounts that use Inventory or Skip products that are out of stock
A shopper adds to cartNo
An order drains the last unitNo
You restock in ShopifyNo

The honest limits of this feature:

LimitWhat it means for you
It is a snapshot, not liveStock is read when you click Save and again on the daily refresh, never at checkout. A variant that sells out an hour after a check is still discounted until the next one
It fails openIf stock cannot be read, nothing is excluded and the discount applies exactly as it did before. A promotion that quietly switches itself off mid-sale is worse than over-discounting a few sold-out variants, and Shopify will not sell an out-of-stock variant anyway unless you allow overselling
Untracked variants are never skippedA variant with no inventory tracking, which covers most digital products and services, reports no quantity at all. That is not the same as zero, so it is never excluded. Only variants tracked at zero or below are
First 250 variants per productOn a product with more than 250 variants, only the first 250 are checked for stock

Refreshing the snapshot yourself

Running a clearance discount? Open it and click Save with no other changes. That re-reads stock immediately for every product the discount targets, and the answer is correct again from that moment. The Conditions & Rules guide covers the full Inventory condition and what a day-old snapshot means in practice.

Size Limits, When a Discount Targets Too Much

Shopify gives every product a fixed budget for the configuration a discount can read at checkout: 10,000 bytes. xDiscount stores one configuration per product, holding every live discount that targets that product, so the variants each one is narrowed to, the conditions, and any gift products. Drafts and archived discounts are left out of it entirely and cost nothing.

Above 10,000 bytes Shopify still stores the configuration, but checkout stops being able to read it, so the discount would never apply, with no error shown anywhere. xDiscount refuses to let that happen quietly. It measures the configuration before writing anything to Shopify, and if it is over the limit it declines the write rather than trimming your settings.

What you see when this happens:

  • Your discount still saves, so you never lose your work.
  • On the Discounts list, its Sync column shows a warning badge reading TOO_LARGE.
  • On Home, a red banner appears, Some discounts aren’t reaching your store, with a Review them button that opens the Discounts list filtered to exactly those discounts.
  • You can find them yourself at any time: Discounts → the Sync filter → Too large.

The budget is per product, not per discount. Targeting 500 different products is fine, because each one gets its own 10,000 bytes. What consumes the budget is listing individual variants of one product, plus conditions, plus Buy X get Y gift products. As a rule of thumb, a list of around 100 variants costs about 4.3 KB, close to half the budget for a single product.

How to get a too-large discount back under the limit:

1

Open the discount

Click its name on the Discounts list.

Re-select the affected product as a whole product

In Included products, tick every variant of it, or remove and re-add it without expanding its variants. A whole-product target stores no variant list at all, and it is the biggest single saving available.

Thin out the other discounts on that product

If several discounts target the same product, they share that one product’s budget. Archive or delete any of them you no longer need, and the product’s configuration is rewritten without them.

Trim conditions and gifts

In Conditions, remove any rows you do not need, because conditions are stored on every product the discount targets. For Buy X get Y, trim the gift product list.

Save

The Sync badge turns to SYNCED on the next successful save.

Saving again is also how you retry anything showing FAILED, because every save re-pushes the configuration to Shopify.

Inventory conditions cost bytes too

An Inventory condition writes the list of skipped variants into the configuration on each targeted product, so it consumes budget on top of your variant lists. It is worth knowing about when a large, heavily narrowed discount is close to the limit.

When Several Discounts Target the Same Product

A product can carry as many discounts as you like, and xDiscount keeps them all in one configuration. At checkout, only one product discount applies per item, the one with the lowest Priority number among those that match. Archiving or deleting one discount rewrites that product’s configuration with the survivors, so the others keep working untouched.

One case is worth knowing about in advance. If two discounts on the same product both use an Inventory condition with different ranges, both obey the combination of the two, so the looser one skips more variants than it asked for. That keeps the product’s configuration inside the 10,000-byte limit, and it errs towards discounting less rather than more.

Quick Reference

QuestionAnswer
Where do I choose products?Discounts → open a discount → Included products
Button textBrowse, Choose products in the empty state, Remove all
Can a discount target zero products?No, saving is blocked
Can I target a collection or “all products”?No. Products, and optionally their variants, only
How do I exclude a variant?Select the variants you do want. The rest are untouched
Will a new variant get the discount?Yes for whole-product targets, never for variant lists
Are gift products targeted here?No. Buy X get Y gifts are chosen in Discount configuration and need no targeting of their own
Does out-of-stock skipping run at checkout?No. It is recorded when you click Save, and refreshed daily at 03:00 UTC
What is the size limit?10,000 bytes per product, shared by every live discount on that product
Where do I see size problems?The Sync badge TOO_LARGE, and the Home banner Some discounts aren’t reaching your store