Discounts
Managing Discounts
Find, create, edit, publish, archive and delete discounts in xDiscount, plus priority, the Sync states and your plan's active-discount limit.
The Discounts List
The Discounts page is where every discount you have ever created lives, live ones, drafts and archived ones together.
Getting there: click Discounts in the app’s sidebar. The page heading reads Discounts, with a Create discount button in the top right.
The columns
Each row shows five columns, in this order:
| Column | What it shows |
|---|---|
| Products | The first three products the discount targets, as thumbnails, with a +N for the rest. Click them to see every product by name. A dash means the targets are not known yet, or that the discount applies to the order rather than to products, as free shipping does |
| Discount | The name you gave it. Click it to open the discount for editing, and a row with no name shows as Untitled discount. Under it sits one muted line with the value (15% off, €10.00 off), the schedule when it is not Always, and the priority when you set one, plus a Failed or Too large badge beside the name when the discount did not reach your store |
| Status | Active, Draft or Archived |
| Type | Percentage, Fixed amount, Buy X get Y or Free shipping |
| Creation method | The day you made it, and Agent or Manual once the app records how it was made |
Finding a discount
Filter by type
The tabs above the table filter by type, All first, then one tab per discount type, each carrying a live count.
Open search and filters
Click the search and filter button, the magnifying glass at the right of the tabs, or press F. The tabs give way to a search field, Search discounts by name, with Status and Sync filter buttons beside it.
Search by name
The search matches the discount’s name only, not products or types.
Narrow by status or sync
Click Status or Sync and tick the values you want. The button then reads what it holds, for example Status: Active, Draft, with a cross to clear it.
Sort the list
Use the sort button, the arrows icon, to order by Priority, Name, Created, Updated or Last synced, and pick the direction underneath.
Clear all removes every filter in one click, and Cancel clears them and closes the search field. If you open a link that already carries filters, the strip opens with them on show. The list shows 25 discounts per page with previous and next controls. Out of the box it is sorted by Priority, lowest first.
Your filters live in the page address, so you can bookmark a view, “all failed discounts” for example, and come back to it.
Acting on several at once
Tick the checkbox at the left of a row, or the one in the header to take the whole page, and a bar appears above the table with Set as active, Set as draft, Archive and Edit. Unarchive and Delete sit behind More actions. Which ones are offered depends on what you ticked: Edit needs exactly one discount, Set as draft and Archive are not offered while an archived discount is in the selection, because an archived discount leaves the archive through Unarchive or Set as active, and nothing is offered that would change nothing.
Every action asks first. The confirmation names each discount it will touch, marks any that is already in that state as will be skipped, and runs the change one discount at a time, so if your plan’s active-discount limit refuses the fourth activation, the first three go through and the fourth is listed in the same box with the plan’s own sentence. Delete is red, says This cannot be undone, and removes the discount from Shopify before it removes it from the list. After any change the list and the tab counts refresh and the checkboxes clear.
The Discount Page
Opening a discount, or clicking Create discount, takes you to a full page rather than a modal. It is the same page for both, so a discount you create and a discount you edit can never behave differently.
The header
| What | Where | Notes |
|---|---|---|
| The heading | Top left | The discount’s Name. A discount with no name reads Untitled discount, and a new one reads Create discount |
| Discounts | Above the heading | Back to the list. It goes through the unsaved-changes check, so it can never quietly drop your work |
| Save | Top right, the primary button | The only control that writes the form |
| Activate discount, Move to draft, Archive discount | Beside Save | Only the ones that would actually change something are shown, and only on a saved discount |
| Delete discount | Beside them, in red | Only on a saved discount |
| The status badge | Directly under the header | Active, Draft or Archived |
Status buttons are switched off while you have unsaved changes, and the page says why next to the badge: “Save or discard your changes before changing the status.” A status change writes only the status, so offering it over an edited form would publish a record you are not looking at. Delete discount stays available either way.
The sections
The form is always in this order:
| Section | What is in it |
|---|---|
| Title | Name, with the note “Only you see this. It is how you will find the discount later.” |
| Included products | The product picker, covered below |
| Discount configuration | Discount type, its value field, Skip products that are out of stock, Priority |
| Discount period | Start date, End date, and the reminder that dates follow your store’s timezone |
| Conditions | Up to three condition rows, one each of Item quantity, Cart value and Inventory. See Conditions and Rules |
Three more sections sit in the right-hand column:
| Section | What is in it |
|---|---|
| Status | A Status dropdown with Draft, Active and Archived. This one is part of the form and is written by Save |
| Products | The products you have chosen, each with its thumbnail, name and how many of its variants the discount covers. Past three the list folds behind Show N more. A Buy X get Y discount lists its Gifts here too, each with how many of its variants shoppers may choose from, and says No gift chosen yet until one is |
| Discount preview | Stays in view while you scroll. The discount’s name and status, its type and value (in your store’s currency for a fixed amount), the gift count and gift items per order for Buy X get Y, the schedule, every condition in the words shoppers will read — and/or between them exactly as they are evaluated, not first when a condition is negated — and one closing sentence describing what shoppers get. Everything here is rebuilt as you type; with nothing chosen yet it says so plainly |
Two ways to change status
The Status dropdown in the right-hand column is part of the form, so it takes effect when you click Save, along with everything else you changed. The Activate discount, Move to draft and Archive discount buttons in the header write the status on their own, immediately, after a confirmation.
The three load states
The page never shows you a form it cannot safely save:
- Loading: a skeleton in the shape of the form, with the discount’s real name in the heading. There is no Save button here.
- Loaded: the form.
- Couldn’t load the products this discount applies to: a red banner with Retry and Back to discounts, and no form at all. This is the important one, because saving from a half-loaded product list would treat every product that never arrived as deselected and remove it, so the page refuses to open rather than risk it.
A discount that cannot be read at all shows Couldn’t load this discount with a Back to discounts button.
Choosing Products
The Included products section is a working list, not a read-only summary.
| Control | What it does |
|---|---|
| Browse | Opens Shopify’s product picker, pre-filled with your current selection, so adding one product does not lose the other nine |
| Remove all | Empties the selection |
| Choose products | The button inside the No products yet empty state. Same as Browse |
| The delete button on a row | Removes 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 and Show fewer products | The list shows 24 at a time |
Above the list is a summary line, “3 products selected, 5 variants targeted.”, and each product carries its own: All 4 variants, including any added later, or 2 of 4 variants.
An empty variant list means every variant, including variants you add in Shopify tomorrow. So ticking the last unticked variant on a product puts it back to whole-product targeting rather than writing out today’s list.
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.
Product names and variants are read back from your store’s synced catalogue, not 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.” Your selection is never affected by a naming problem.
Saving, and the Unsaved-Changes Bar
The moment the form differs from what is saved, Shopify’s own Unsaved changes bar appears in the admin’s top chrome, the same bar Shopify’s product and order pages use, with Discard and Save. Outside the Shopify admin, in a preview for example, the same bar appears at the top of the form instead.
- Save validates first. If anything is wrong you get the toast “Fix the highlighted fields before saving.”, a red banner headed This discount can’t be saved yet, and the failing fields marked in place. Nothing is written.
- Discard puts the form back to the last saved version. It does not leave the page.
- The bar is comparing meaning, not keystrokes. Re-picking the same products in a different order, or a trailing space on the name, is not a change and does not light it up.
Leaving with unsaved changes asks first. Clicking Discounts, or any other navigation inside the app, opens Leave page with unsaved changes?, with “Leaving this page will discard every change you have made to this discount.” and the buttons Leave page and Cancel. Closing the tab or reloading gets your browser’s own warning.
On success you get the toast Discount created or Discount saved, and a new discount becomes that discount’s edit page.
A discount always needs a name and a product
Saving with no products gives you “Choose at least one product for this discount to apply to.” A name is required too: “Give the discount a name so you can find it later.”
Creating a Discount
Start a new discount
Go to Discounts and click Create discount. The same button sits on Home and in the list’s empty state.
Name it
Under Title, enter a Name. Only you see it, and it is how you find the discount later.
Leave Status on Draft
Build it in peace, then publish when it is right.
Choose your products
Under Included products, click Browse, or Choose products in the empty state, and pick what the discount applies to. Tick specific variants under Variants if you want to narrow it.
Pick a type and a value
Under Discount configuration, pick a Discount type and fill in its value.
Add the optional parts
Set Skip products that are out of stock, a Priority, a Discount period and Conditions if you need them.
Save
Click Save.
A new discount starts as a Percentage discount, Draft, with Priority 10, no products, no dates and no conditions.
On a create, xDiscount writes the discount as a draft first, then its products, then applies the status you chose. A failure partway therefore leaves nothing live, never a half-built discount applying at checkout.
Editing a Discount
Open the list
Go to Discounts.
Open the discount
Click its name in the Discount column.
Check the form
It opens with everything filled in as you left it.
Change what you need
Name, products, type, value, out-of-stock handling, priority, dates, conditions.
Save or discard
Click Save, or Discard to undo your edits without leaving.
Editing a discount that is already live
Nothing is staged. The moment Save succeeds, xDiscount rewrites the configuration on every product that discount targets, and checkout and the storefront offer card both read that same configuration. A shopper adding to their cart a minute later gets the new terms.
That means:
- Changing a percentage from 20 to 10 on an Active discount cuts every shopper’s saving immediately
- Move to draft takes it off checkout immediately
- Changing dates, conditions or products is live the same way
If you want to rework a live offer without shoppers seeing half-finished terms, click Move to draft, make your changes, Save, then Activate discount again.
Priority, and Which Discount Wins
Two discounts can legitimately cover the same product. Only one applies per item, and the lowest priority number wins.
- Priority is a plain number field in Discount configuration. New discounts start at
10. The field says it: “Lower numbers win. When several discounts match one item, only the lowest applies.” - Lower beats higher, so priority
1wins over priority10 - A discount saved with no priority is treated as
999, effectively last - The same rule breaks ties between two Buy X get Y offers that both triggered
Because the Discounts list is sorted by Priority ascending by default, the discounts nearest the top are the ones that win where they overlap. A discount with no priority shows a dash in that column.
Free shipping takes a slot too
Free shipping is granted from a separate part of the checkout function, so it is never refused because a product discount outranked it. It does still take part in the priority ordering on the products it targets: if a Free shipping discount has the lowest priority number on a product, it takes that item’s single product-discount slot and no percentage or fixed-amount discount applies to that line. Give free-shipping discounts a higher priority number than the product discounts on the same products.
Status, and What Shoppers Actually See
| Status | At checkout | On the product page card | Counts toward your plan limit |
|---|---|---|---|
| Active | Applies automatically, no code to enter | Shown, on every plan, wherever the offer card is on your theme | Yes |
| Draft | Never applies | Not shown | No |
| Archived | Never applies | Not shown | No |
From the header buttons
Each one asks first, in a small dialog, and each is written on its own, so nothing else on the form goes with it.
| Button | Dialog heading | What it says | Confirm button | Toast |
|---|---|---|---|---|
| Activate discount | Activate discount | Are you sure you wish to activate this discount? It starts applying at checkout as soon as it reaches Shopify. | Activate | Discount activated |
| Move to draft | Move to draft | Are you sure you wish to move this discount to draft? It stops applying at checkout, and every product it covers is updated. | Move to draft | Discount moved to draft |
| Archive discount | Archive discount | Are you sure you wish to archive this discount? It stops applying at checkout and moves out of your active list. You can move it back to draft later. | Archive | Discount archived |
Only the changes that would do something are offered, so an archived discount has no Archive discount button. Every dialog also has Cancel, and if the change fails to reach Shopify the dialog stays open and says why, so you are never left looking at an unchanged badge with no explanation.
From the Status dropdown
The Status dropdown in the right-hand column does the same three things as part of a normal save: change it, click Save, and it is written with the rest of the form. Use it while you are editing, and use the header buttons when the status is the only thing you want to change.
To bring an archived discount back: open it and click Move to draft, or set Status to Active and Save. Archiving loses nothing, because the products, value, period and conditions are all still there.
Unpublishing and archiving behave identically for shoppers. The difference is what you mean by it: Draft is “not right now”, Archived is “done with this one”. Both remove the discount from the configuration on the products it targets, so it stops applying at checkout and stops showing on the offer card.
Shoppers never see a discount’s name, its status or its mechanics. The label that appears on a discounted line at checkout is always the single word xDiscount, and in your own Shopify admin the app runs as one automatic discount titled xDiscount.
Deleting a Discount
Delete discount sits in the page header of any saved discount, in red. It asks first:
Delete discount. Are you sure you wish to delete this discount? It is removed from every product it applies to. This can’t be undone.
Confirm with Delete, or back out with Cancel. On success you get the toast Discount deleted and land back on Discounts.
When a discount is deleted, xDiscount updates your store before it removes anything of its own:
- Every product that discount targeted has its configuration rewritten from the discounts that remain on it
- A product left with no discounts at all has the configuration removed entirely
- Only then is the discount itself removed
That ordering is why deleting cannot leave a ghost discount applying at checkout for a product it no longer belongs to. If step 1 fails, the whole delete is abandoned and nothing is lost: the dialog stays open with the reason, and you can try again.
Deleting is permanent. If you only want a discount to stop running, Archive discount does that, frees its slot against your plan limit, and keeps everything so you can bring it back.
Other discounts on the same product are untouched. Removing one discount from a product that carries three leaves the other two working exactly as before.
A connected AI assistant can also delete a discount through Connect AI, which is included on every plan, Free included. Deletion is marked as a destructive action there, so a well-behaved assistant asks you to confirm first.
The Sync States, or Did It Actually Reach My Store
Saving writes the discount in the app first, then pushes it to Shopify. The push can fail without your work being lost, so the sync state is reported honestly on the Discounts list and in the Sync filter:
| Sync | Meaning |
|---|---|
| Synced | Your store has the current version. It will apply at checkout |
| Pending | Saved, not yet confirmed as pushed |
| Failed | The push to Shopify did not go through, so the discount is not applying at checkout |
| Too large | The discount’s configuration is over Shopify’s 10,000-byte limit for discount functions, so xDiscount refused to push it. Shopify would have stored it, but the discount would never have applied |
When one or more discounts are failing, the Home page raises a red banner, Some discounts aren’t reaching your store, with a Review them button that opens the list filtered to exactly those discounts.
To retry, open the discount and click Save again, which re-runs the push. An oversized discount is different: the save itself still succeeds and your work is kept, but the push is refused before anything is sent to Shopify. Saving again changes nothing until you reduce what the discount carries, with fewer targeted variants, fewer gift products or fewer conditions.
Active-Discount Limits
Only Active discounts count against your plan. Drafts and archived discounts are free.
| Plan | Active discounts at once |
|---|---|
| Free | 3 |
| Starter | 25 |
| Growth | Unlimited |
| Scale | Unlimited |
If you try to activate a discount when you are already at the limit, the change is refused with a message naming your plan, the limit and how many you have, ending with “Pause or archive one, or upgrade your plan to add more.” There is no Pause control in the app: Move to draft is what that means, and either draft or archived frees a slot immediately.
Re-saving a discount that is already live never trips its own limit, so you can keep editing your live discounts at 3 of 3.
Once you are at the limit, Home shows a banner. On Free it reads You’ve used all 3 discounts on Free, with a See plans button that takes you to Settings, where the Plans and billing section lives. See Plans and Billing.
Discounts Created by a Connected AI Assistant
Connect AI is included on every plan, Free included. When you use it, the lifecycle has two extra guardrails:
- Anything an assistant creates arrives as a Draft, whatever it asked for. It cannot publish a discount on its own, so you publish it with Activate discount
- An assistant cannot edit a discount that is live. It gets told: “This discount is live. Unpublish it first, editing an active discount would change what shoppers are charged without anyone approving it.” Click Move to draft, let the assistant make its change, then Activate discount yourself
Publishing, unpublishing, archiving and deleting are all marked as destructive on the AI side, so an assistant should confirm with you before doing any of them. See Connect AI for the full tool list.