Merchants Answered
Operations answers for working Shopify merchants

Shopify Discount Codes Explained: Combinations, Limits, and the Stacking Surprise

First, check the fulfillment status

Everything about this request depends on one fact: has the order shipped yet. If it is unfulfilled, you have options. If it is fulfilled or in transit, you are no longer editing an order, you are arranging an exchange, and the conversation with the customer changes completely. Check the order timeline before you promise anything, because the wrong promise here creates the refund dispute you were trying to avoid.

In the Shopify admin, open the order and look at the fulfillment status first, the payment status second. An unfulfilled, paid order is the easy case. A partially fulfilled order means some items can still change and some cannot, which you need to explain clearly. Train whoever answers customer messages to check this before typing a reply; most bad outcomes in this scenario come from promising an edit that was never possible.

When you can edit the order

For unfulfilled orders, Shopify lets you edit: add or remove line items, change quantities, and adjust the order total, with the customer charged or refunded the difference. This is the cleanest path when the customer wants a different size or color of the same product. Make the edit, confirm the new total with the customer in writing, and note that the edit itself is the confirmation; do not also send a separate "we changed it" email that confuses the thread.

Edits have limits worth knowing. You cannot change the order into something unrecognizable without confusing your own records, and editing does not work once fulfillment has started. If the price difference is significant, get explicit approval before charging the extra amount; an unexpected charge on a card is how a simple size swap becomes a chargeback.

When to cancel and reorder instead

Cancel and reorder is the right call when the change is extensive (half the items are different), when the customer wants to add items that change shipping weight or method, or when the original order is already fulfilled. It is also cleaner when the customer is clearly unsure; a fresh order with a fresh confirmation beats three rounds of edits that nobody can follow.

The mechanics matter: cancel the original, issue the refund promptly, and create the new order, ideally as a draft order you send for the customer to approve and pay. Do not cancel without the replacement ready, or the customer experiences it as "my order was cancelled" rather than "my order was fixed." Speed of the refund is the whole ballgame here; a same-day refund turns a hassle into a loyalty moment.

What to tell the customer

The message template that works: confirm what you are doing, state the timeline, and name the money. "I have updated your order to the blue in size medium. The $12 difference has been refunded and should appear in 3 to 5 business days. Your order still ships Thursday." Every element answers a question the customer would otherwise ask in a follow-up message, which is the real cost driver in these exchanges.

If you cannot do what they asked, say so in the first sentence and offer the alternative immediately. "That order already shipped this morning, so I cannot change it, but here is what I can do: refuse the delivery or send it back with this prepaid label, and I will ship the correct item today." Bad news first, solution second, no hedging in between.

Preventing it next time

A sizing chart linked at the point of size selection, a clear "final sale" flag on items that cannot be changed, and an order confirmation email that arrives within minutes all reduce these requests. The confirmation email is the cheapest intervention: customers who catch their own mistake within the hour are easy to help, while customers who notice three days later are not.

Track how often this happens and why. If size swaps dominate, your size guide is failing. If customers keep adding forgotten items, your checkout may be rushing them. The pattern in the requests is free product-page research, and merchants who read it stop answering the same email every day.

A code is three decisions wearing one string of text

Every discount code you create decides an amount, an eligibility, and a distribution, and the admin mostly asks you about the first. Percentage, fixed amount, free shipping, and buy X get Y are the amount. The eligibility is the minimum purchase, the specific collections or products, the customer segments, and the usage limits per customer and in total. Distribution is the part handled by hope: a code typed by a rep into a chat, printed on a postcard, or given to one influencer is a code that exists in the world, and the world files it on coupon sites within days.

We have watched stores learn this in the expensive order. A 20 percent thank you code meant for fifty customers does a coupon site tour, lands on a thousand orders the store never targeted, and the post mortem reveals nobody set a total usage limit, because the limit field felt like paperwork when the code was created.

Combinations are where the margin actually leaks

Shopify lets discounts combine under rules you control: product discounts, order discounts, and shipping discounts occupy separate classes, and within a class you decide whether codes can stack with each other and with automatic discounts. The classic accident is a percentage code stacking on top of an automatic sale discount that was already priced into the promotion, so the customer gets the sale and the code and the store discovers the combined rate in the month end margin report.

Blended reporting hides it beautifully. Revenue per session looks fine, conversion even improves, and the cost sits in a discount line nobody splits by code. The check that finds it takes ten minutes: pull orders by discount code for the promotion window and look at average discount depth per order, not per code. The stack shows up there immediately.

Automatic discounts are a different tool, not a better code

Automatics fire without a code, which makes them clean for sitewide sales and useless for anything targeted. They cannot be limited per customer, they show up for every eligible cart, and combined with code eligibility they are the other half of every stacking surprise. The operator rule that survives contact with reality: run a sitewide automatic or a code campaign as the headline mechanic, and audit the other class before launch, because the interaction is priced by your customers faster than by your team.

Buy X get Y deserves its own sentence because it misfires quietly: the get item has to be added to the cart to be discounted in most setups, customers who never add it blame the store, and support tickets about a promotion the customer half used are the tell that the mechanic needed a banner explaining itself.

The settings checklist before any code leaves the building

Total usage limit set to the size of the intended audience, not left blank. One use per customer on anything above a token discount. An end date, because an undated code is a permanent price reduction waiting for distribution. Combination boxes reviewed against whatever automatic is live. And a naming convention with the campaign in it, so the month end report can attribute margin to a decision instead of to a mystery string.

Do that and the code stays the tool it was meant to be: a measured nudge with a known cost. Skip it and you have not launched a promotion. You have published a price and outsourced the announcement to coupon sites.

Related reading

If this topic is useful, these earlier guides go deeper on connected questions: Shopify Shipping Zones Explained: Rates, Regions, and the Settings That Cause Surprise Costs, Shopify Abandoned Checkouts Explained: Recovery Emails, Timing, and What the List Actually Means, and Shopify Taxes Explained: Nexus, Rates, and What the Platform Does Not File.

Frequently asked questions

Why did my discount code appear on coupon sites?

Because codes travel. Customers share them, browser extensions harvest them at checkout, and affiliates scrape them. Once a code exists without tight usage limits it should be assumed public. The defense is limits and end dates set at creation, not takedown requests after the fact.

Can two discount codes stack on Shopify?

Across classes, yes by design: a product or order discount and a shipping discount can apply together, and you control whether codes combine within a class and with automatic discounts. The combinations settings on each discount decide, which is why reviewing them before a sale matters.

What is the difference between a code and an automatic discount?

A code is typed by the customer, so it can be targeted and limited per customer. An automatic discount applies to every eligible cart with no code, which suits sitewide sales and makes it impossible to restrict to an audience. Each can combine with the other if your settings allow it.

How do I stop a code being used more than once per customer?

Set the per customer usage limit to one when creating the code. Combine it with a total usage cap and an end date. Note that per customer limits track accounts and email identity at checkout, so they raise the cost of abuse rather than making it impossible.