The short version
To put a product on sale, enter the new price in Price and the old price in Compare-at price, then click Save.
Shoppers can then see both prices on product and collection pages, while checkout shows only the sale price.
An automatic discount with an end date stops by itself, but shoppers see its saving only in the cart and at checkout unless you add an app or a custom build.
To end a compare-at sale, put Price back and clear Compare-at price rather than entering $0.00, and export the old prices to a CSV before you start.
The Quick Verdict
Find your situation; the sections below hold the steps and what each route leaves behind.
Which way to run the sale, by situation
| Your situation | Pick | Why |
|---|---|---|
| Shoppers should see the old price crossed out before the cart | Compare-at price | Both prices can show on product and collection pages; you end it by hand |
| The sale must switch off by itself, and savings at checkout are enough | Automatic discount with an end date | Checkout always crosses out discount savings; product pages need an app or a custom build for that |
| Crossed-out prices and a fixed end, on Basic or higher | Catalog in a Rollouts Event | A market's catalog, saved as Draft and set to Active in the Event, carries its own compare-at prices and goes back to Draft at the end date; first confirm your market can take one |
| You are on Plus and run dated sale events | Launchpad | It changes prices at the start and end of an event |
| Discount rules with crossed-out prices on product pages | A third-party discount app or a custom build | Shopify's sale-pricing help names these two routes |
What Does Each Sale Method Show the Shopper?
Key takeaway
Shopify gives you two ways to lower a price, and they look different to a shopper well before checkout. A compare-at price is a display field on the product: Price holds what the shopper pays and Compare-at price holds the old value. An automatic discount takes money off in the cart and at checkout, and the product keeps its regular price on the page.
Compare-at price and automatic discount, side by side
| What you are checking | Compare-at price | Automatic discount |
|---|---|---|
| Product and collection pages | Both prices can show: the sale price and the crossed-out old price. | The regular price. Crossed-out savings here need a third-party discount app or a custom build. |
| Checkout | Only the sale price. | Savings always show with a crossed-out price. The discount also applies in the cart. |
| Its own end date | You end it by editing the fields, or you use a scheduled route below. | Yes: click Set end date in the discount. |
| Who runs the display | Your theme decides whether sale prices show on the storefront, and where. | Checkout shows it on its own; product and collection pages need an app or custom build. |
| Discounts in reports | Not part of it. Shopify's finances report says discounts aren't related to compare-at prices. | Reported. Sales by discount codes groups sales under the automatic discount's name. |
| POS | Product details show the compare-at price, and a printed receipt can show or hide it. | Applies on POS only where you turn it on in the discount, for POS Pro locations. |
Shopify Help Center pages on sale pricing, discounts, sales and finances reports, POS product details and printed receipts, read November 2026.
Your theme runs the compare-at side. It controls whether sale prices show on your storefront and where, as Shopify's sale-pricing page puts it. It doesn't control how they appear on AI channels such as ChatGPT and Microsoft Copilot, which find products through Shopify Catalog.
If you want a discount's saving crossed out before the cart, the same page names two routes:
To display savings from discounts with crossed-out (strikethrough) prices on product pages and collection pages, you need to use a third-party discount app, or hire a Shopify Partner to build a custom solution for you.
Which Route Fits Your Sale?
The verdict at the top answers by what the shopper should see. This quiz answers by combination: your plan, the display you want, how the sale ends, your markets and how many products are involved. It returns one route, with its tool, its setup and how it ends.
Which sale route fits your store?Five questions, then a tool, a setup and a way to end the sale.
How to Set a Sale Price on One Product
Key takeaway
- From your Shopify admin, go to Products.
- Click the product that you want to edit.
- To edit a variant, go through the Variants section, as described under Products with variants.
- In the Price section, click Compare at, enter the original price in Compare-at price, and enter the new price in Price.
- Click Save.
- Products
- Product
Here is the worked example, taken from Shopify's own help page: you sell seasonal t-shirts for $30 and put last season's designs on sale for $10. Price becomes $10, Compare-at price becomes $30, and your theme shows both alongside a sale badge. When the sale ends, the same t-shirt goes back to Price $30 with an empty Compare-at field, as covered under ending a sale.
Filled in both fields and still see no crossed-out price? Start with why the compare-at price isn't showing.
Products with variants
Key takeaway
Shopify's help sends you from the Variants section, through a link it writes as XX variants, to the variant, where the same Compare at control sits in the Price section. In the admin state shown below, the table on the product page has a Price column but no Compare-at column, so the old price goes in on the variant's own page, or in the bulk editor for several variants at once.
This step may look different on your store. As of November 2026, Shopify's changelog says variant management now lives in the product page, with Plus stores to be opted in automatically on December 12, 2026 and the rollout to all merchants to begin gradually in December.
- Products
- Product
- Variants
- Products
- Product
- Variant
Consistency matters more than it looks, because a collection card shows what applies to all of a product's variants. Shopify's help spells out the failure:
If some variants have compare-at prices that are inconsistent (such as some variants having a compare-at price of $0.00 USD, or some being empty, or different values across variants), then the collection page won't display the product as being on sale, even if individual variants are.
The video below is a third-party demonstration from Ecommerce TV by Nick, published in 2022, so its screens are older than the ones above. It shows the same rule for Price and Compare-at price, but its description ends a sale by setting Compare-at price to 0; clear the field instead, as covered under ending a sale.
For adding options, or editing many variants together, see our product variants guide.
What to enter as the old price
Key takeaway
A compare-at price tells shoppers the product used to cost more, so the number has to be true. The FTC's pricing guides describe the false version:
If, on the other hand, the former price being advertised is not bona fide but fictitious—for example, where an artificial, inflated price was established for the purpose of enabling the subsequent offer of a large reduction—the “bargain” being advertised is a false one; the purchaser is not receiving the unusual value he expects.
Two sets of rules are worth checking before you fill in the field. This is a starting point rather than legal advice, so check the rules in each place you sell:
- United States. The same FTC guides say a former price is a legitimate basis for a comparison when it is the actual, bona fide price at which the article was offered to the public on a regular basis for a reasonably substantial period of time.
- European Union. An announced price reduction must indicate the prior price, meaning the lowest price you applied during a period not shorter than 30 days before the reduction; member states can set different rules for goods that deteriorate or expire rapidly, allow a shorter period for products on the market for less than 30 days, and, when a reduction is progressively increased, take the prior price as the price before the first reduction. Shopify's steps for a primary market in the EEA tell you to enter that lowest price in the Compare-at price field.
The same Shopify page says that if you offer price reductions more than once every 30 days, you should consider editing your theme to add a statement on each discounted product page, showing both the regular selling price and the lowest prior price. Shopify links that step to its theme editor help, and the same page describes metafields as another way to display the lowest prior price.
Planning the old prices for a Black Friday sale? The BFCM checklist covers what to check before you show a “was” price.
How to Mark Down Many Products at Once
Key takeaway
Start with an export. Before you touch a price, export the products going on sale to a CSV (Products > Export) and keep that file: it is your record of what every price goes back to. Then use the bulk editor:
- From Products, use the checkboxes to select the products, then click Bulk edit.
- Click Columns and select the compare-at price property if it isn't in the table.
- Type the new price in the price column, labelled Base price in the frame below and price in Shopify's help, and the old price under Compare-at price.
- Click Save. If errors appear, fix them and click Save again.
- Products
- Bulk edit
Choosing the products and the columns is covered in depth in how to use the bulk editor.
For a permanent price change rather than a sale, including a rise by a percentage, see how to change prices in bulk.
Using a CSV
Key takeaway
In a Product CSV, the Compare-at price column takes the original price of the variant, as a monetary value without a currency symbol. The new price goes in Price.
To import, go to Products, click Import, then Add file. In our test admin as of November 9, 2026, Overwrite products with matching handles appeared in the dialog only after we chose the file. Without that option, products whose handle matches an existing product are ignored during the import. With it selected, a blank in any non-required column overwrites the matching value as blank.
- Products
- Import
Before you run that import, read what an Overwrite import replaces.
Can Shopify Start and End a Sale on Its Own?
Key takeaway
Three routes carry documented dates, and they differ in what they move and what comes back at the end. Read the last column first: it decides how much cleaning up you still do.
Routes that start and stop a sale
| Route | Plan | What it schedules | What happens at the end |
|---|---|---|---|
| Automatic discount with an end date | On POS, only where you turn it on in the discount, for POS Pro locations | The discount's own start and end dates | The discount stops on its end date. |
| Rollouts Event with a discount change | Basic or higher | Activates or deactivates discounts you already created, for customers in the rollout | The change rolls back. The discount also keeps its own active dates, which apply independently. |
| Rollouts Event with a catalog change | Basic or higher | Sets a catalog to Active or Draft, which publishes or withdraws its prices and product availability | The catalog goes back to the status saved on it, so a catalog saved as Draft is withdrawn and one saved as Active stays published. Its current prices apply, not a copy from the start. POS and feeds return on their next sync. |
| Launchpad | Plus only | Changes product pricing at the start and end of an event | Regular and compare-at prices change back to their values before the event. |
Shopify Help Center pages on amount off discounts, rollout types, rollout requirements and Launchpad, read November 2026.
One Shopify page reaches further, and it disagrees with another on whether a CSV can schedule a price. Shopify's overview of determining pricing, read November 9, 2026, lists “scheduling price changes for future dates” under CSV import and export and gives no steps. The CSV reference we read lists no date column, as of November 9, 2026.
While those two disagree, don't plan a sale around a dated CSV. Use a route from the table, or run the import yourself on the day the sale starts.
Automatic discount with an end date
Key takeaway
- From your Shopify admin, go to Discounts and click Create discount.
- Choose Amount off products or Amount off orders.
- Under Method, select Automatic discount, then enter a title.
- Enter the discount value and, for amount off products, choose the products or collections under Applies to.
- Optional: to offer the discount at your retail locations, select the option Shopify's help calls Also offer on Point of Sale (POS Pro locations only).
- In Schedule, which Shopify's help page calls Active dates, set the start date, click Set end date and choose when the discount ends.
- Click Save.
- Discounts
- Create discount
- Amount off products
Automatic discounts apply on all the sales channels you have set up except POS, where you turn them on in the discount, and only for locations with a POS Pro subscription.
The same form sets minimums and combinations, and our discounts guide covers every discount type and what each does to your margin.
A Rollouts Event
Key takeaway
A rollout is a scheduled set of changes, and rollouts are available on the Basic plan or higher. Of the 3 rollout types, the Event is the one for a sale: it publishes your changes for a set period, rolls them back when the rollout ends, and requires an end date.
Pick the type on purpose. A Launch applies its changes permanently at the scheduled time and can't be reverted after it ends, and the third type, Experiment, needs Grow or higher.
- Markets
- Rollouts
- Create rollout
A discount change activates or deactivates discounts that already exist, so create the discount first. One rollout can hold up to 250 discounts, and a discount can be part of only one unended rollout at a time. Shopify's help says a rollout's eligible markets are determined by the changes you add, so you can't select them, and a catalog change reaches the markets its catalog is assigned to; the same page lets you apply theme edits to specific markets if you have more than one. Shopify's March 2026 changelog post puts market-specific targeting of a rollout on Advanced and Plus, without saying whether that covers discount or catalog changes.
For crossed-out prices on a schedule, use a catalog change instead. A market's catalog can carry its own Compare-at price per product. Its Price adjustment also moves compare-at prices by default, so toggle off Include compare-at price when you want to type the old prices yourself.
- Markets
- Catalogs
- Your catalog
Four things decide whether that catalog does what you expect:
- It needs a market. A rollout's catalog change isn't displayed to any customers until the catalog is assigned to at least one market. Shopify's help says Markets doesn't use a primary market: your home country or region sits in a domestic market that Shopify creates with the store, and a catalog is assigned to a market. Before you build on this route, open a new catalog, click Add a market and confirm your market is listed.
- It is saved as Draft. When an Event ends, the catalog uses the status that's saved on it. A catalog saved as Active publishes its prices as soon as you save it and stays published after the Event, so save it as Draft and let the Event set it to Active.
- It needs 100% of visitors to reach other channels. A rollout that publishes catalog changes to 100% of visitors updates your online store and, depending on the catalog's markets and sales channels, places such as POS and Google.
- It doesn't restore a copy. A rollout changes only whether the catalog is active or draft, and edits you make while it runs stay in place.
A seasonal sale is the use Shopify itself gives for this type:
You can create an Event for a time-sensitive change, such as a seasonal sale.
Running a Black Friday campaign, with a theme change in the same rollout? The BFCM checklist covers that in how to schedule the whole sale.
Launchpad, on Plus only
Key takeaway
Launchpad is available only to stores on Shopify Plus. Its considerations page holds four points that change how you plan the sale:
- Compare-at during the event. If your products have compare-at prices, those values change to the regular, pre-sale prices for the duration of the event. Both prices change back when it ends.
- Percentages. All percentage discounts in an event apply to the regular prices of a product, not the compare-at prices.
- Discount codes. Customers can use discount codes during a Launchpad event, so stacking is yours to plan for.
- Edits during the event. If you edit a product's price during an event, it returns to its pre-event price when the event ends, and you can't edit the event's details after it starts.
How to Show the Sale in Your Store
Key takeaway
Prices alone don't lead anyone to a sale. On Basic or higher, build the collection first, because the banner and the menu item both point at it.
A Sale collection that fills itself
Key takeaway
Collections aren't part of the Starter plan, so this step needs Basic or higher.
- From your Shopify admin, go to Products > Collections, click Add collection and add a title.
- In the default Products source, click Add condition.
- Select Compare at price, then the operator is set.
- Read the products listed in the preview, then click Save.
- Products
- Collections
- Add collection
Shopify's conditions page explains who gets in. For is set, its table says all variants must have a compare-at value, including 0, while another passage of the same page says to set $0.00 to exclude a product. A product with an empty compare-at value on any variant doesn't match is set, so clearing the field is the reliable way out.
If you mark down only some variants, is greater than 0 is the operator to try. Shopify's general rule for a Products source is that a condition is true if any variant matches, so a product with some variants marked down should qualify. Whether a variant at $0.00 counts is less clear: the conditions page's troubleshooting notes name is greater than 0.00 for finding products with a compare-at price set and say that includes zero, so read the preview before you rely on it.
The Sale badge in Horizon
Key takeaway
You don't place the badge by hand. Shopify's theme settings page says Sale badges are automatically added to your product images when you reduce the price. In the product card code of Horizon, version 4.4.0 as of November 9, 2026, the test is product.compare_at_price > product.price, which an automatic discount doesn't change.
Other themes can differ: the sale-pricing page only says your theme might add a badge with a message or percentage off to product listing and collection pages.
- Online Store
- Themes
- Customize
- Theme settings
- Badges
Position and shape sit in the same panel, and our Sold out badge answer covers those controls.
Banner and menu
Point shoppers at the collection with an announcement bar and a menu item: menu items are links to, among other things, collections, so the Sale collection can have its own entry.
What Else a Sale Touches
Key takeaway
None of these four needs a separate project, but each one can make a correct price look wrong somewhere you weren't watching.
Discount codes on top
A discount code can apply on top of a sale price, and Shopify's developer changelog lists preventing double discounting on sale prices among the uses of discount code rejection in Discount Function apps. No Help Center page we read offers an exclude-sale toggle, so if you don't want a code stacking, aim it at a collection without sale items.
Other markets and the EEA
Key takeaway
A market with fixed prices ignores what you enter on the product: fixed prices override prices and compare-at prices set in your Shopify admin. That market needs its own compare-at prices, in its catalog or by product CSV; in a product CSV, a fixed compare-at price needs a fixed price in that market. Shopify's sale-pricing page says fixed sale prices can't be created in the admin, while its catalogs page lets you set a Compare-at price per product in a catalog.
For the EEA, Shopify's own page disagrees with itself on what shoppers see when your primary market is outside the EEA. In one section of its Pricing Indication Directive page, read November 9, 2026, compare-at prices for those customers are “displayed by default”. In a later section of the same page, read the same day, they are “hidden by default”, and a 2022 changelog post also says they are no longer shown to EEA markets.
Don't assume either: read your own setting. In Markets, open a market that contains an EEA country, then under More Settings click Compare-at price and see whether Hide compare-at is selected. Do this for each such market.
If your primary market is in the EEA, the same page says the feature is always displayed, although Shopify's Markets help says Markets doesn't use a primary market, so read the setting either way.
- Markets
- Your EEA market
- Compare-at price
Google listings and feeds
Key takeaway
Google applies its own conditions before it shows a struck-through original price, and they read from your feed and your page rather than from your intentions:
What Google checks before it crosses out a price
| Condition | What Google asks | Who it applies to |
|---|---|---|
| Size of the discount | Greater than 5% and less than 90% | Strikethrough annotations on Google; meeting it doesn't guarantee the display |
| Base price history, listed countries | Valid for 30 days within the past 200 days, not necessarily consecutive | Countries named on Google's page |
| Base price history, US | 5 days within the past 30 days or 15 days within the past 200 days, whichever is met first, not necessarily consecutive | US Shopping ads; free listings in the US have no history condition |
| Original price on your page | Less prominent than the sale price: struck through, grayed out or otherwise shown as not currently active | Strikethrough annotations on Google |
| Sale price and dates | Matches what your landing page and checkout show; a wrong start date or time zone shows an incorrect price | Products sent with a sale price |
Google Merchant Center Help pages on sale price annotations and the sale price attribute, read November 2026.
A price mismatch between your landing page and your data source may get the product disapproved. A scheduled sale adds one more gap: in an Experiment, or a rollout to less than 100% of visitors, your online store can display different prices than Google. Our Google Shopping guide covers the channel itself.
POS and reports
Key takeaway
- POS product details. The details of a product on POS include the compare-at price, if applicable.
- Printed receipts. Compare-at product price is among the line item details you can display or hide.
- Automatic discounts at the register. Shopify's discount channel help says they apply on POS only if you turn that on in the discount, and only for locations with a POS Pro subscription.
- The Discounts line. The sales report says discounts are created using discount codes, not the compare-at price, and the finances report says they aren't related to compare-at prices. Sales by discount codes groups sales by the discount's name, including an automatic discount's.
- Gross sales. Shopify defines it as product price times quantity. Our reading is that a compare-at sale shows up there as a lower number, with nothing on the Discounts line.
- Margin on a discount. In Shopify's separate example, a T-shirt with a $20 regular price and a $10 cost shows a 50% margin on the product page, and sold at $15 after a 25% discount it shows a 33% margin in the Gross profit by product report. That example is about discounts, so don't assume a compare-at sale reads the same way.
- A report field for compare-at. Product variant compare at price holds the compare-at price of the variant at the time of its sale. In our test admin on November 9, 2026, the report editor listed it under Dimensions rather than metrics.
- Analytics
- Reports
- New exploration
For the same Dimensions menu with another product attribute, see how to filter or group reports by product tags.
How to End a Sale With Nothing Left Behind
Key takeaway
Forgetting this part is the most visible mistake a sale can leave: the crossed-out price stays up for everyone. Start by finding your route:
What ends by itself and what stays with you
| Route | What ends by itself | What stays with you |
|---|---|---|
| Compare-at on the product | The fields stay as you set them. | Put Price back, clear Compare-at price, take the banner down. |
| Automatic discount with an end date | The discount, on its end date. | Take the banner down and decide about the menu item. |
| Rollouts Event | The discount or catalog change rolls back at the end date, and the catalog then uses the status saved on it: one saved as Draft is withdrawn, one saved as Active stays published. | Allow for the next sync: until then POS and feeds can still display the published prices. Catalog edits made during the rollout stay in place. |
| Launchpad | Regular and compare-at prices change back. | Handle discount codes yourself: Launchpad doesn't deactivate them. Take the banner down. |
Shopify Help Center pages on rollout requirements, Launchpad and sale pricing, read November 2026.
For a compare-at sale, the job has four steps, on the product page, in the bulk editor or by CSV:
- Open the CSV you exported before the sale and find the old prices.
- Enter the old value in Price.
- Clear Compare-at price so the field is empty, on every variant.
- Click Save, and open the product and its collection to check.
- Products
- Product
For a long list, open the bulk editor again, put the old values back in the price column and clear Compare-at price. Or import the old prices with Overwrite selected and Compare-at price blank, after reading the CSV section.
Shopify's pages pull in two directions here. The sale-pricing page, read November 9, 2026, says a compare-at price of $0.00 USD isn't the same as an empty one and tells you to clear the field for variants that shouldn't display it.
The conditions page, read the same day, says to set $0.00 to exclude a product from collections that use is set, while its own table says the is set value can be 0.
Clear the field. An empty value isn't recognized by compare-at conditions, so the product leaves the Sale collection, and you aren't relying on either reading of $0.00.
The same t-shirt now reads Price $30 with an empty Compare-at field. Then go through what surrounded the sale: in Horizon the badge goes with the compare-at price, and an emptied product drops out of a collection built on is set. Take the banner down.
Think before deleting the collection. Shopify's menu help warns that if you delete a collection used for an On sale menu item, both the collection and the menu item are deleted. Remove the menu item first, or keep the collection for the next sale.
If you sell through Google, check the listing too, since your feed and landing page have to agree again.
Run the Sale, Start to Finish
Key takeaway
Steps 2 and 8 are the ones that hurt when skipped, because without them nothing tells you what the prices were or that the sale is still running. On an automatic discount, step 3 means creating the discount and step 8 shrinks to the banner and menu item.
Step 5 changes too: with no compare-at values the condition finds nothing, so link the banner to the collection the discount applies to.
Shopify sale checklistTick each step as you finish it; your progress stays in this browser.
Shopify sale checklist
Tick each step as you finish it; your progress stays in this browser.
Decide between a compare-at price, an automatic discount, a Rollouts Event and Launchpad from what shoppers should see and how the sale ends.
Before you tick this off
- I know whether shoppers must see the old price before the cart
- I know my plan, and which scheduled routes it opens
- I know whether any market uses fixed prices
Export the products to a CSV before you change a single price, and keep the file until the sale is over.
Before you tick this off
- The export holds every product going on sale
- The file is saved somewhere I will find it on the last day
Enter Price and Compare-at price on the product, in the bulk editor or in a CSV imported with Overwrite selected, or create the automatic discount with its dates.
Before you tick this off
- Every Compare-at price is higher than its Price
- Variants of one product carry consistent compare-at values
- The discount or rollout shows the right start and end dates
- A catalog going into a Rollouts Event is saved as Draft
Confirm that each old price is a genuine former price, one you actually offered, and check it against the rules in each place you sell.
Before you tick this off
- I can point to when each old price was actually offered
- For EEA sales, I checked my lowest price over at least the previous 30 days
On Basic or higher, create a collection with the condition Compare at price is set, and read which products the preview shows.
Before you tick this off
- Products I expected appear in the preview
- Any product missing has an empty variant I now understand
Open one sale product as a shopper would, and follow it from its collection card to checkout.
Before you tick this off
- The crossed-out price and the Sale badge show where the route says they should
- Checkout shows the price I expected
- If a market has fixed prices, I previewed that market too
Point shoppers at the sale with an announcement bar and a menu item that links to the Sale collection.
Before you tick this off
- The banner links to the Sale collection
- The menu item opens the collection on mobile too
Put Price back, clear Compare-at price, take the banner down, and check the collection and your feeds.
Before you tick this off
- Compare-at price is empty, not $0.00, on every variant
- The Sale collection no longer lists these products
- The banner is gone, and the menu item is removed or kept on purpose
- My feed shows the restored prices after its next sync
The Bottom Line
Key takeaway
Filling in the two fields is the quick part. Most of the work on this page sits on either side of it: choosing the route that shows what you want, and getting back to clean prices afterwards.
Frequently Asked Questions
Front-end developer specializing in Shopify since 2017. Experienced in building custom Liquid themes, optimizing storefront performance, and integrating third-party apps. Directs the editorial process behind Ecom Store Pro: sets its topics and the rules every AI-written page must pass before publication.
This page was written by AI. Separate AI agents that did not write it check its figures and claims against official sources and test its links and interactive tools. A human editor sets the site's editorial direction, topics and rules and checks that pages are complete and display correctly, but does not check their facts or edit their text. Details may change — always confirm critical data at shopify.com.
Editorial PolicySome links in this article are affiliate links. If you sign up for a Shopify store through these links, we may earn a commission at no extra cost to you. Read our full advertising policy.
