Shopify discounts and sales: the complete guide
Price is the one number on your store that changes revenue, margin and conversion at the same time. On Shopify it lives in a few fields — price, compare-at price, cost per item — and in discounts layered on top of them. This guide covers how to set those numbers, how to run sales without giving away the margin, how to end sales on time, and which Shopify tools and apps do the work when the catalog is too big to edit by hand.
What “pricing and sales” covers on Shopify
Every product variant on Shopify carries three price fields, and every sale you run uses at least one of them:
- Price — what the customer pays before discounts.
- Compare-at price — the “was” price. When it is higher than the price, most themes show it crossed out and add a sale badge.
- Cost per item — what the variant costs you. Customers never see it; Shopify uses it to show margin and profit in reports.
On top of those fields sit discounts: codes customers type at checkout and automatic discounts that apply when the cart meets a rule. Shopify supports amount-off products, amount-off order, buy X get Y and free shipping discounts, each with optional start and end dates, usage limits and combination rules.
If you sell in several countries, Shopify Markets adds one more layer: price adjustments and rounding per market, so the same variant can have a different price in another currency.
Pricing work on Shopify is therefore two jobs:
- Setting the base numbers — price, compare-at and cost for every variant, and keeping them right when suppliers, costs or strategy change.
- Running promotions — temporary changes on top of the base numbers that must start on time, show correctly and end cleanly.
Most problems merchants run into come from mixing the two: a sale made by editing base prices that nobody reverts, or a cost change that never reaches the price. Keep them apart in your head and in your tools. More on strategy: Mastering your Shopify pricing strategy.
Who needs a pricing process, not just prices
A store with twenty products can change prices by hand and keep them in its head. The work changes character when one of these is true:
- The catalog is large. Hundreds of products, thousands of variants. A 5% supplier increase means thousands of edits.
- Prices follow costs. Suppliers send new price lists, shipping costs move, currencies swing.
- Sales are frequent. Weekend promotions, seasonal markdowns, clearance, Black Friday. Each one is two changes — start and end — on many products.
- Several people touch prices. Without a log, nobody knows who changed what, or what the price was before.
- You sell in several markets. Rounding and price endings differ by currency.
For these stores the question is no longer “what price?” but “how do we change prices safely, repeatedly and with a way back?” The rest of this guide answers both.
How price changes move revenue and margin
Before any strategy, do the arithmetic. A discount cuts the profit per unit much faster than it cuts the price.
Take a product that sells for 100 and costs 50: the margin is 50%, the profit per unit 50.
| Discount | Price | Profit per unit | Units needed for the same profit |
|---|---|---|---|
| 10% | 90 | 40 | 1.25× (+25%) |
| 20% | 80 | 30 | 1.67× (+67%) |
| 30% | 70 | 20 | 2.5× (+150%) |
| 40% | 60 | 10 | 5× (+400%) |
The formula: units needed = profit per unit before ÷ profit per unit during the sale. At a 30% margin, a 20% discount leaves 10 of the original 30 in profit, and you need three times the units.
The same arithmetic works in the other direction. A 5% price increase on a 30% margin product raises the profit per unit from 30 to 35 — a 17% gain — and you can lose up to 14% of the units before gross profit falls.
Three practical consequences:
- Enter cost per item for every variant. Without it, Shopify cannot show margin, and you cannot do this arithmetic per product.
- Discount depth should follow margin. A 30% sale is affordable on a 70% margin line and ruinous on a 25% one. Filter sales by margin, not just by collection.
- Small, regular price increases are usually cheaper than sales. Customers notice a 30% discount; they rarely notice that a price moved from 24.99 to 25.99.
Deeper reading: Mastering your margins: effective price testing.
Pricing strategies that work on Shopify
There is no single right method. Most stores combine a base rule with adjustments.
Cost-plus
Price = cost × markup, or cost + target margin. Simple, defensible and easy to automate: when the cost changes, the price follows. The weakness is that it ignores what customers would pay. Use it as the floor, not the answer.
On Shopify, cost-plus needs the cost per item field filled in. With it, a bulk tool can rebuild prices from cost — for example cost plus shipping, times your markup, rounded to .99.
Competitive pricing
Price against the alternatives your customer actually compares. Useful for commodity products and marketplaces; dangerous as the only rule, because it hands your margin to whoever is cheapest. Track a short list of comparable products, not the whole market.
Value-based pricing
Price from the value to the customer: what problem the product solves, how it compares to alternatives, how your brand and service add to it. It yields the highest margins and needs the most evidence — reviews, price tests, conversion data.
Psychological pricing
- Charm endings (.99, .95) read as cheaper than the next whole number. Whole numbers (40, 120) read as premium. Choose one style per brand and apply it consistently.
- Anchoring — a higher reference price makes the actual price look reasonable: a compare-at price, a premium variant, a bundle next to single items.
- Decoy and tiers — three options where the middle one is the intended choice.
More: Mastering pricing psychology.
Bundles and volume pricing
Bundles raise order value and move slow items alongside popular ones. Price the bundle below the sum of its parts but above the profit you would make on the main item alone. See Mastering product bundles on Shopify, Bundles vs kits explained.
Dynamic pricing
Prices that move with demand, stock or competitors. Useful for large catalogs with volatile demand; risky when it changes prices customers have just seen. Start with rules you can explain — “mark down 10% after 60 days without a sale” — before handing prices to an algorithm. Reading: Shopify dynamic pricing apps, AI-powered dynamic pricing on Shopify.
Price testing
Shopify has no built-in A/B test for prices, and showing different prices to different visitors at the same time can break consumer law in some countries. The safe form of testing is sequential: change the price for a defined period, compare conversion and profit with the period before, and keep a record. Guides: Price testing for your Shopify store.
Three ways to run a sale on Shopify
The tool you choose decides what customers see, what you can measure and how hard the sale is to end.
| Compare-at price | Automatic discount | Discount code | |
|---|---|---|---|
| Customer sees the sale on product and collection pages | Yes, crossed-out price and badge (theme-dependent) | Usually only in cart and checkout | Only after entering the code |
| Who gets it | Everyone | Everyone whose cart meets the rule | Whoever has the code |
| Start and end dates in Shopify | No — prices stay until changed | Yes | Yes |
| Shows in reports as a discount | No — it is simply a lower price | Yes | Yes, per code |
| Best for | Storewide or collection sales that must be visible while browsing | Buy X get Y, spend thresholds, free shipping | Campaigns, influencers, email subscribers, win-back |
Compare-at sales
The classic sale: move the current price into the compare-at field, lower the price, and the theme shows the reduction everywhere. It is the most visible format and the only one that changes the price in Google Shopping feeds and on collection grids.
Its weakness is that Shopify treats it as a permanent price change. There is no end date: the sale lasts until somebody changes every price back. That is where most sale mistakes come from — forgotten reverts, compare-at prices left behind after the price went back up, and “sales” that run for months.
Automatic discounts
Automatic discounts apply by rule, without a code: 15% off a collection, buy two get one, free shipping above an amount. They have native start and end dates, so they end on time by themselves. The trade-off is visibility: by default the reduced price appears in the cart and checkout, not on the product grid, so customers browsing a collection may not know there is a sale. Check how your theme displays them before relying on them for a storewide event.
Discount codes
Codes are for targeted offers: a welcome discount for new subscribers, a code for an influencer’s audience, a win-back offer by email. Every use is tracked per code, which makes them the easiest format to measure. A welcome code shown in an email signup popup is one of the most common ways stores grow a mailing list — the Email & popups guides cover that side.
Guides on discounts: Mastering Shopify discounts, Strategic guide to Shopify coupons, Flash sales vs evergreen discounts.
Planning the sales calendar
Sales work best as a calendar decided in advance, not as reactions to a slow week.
- Seasonal markdowns — end-of-season stock in fashion, outdoor, garden. Plan the markdown steps (for example 20%, then 40%) and the dates before the season starts.
- Peak events — Black Friday, Cyber Monday, holiday shopping, local events. Decide products, depth and dates weeks ahead, and prepare the change so it goes live at a set time. Reading: Preparing your Shopify store for the holiday rush.
- Flash sales — short, sharp, one collection, 24–72 hours. Their power comes from the deadline, so they must actually end. Reading: Mastering flash sales on Shopify.
- Clearance — slow movers and discontinued lines. Price to clear, not to profit, and remove them from full-price collections so they do not cheapen the rest.
- Evergreen offers — a welcome discount, free shipping above a threshold. These live in discounts, not in product prices.
For each sale write down four things before you start: which products (as a filter, not a list you will forget), how deep, when it starts, when it ends. If you cannot answer the last one, you are not running a sale — you are cutting prices.
Running a sale step by step
Whatever tool you use, a clean compare-at sale has the same steps.
- Define the products by rule. A collection, a tag, a vendor, a price range, stock above a level. Rules are reusable; hand-picked lists are not.
- Check the margin. Filter out products where the discount would push the price below cost plus shipping.
- Record the current prices. Export a CSV, or use a tool that logs old values and can revert them.
- Set the compare-at price to the current price for every product in the sale, so the crossed-out price is the real former price.
- Lower the price by the percentage or amount.
- Round to your price ending in the same step.
- Preview a sample of products before saving: price, compare-at, how the theme shows the badge.
- Schedule or note the end. Set a revert time if your tool has one, or put the end in the calendar with the CSV next to it.
- After the sale, restore the price and clear the compare-at price. Both, or the product keeps a misleading “was” price.
- Measure units, revenue and gross profit against the same period before.
Steps 3, 8 and 9 are where sales fail. They are also the steps tools can do for you.
Doing it in Shopify: native tools and where they stop
The bulk editor in the admin
Select products in the admin, choose Bulk edit, and Shopify opens a spreadsheet view where you can type prices, compare-at prices and costs. It is fine for dozens of rows. For hundreds it is slow, it cannot apply “minus 20% and round to .99” as a formula, and it keeps no history of the old values.
CSV export and import
Export products, change the price columns in a spreadsheet, import with “overwrite existing products”. It reaches every product and handles any formula your spreadsheet can. The costs: you see the result only after the import, a shifted column can overwrite the wrong field across the catalog, and the only undo is to keep the original export and import it again — which also overwrites anything changed in between.
Discounts with dates
The native way to make something end on time. Use them for offers that do not need to show on the product grid.
Shopify Flow
Flow automates rules across Shopify — tag a product when stock falls, send an alert, run an action on a schedule. Combined with apps that expose Flow actions, it can start pricing tasks on events or schedules.
Launchpad (Shopify Plus)
Plus stores can schedule sales, theme changes and discounts for an event and roll them back afterwards. If you are on Plus, it is the native answer to scheduled sales.
Where apps come in
Bulk pricing apps fill the gaps between these tools: price formulas applied to filtered products, rounding, a preview before anything is saved, a start and end time for sales, and a history to revert from. The comparison:
| Need | Bulk editor | CSV | Discounts | Bulk pricing app |
|---|---|---|---|---|
| Change hundreds of prices by a formula | Manual | Yes, in a spreadsheet | — | Yes |
| Select products by rule (collection, tag, vendor, price, stock) | Admin filters, then manual | Export filters, then spreadsheet | Collection or product lists | Yes |
| See the result before saving | Yes, row by row | No | — | Yes, preview |
| Start and end on a schedule | No | No | Yes | Yes |
| Undo | No | Re-import the old file | Disable the discount | Revert the task |
| Visible on product and collection pages | Yes | Yes | Usually cart only | Yes (compare-at) |
How Bulk Product Edit handles pricing
We build Bulk Product Edit, so here is exactly what it does for pricing — no more.
- Filters by collection, vendor, product type, tag, price, stock and option value, on products or on variants, matching all filters or any of them. You can untick single rows in the preview.
- Price changes by percent or fixed amount, based on the price or the compare-at price; set an exact price; copy the price into compare-at, or swap the two; build the price from cost plus a markup.
- Rounding to .99 or to a multiple such as 0.05 or 5, up, down or to the nearest value, in the same task.
- Schedule a task with a start time and a revert time: prices go to sale at the start and back afterwards.
- Recurring tasks on chosen weekdays and times; each run can revert itself after a set number of hours.
- EU prior price on the Pro plan: set the compare-at price to the lowest price of the last N days.
- History and revert for finished tasks, and logs showing what changed, what was skipped and why.
The free plan runs the filters and nearly every edit on up to 10 records per task; scheduling starts on the Starter plan, and paid plans go from 2,000 to 100,000 records per task. Details and plans on the Bulk Product Edit page, and step-by-step guides with screenshots on bulkproductedits.com.
Pitfalls that cost money
- Sales that never end. The most common one. A compare-at sale has no end date in Shopify; schedule the revert or use a discount with an end date.
- Orphaned compare-at prices. The price went back up, the compare-at stayed, and the product now shows a “sale” at full price — or a compare-at lower than the price, which most themes simply hide.
- Discounting below cost. Percentage cuts on low-margin products. Filter by margin before the sale.
- Stacking. A compare-at sale plus an automatic discount plus a welcome code. Check combination settings for every discount before a big event.
- Inconsistent endings. Percentage changes produce 37.43; mix that with 39.99 and the catalog looks careless.
- Multi-currency surprises. A sale price that ends in .99 in one currency may convert to an odd number in another. Check market rounding settings.
- Feeds and ads out of sync. Google Shopping reads the price and compare-at price; if the sale ends on the site but the feed has not updated, ads show the wrong price. Allow time for feeds to refresh.
- No record. Without old values or a log, you cannot reverse a mistake or tell what a sale did.
Pricing law in brief
This is not legal advice, but every store that shows reductions should know the basics.
- EU (Omnibus directive): when you announce a price reduction, the reference price must be the lowest price you applied in the 30 days before the reduction. A product raised before a sale to make the discount look bigger fails this test.
- United States: the FTC’s guides against deceptive pricing say a former price must be one at which the product was openly and actively offered, in good faith, for a reasonable period. State laws add their own rules.
- United Kingdom: the Digital Markets, Competition and Consumers Act and the CMA’s guidance on price reductions prohibit misleading reference prices.
- Everywhere: drip pricing (adding unavoidable fees late in checkout) and fake countdowns are under growing scrutiny.
Practical rule: the compare-at price must be a price you really charged recently. Reading: Legal and ethical pricing guidelines for Shopify merchants, Avoiding predatory pricing.
Measuring a price change or a sale
Judge every change on gross profit, not revenue.
- Before you start, note units, revenue and gross profit for the products involved over a comparable period.
- During and after, compare the same numbers. Shopify’s sales reports by product show units and revenue; profit reports need cost per item filled in.
- Sell-through for clearance: share of stock sold during the sale.
- Order value and attachment for bundles and upsells: did customers add more, or just pay less for the same?
- After-effects: a deep sale can pull demand forward and leave the following weeks flat. Look at the four weeks after, too.
Write each result down with the depth, dates and products. After a few sales you will know which depth moves which lines — and which ones sell just as well at full price. Reading on raising order value: Boosting AOV with upsell tactics, Cross-selling guide, Gift wrapping upsell ideas.
Setups merchants run
These are the pricing jobs we see most often in support, written as a recipe you can copy.
A weekend sale that ends itself. Filter the collection, copy the price to compare-at, cut 20%, round to .99, set the revert time to Monday 00:00. Customers see the crossed-out price all weekend; on Monday every price and compare-at value is back.
A supplier price increase. Filter by vendor, raise the price by the supplier’s percentage, round to .99, preview, run. If the supplier changes their mind, revert the task.
Margin repair. Fill in cost per item, then rebuild prices from cost plus shipping with your markup for the products whose margin has slipped.
End-of-season markdown in two steps. Week one: 20% off the season’s tag with compare-at set. Week three: a second task to 40% for what is left. End of season: revert both, or move what remains to clearance.
Black Friday prepared in advance. Build the tasks for each collection a week ahead, schedule the start for the event and the revert for the morning after Cyber Monday, and check the preview while there is still time to fix it.
All pricing and sales guides
Strategy: Shopify pricing strategy guide · Pricing for peak profitability · Blueprint for Shopify pricing
Testing and dynamic pricing: Price optimization and testing · Dynamic pricing app recommendations · AI dynamic pricing
Discounts and sales: Shopify discounts guide · Flash sales · Holiday preparation guide · Holiday season success
Bundles, upsells and order value: Bundles for sales growth · Upsell strategies for AOV · Cross-sell and upsell apps · Subscription upsells
Law and ethics: Pricing law and ethics
Frequently asked questions
What is the compare-at price in Shopify?
It is the “was” price. When the compare-at price is higher than the price, most themes show the old price crossed out next to the new one and a sale badge. Remove the compare-at price, or set it equal to the price, and the sale display disappears.
Should I use discount codes or compare-at prices for a sale?
Use compare-at prices when every visitor should see the sale on product and collection pages. Use automatic discounts or codes when the offer depends on the cart, the customer or a campaign, or when you want to see exactly which orders used it.
Can Shopify schedule a price change?
Discounts have native start and end dates. Changing the price and compare-at price itself on a schedule needs Shopify Plus (Launchpad), Shopify Flow with a scheduled trigger, or an app such as Bulk Product Edit with a start and revert time.
How much more do I need to sell to keep my profit during a sale?
Divide the profit per unit before the sale by the profit per unit during it. A product with a 50% margin discounted by 20% earns 30 instead of 50 per 100 of list price, so you need 50 / 30 = 1.67 times the units — 67% more — to make the same gross profit.
How do I end a Shopify sale without editing every product?
Before the sale, keep a way back: a CSV export of the old prices, a scheduled revert time in an app, or a discount with an end date. After the sale, put the price back and clear the compare-at price in one bulk task rather than product by product.
Is it legal to show a crossed-out price?
Only if the crossed-out price is real. In the EU, a price reduction must be shown against the lowest price of the previous 30 days. In the US, the FTC guides treat a former price as deceptive unless the product was actually offered at it for a reasonable time. Check the rules of every country you sell to.
How should I round prices after a percentage change?
Pick one ending and apply it to every changed price: .99 or .95 for consumer goods, whole numbers for premium products. Percentage changes produce prices like 37.43; rounding in the same task as the change keeps the catalog consistent.











