Growth

Which SKUs Deserve an Ecommerce Discount

Discount the SKU, not the whole catalog

An ecommerce discount belongs on a specific SKU that is slow, still profitable after the cut, and has enough healthy stock to absorb extra orders. It does not belong on a bestseller that already converts, a thin-margin product, or a unit that will stock out if demand jumps.

Shopify merchants usually start with the offer type (20% off, $10 off, spend $75) and then hope the catalog responds. Reverse that order. Decide eligibility first, pick the offer second, and set a stop date before the code goes live. The durable list price is a separate decision, covered in product pricing strategy for Shopify SKUs.

Who should get an ecommerce discount

Promote a SKU only when all three gates pass. Fail any one and leave the price alone, or change the page, collection, or ad instead of the price.

  • Sales velocity is below the SKU’s own recent baseline, not merely below a store average. A hero that sells 40 units a week is not “slow” because a new launch sold 8.
  • Stock cover still clears your own reorder window after a demand lift you choose. Set that window from this SKU’s lead time, recent daily demand, and safety stock, not from a fixed day count.
  • Contribution after the discount, unit product cost (COGS), other variable costs, and expected returns stays above your floor. If the floor is unknown, do not guess it. Calculate contribution margin per unit before you cut the price.

That third bullet is the hard stop. A discount that clears units and loses money on each extra order is not a growth tactic. It is a cash leak with a countdown timer. The formula lives in contribution margin per unit.

SKUs that should stay full price

Leave these off the promotion, even if a campaign calendar says “sitewide.”

  • High converters with thin cover. Extra demand here creates a stockout, not incremental profit.
  • New launches still inside the first review window. A launch discount can train early buyers to wait for the next cut, and you do not yet know the baseline conversion. Treat that as a risk to test against a short, dated offer, not as a certain outcome.
  • Hero SKUs that already convert at or above the collection median and have steady sell-through. Discounting them mostly rebates customers who would have paid full price.
  • Any SKU whose post-discount contribution is at or below zero after unit COGS, other variable costs, returns, and shipping subsidies.
  • Products with a known quality or fit problem. A price cut does not fix the cause of those returns. Test whether a discount raises return volume before you use it to clear the SKU.

Aging inventory is the exception people reach for too fast. Age is a reason to investigate, not an automatic markdown. Build the receipt-dated picture in the inventory aging report first, then run the margin gate below. If a 180-day unit still has negative contribution after a 30% cut, do not promote it. Evaluate a bundle, a donation, or a write-off against the cost of each option and against your accounting and tax treatment. None of those is automatically better than holding the unit.

Percentage, fixed amount, or threshold

Once a SKU is eligible, the offer shape changes who buys and how much margin you give away. Shopify’s discount types include percentage, fixed amount, and buy X get Y, plus free shipping, and each can be limited to products, collections, customers, or a minimum quantity or spend. Confirm the current controls in Shopify Help before you build the code, because minimums and product eligibility are set on the discount itself, not in a separate pricing report.

OfferBest whenWatch for
Percentage offThe SKU has a mid or high price and you want a simple, comparable cut across variants.A 20% cut on a $120 item gives away $24. The same 20% on a $28 accessory gives away $5.60 and can wipe the margin.
Fixed amount offYou need a predictable dollar concession, often on one price band.A $15 off code on a $22 add-on is a different deal than $15 off a $90 core product. Do not reuse one amount across the catalog.
Spend or quantity thresholdThe goal is a larger basket, not a cheaper hero. Set the threshold just above the typical order that already includes the eligible SKU.If most orders already clear the threshold, you are funding purchases that would have happened anyway.
Buy X get YYou have a complementary SKU with cover and acceptable margin on the free or reduced unit.Treat it as a multi-SKU offer. Check component stock and unit economics in the bundle pricing guide before you launch.

For a multi-SKU offer, use the bundle gate in bundle pricing strategy instead of treating the bundle as a single-SKU markdown. This article stays on one product at a time.

Psychology still matters, but it is secondary to eligibility. A crossed-out price, a short end date, and a specific reason (“end of colorway”) can raise take-up. None of those tricks repair a SKU that fails the margin or stock gate. A loud discount that disappears at shipping, or a code that fails on the eligible variant, can train people to distrust the next offer. Treat that as a risk to watch, not a proven result.

The pre-launch gate

Run this on every candidate before the code is active. Use a fixed window, usually the last 28 days, so a one-week spike does not set the baseline. Label every number as that SKU’s own history, not an industry benchmark.

1. Margin floor

Start from contribution margin per unit, not gross merchandise value. Subtract the discount, the unit product cost (COGS), the other variable costs (payment fees, pick-pack, outbound shipping you subsidize), and a returns allowance. COGS is the cost of the goods themselves. Do not bury it inside fees or skip it because the inventory was already paid for. The returns allowance is your recent return rate on that SKU times the margin you lose on a returned unit, including outbound freight you do not recover.

Worked example, labeled as hypothetical. A candle sells at $32. Unit COGS is $7. Payment fees, pick-pack, and subsidized outbound shipping add $4, so variable costs are $11, and that $11 already includes the cost of the candle. Recent return rate is 4%, and a return costs you $6 in unrecoverable freight and restock labor. Baseline contribution is about $32 − $7 − $4 − (0.04 × $6) = $20.76. A 25% discount cuts price to $24. New contribution is about $24 − $7 − $4 − $0.24 = $12.76, still above an $8 floor. A 40% discount cuts price to $19.20 and contribution to about $19.20 − $7 − $4 − $0.24 = $7.96, which fails an $8 floor. That SKU can take 25%. It cannot take 40%.

If you do not have COGS or the other inputs, stop. Do not launch “20% off sitewide” while finance looks up costs next week. The formula and the refund treatment live in contribution margin per unit. Use that page for the math. Use this page for the go or no-go.

2. Conversion and traffic

A discount is a price test, not a traffic fix. Split candidates before you launch:

  • Traffic is present and conversion is weak. The product page gets sessions, add-to-cart is low or checkout does not follow. A price test can be fair, after you confirm the page states size, materials, and shipping clearly.
  • Traffic is thin and conversion is unknown. Discounting will not create discovery. Fix collection placement or the ad first.
  • Traffic is strong and conversion is already healthy. A discount mostly rebates existing demand. Skip it unless cover is excessive and carrying cost is the real problem.

Read product conversion, not the store conversion rate. Hypothetical illustration, not an industry benchmark: a 2.4% store rate can hide a 0.6% SKU and a 5% SKU. If you need the definition and the Shopify fields, use the product conversion rate guide rather than rebuilding it here.

3. Stock cover

This cover check is a hypothetical planning method, not a published benchmark. Cover here means on-hand units available to sell, divided by that SKU’s recent daily unit sales. Then stress it with a lift you choose. If you expect the discount to raise unit sales, cover must survive that lift plus normal demand through the supplier lead time, with your safety stock left intact.

Set the pass line from your own numbers. A common way to sketch the window is lead time in days, plus safety stock in days, plus the length of the offer. Sixty or ninety days of cover is only an illustration of a long window. It is not a rule. “Under two reorder cycles” is the same kind of shorthand. Replace both with the window you just calculated for this SKU.

Hypothetical. 180 units on hand, 3 units a day baseline, so about 60 days of cover. A 50% lift for 14 days consumes 3 × 1.5 × 14 = 63 units, leaving 117. If lead time is 21 days, baseline demand in that window is 63 units, which leaves 54. That case passes only if those 54 units still cover the safety stock you already require for this SKU. A raw remainder is not a pass if it sits below that safety-stock requirement. If lead time is 45 days, baseline demand in that window is 135 units, which is more than the 117 left, so the stressed cover fails even before safety stock. Shorten the offer, move units you will not discount out of Available, or leave the SKU off the code.

Shopify’s usage limit on a discount code caps how many times the discount can be used in total, and a separate limit can cap uses per customer. Neither setting caps units. One order can still include several eligible units, and an automatic discount does not use a code redemption count the same way. Confirm both controls in Shopify’s discount settings before you rely on them.

To cap units, do not use a purchase order. A purchase order feeds Incoming inventory. It does not hold units you already have available off a live discount. Use the same inventory-state workflow in every language version of this guide.

  1. In Shopify admin, open the product, then the variant, at the location that holds the units you will not discount.
  2. Choose Adjust by, not a purchase order. Move only the units you want to hold from Available into the Unavailable state Safety stock. Leave the units you are willing to sell on the discount in Available.
  3. Confirm the result in inventory states. Those Safety stock units stay On hand at the location, but they are not available to sell, so they cannot be bought on the discount.
  4. After you deactivate the discount, move those same units back from Safety stock to Available if you still want to sell them at full price. Do not leave them in Safety stock by default, and do not delete or write them off as part of this hold.

The adjustment steps are in Shopify’s inventory adjustment flow. Shopify’s definition of Safety stock as reserved inventory that stays on hand but is not available to sell is in inventory states. You can also end the discount as soon as sold units hit the number you wrote down. Keep the code off hero variants you are not trying to clear.

What to measure after launch

Redemption count is the wrong scoreboard. A code can be “successful” because it was applied to orders that would have happened at full price. Measure incremental units and incremental contribution.

  1. Baseline units. Average daily units for that SKU over the 28 days before the offer, excluding other promotions if you can isolate them.
  2. Promo units. Units sold while the offer was live, from Shopify’s sales by product report or the discount’s order list. Net out refunds that belong to those orders.
  3. Incremental units. Promo daily rate minus baseline daily rate, times days live. A negative number means the offer did not add demand.
  4. Incremental contribution. Incremental units times post-discount contribution, minus any contribution you gave away on baseline units that also took the discount. Both contribution figures must already deduct unit COGS.
  5. Stock after. On-hand units and days of cover at the review date. If cover fell through the reorder point, the offer stole a future full-price sale.

Worked example, still hypothetical, using the same candle. The $20.76 and $12.76 contribution figures already deduct the $7 unit COGS plus the $4 of other variable costs. Baseline is 3 units a day at $20.76 contribution, or $62.28 a day. The 14-day, 25% offer sells 5 units a day at $12.76 contribution. Incremental units are (5 − 3) × 14 = 28. Those 28 units contribute 28 × $12.76 = $357. The 42 baseline-equivalent units also took the discount, so you gave away 42 × ($20.76 − $12.76) = $336. Net incremental contribution is about $21 for two weeks of operational noise. That is a stop, not a win, even though redemption looks busy.

If you cannot separate baseline demand from promo demand, say so in the review note. A before-and-after on one SKU is weaker than a holdout (same product, discount off for a slice of traffic or a matched week with no other campaign). It is still better than celebrating code uses.

A discount worked only if extra units earned more contribution than the margin you gave up on orders that would have happened anyway.

Stop, revise, or expand

Set the review before launch. Treat seven days as an example window for a fast SKU, and 14 days as an example window for many physical-product stores. Adapt both to this SKU’s sales volume and to the campaign. They are starting points, not a fixed rule. Do not let a “weekend sale” run for a month because the theme banner is still up.

Evidence at reviewDecision
Post-discount contribution below the floor, or returns jumped enough to push it underStop. Restore the price the same day. Do not “finish the week.”
Incremental units are flat or negative and cover is still highStop this offer. Try a smaller cohort, a bundle, or a collection placement change. Another 10% off is not the next test.
Incremental contribution is positive but cover will breach the reorder point inside lead timeStop, or move further units into Unavailable (Safety stock) so they cannot keep selling on the discount. Restock at full price if the baseline was already healthy. Do not reorder into a discounted price.
Incremental contribution is clearly positive and cover stays above the reorder windowYou may extend once, for the same length as the original window, on that SKU only. Then review again.
Only one variant moved, and a sister variant is now the stock riskRevise eligibility. Remove the winner variant from the code.

Stopping means deactivating the discount in Shopify admin, removing it from automatic combinations, and taking the compare-at price off the product if you used one. Leaving a compare-at price up after the code dies is a pricing claim you may not be able to support, and it can train shoppers to ignore the next badge.

A 20-minute review

  1. Open the discount and export or filter orders by that code or automatic discount.
  2. Pull units, net sales, and discounts for the eligible SKUs over the live dates and the prior 28 days.
  3. Recompute contribution with the actual discount taken and with unit COGS still deducted, not the planned percentage alone. Stacked codes often cut deeper than the brief.
  4. Check available inventory and incoming purchase orders. If incoming stock was ordered at full-price assumptions, do not expand the offer to “make the PO look smart.”
  5. Write one line: stop, revise, or extend, plus the date of the next review. If the line is extend, name the SKU. “Continue the sale” is not a decision.

Skymetrics fits this review when you want conversion, traffic, recent sales velocity, and stock cover on the same SKU before and after the code, without exporting four reports. You still supply margin, the discount actually taken, and returns. The app does not invent those costs.

Timing rules that survive a campaign calendar

Retail calendars push discounts toward holidays. That is a reason to be stricter about eligibility, not looser. November and December price cuts are crowded, and your buyer is comparing badges across tabs. A weak SKU can still earn a short offer with a unit cap you can fulfill. A hero should not join the pile just because the calendar says Black Friday.

  • Do not overlap two discounts on the same SKU unless you have modeled the stacked price. Shopify lets some discounts combine. Combination is a margin decision, not a default.
  • Do not discount a SKU in the same week you raise ad spend on it, unless the test plan says the price is the variable and the spend is held flat. Otherwise you cannot tell which change moved units.
  • Do not use a new-customer code on a SKU whose cover will not last through lead time plus the offer. You will acquire the customer and then miss the second order.
  • End the offer on a date you already put in the customer-facing copy. Extending “one more weekend” without a positive incremental-contribution note is how temporary prices become the real price.

If the honest problem is that the list price was wrong for months, stop calling it a promotion. Change the price with the method in the pricing-strategy post, tell returning customers once, and measure conversion for a full cycle. A permanent 15% code is a list-price cut with extra steps.

Put the next offer through the gate

Pick one slow SKU whose cover still clears lead time, safety stock, and the offer length after a lift you write down. Calculate post-discount contribution against your floor, with unit COGS deducted. Limit the code to that product. If you need a unit cap, move the units you will not discount from Available into Unavailable (Safety stock), then move them back to Available after you deactivate the offer if you still want to sell them at full price. Do not treat Shopify’s usage limit as that cap. Review incremental units and contribution on the date you wrote down, then stop or extend that SKU only.

If the floor fails, do not launch. Fix the cost, the return rate, or the exposure first. A cleaner ecommerce discount is the one you refuse.