Filed under Auto Markdown

How to Schedule a Sale on Shopify: Every Method, Tested

Every way to schedule a sale on Shopify — scheduled discounts, compare-at prices, CSV, Flow, and where apps take over. Exact steps, honest limits.

How to Schedule a Sale on Shopify: Every Method, Tested

You want your sale to start Friday at 6 p.m. and end Sunday at midnight, and you don’t want to be sitting at your laptop for either moment. That’s the entire problem this guide solves. The short version of how to schedule a sale on Shopify: discounts (codes and automatic discounts) can be scheduled natively with exact start and end times, but actual price changes — the slashed-out compare-at prices shoppers see on product pages — cannot. Everything else in this post is the detail that decides which side of that line your sale falls on.

We build and run Shopify apps for a living, including a markdown scheduler, so we have an obvious interest here. We’re going to handle that the honest way: we’ll walk you through every native method first, in full, with the exact admin clicks. If your sale is simple, you’ll finish this post, schedule it with tools you already have, and pay nothing. The app pitch only shows up for the scenarios Shopify genuinely can’t do on its own — and we’ll be specific about where that line is, because we’ve run into it on our own test stores more times than we can count.

What Shopify can schedule natively (and what it can’t)

Before the step-by-steps, here’s the map. Shopify’s admin has exactly one place where “start at this time, end at this time” is a built-in feature: the Active dates section of a discount. Both discount codes and automatic discounts get it. You pick a start date and time, tick “Set end date,” pick an end date and time, and Shopify handles both transitions on its own servers. No browser tab open, no cron job, no you at midnight.

What has no scheduling field anywhere in the admin: product prices. The Price and Compare-at price fields on a variant are just values. Change them and they change now; there is no “change this on Friday” option — not in the product editor, not in the bulk editor, not in a CSV import. This is the gap that surprises most merchants mid-task, because a “real” sale — the kind where product pages show a struck-through original price next to a lower one — is a price change, not a discount.

So the honest framing for Shopify scheduled discounts versus scheduled price changes is this:

  • Discount codes and automatic discounts: schedulable natively, down to the minute, in your store’s timezone.
  • Compare-at price markdowns: not schedulable natively. You either edit prices manually at the moment the sale starts, or you use Shopify Flow (with real limitations) or a third-party app.
  • Bulk editor and CSV: these change many prices at once, but the change happens when you click, not on a schedule.

Now let’s do each method properly.

Method 1: How to schedule a sale on Shopify with a discount code

This is the fastest path and the one we recommend if your sale is “subscribers get 20% off this weekend.” Discount codes are fully schedulable and Shopify enforces both ends of the window for you.

Step-by-step: creating a scheduled discount code

  1. From your Shopify admin, go to Discounts in the left sidebar.
  2. Click Create discount.
  3. Choose the discount type: Amount off products, Amount off order, Buy X get Y, or Free shipping. For a typical sale, “Amount off products” scoped to a collection is the workhorse.
  4. Under Method, select Discount code. Type a code customers can actually remember (WEEKEND20 beats X7KQ2P) or click Generate random code for one-off promos.
  5. Set the value — percentage or fixed amount — and choose what it applies to: specific collections or specific products.
  6. Work through Minimum purchase requirements, Customer eligibility, Maximum discount uses, and Combinations. Don’t skip Combinations — we cover why in the mistakes section.
  7. Scroll to Active dates. Set the start date and start time.
  8. Check Set end date and set the end date and end time. This checkbox is the single most-skipped field in the whole flow, and skipping it means your sale runs until you remember it exists.
  9. Click Save discount. The discount now shows a Scheduled status badge and flips to Active at the start time with no further input from you.

One detail that matters: the times you enter run on your store’s timezone, which is set under Settings > General. If you set up the store from a different timezone than the one you live in now — common for merchants who’ve moved, or agencies building stores for clients — your “6 p.m. start” fires at somebody else’s 6 p.m. Check it once before you schedule anything. We keep a note pinned in our own ops doc for exactly this reason, because one of our test stores is still on UTC from the day we created it.

Also worth knowing: once the code is saved, Shopify gives you a shareable link from the discount’s page that applies the code automatically when clicked. Use that link in your email and social posts and the “customers forget to enter the code” problem mostly disappears.

What scheduled discount codes can’t do

Codes have two structural weaknesses for running a sale. First, they’re invisible on the storefront. Your product pages show full price, your collection pages show full price, and nothing looks like a sale unless you also change banners and announcement bars yourself. A shopper who lands from Google sees a store at regular prices. Second, the customer has to do something — enter a code or arrive via your link. Every step you add costs conversions; that’s not opinion, it’s every checkout funnel we’ve ever looked at.

The end-of-sale behavior, on the other hand, is genuinely solid. When the end time passes, the code stops validating. Even if a shopper applied the code in their cart at 11:55 and reaches payment at 12:10, Shopify re-checks validity at checkout and removes the expired discount. You will occasionally get a support email from that shopper, but you won’t leak margin all night.

Method 2: Schedule an automatic discount (no code required)

Automatic discounts are the same machinery with the friction removed: the discount applies to every qualifying cart with no code entry. For a storewide or collection-wide sale where you want zero customer effort, this is the best native option, and it schedules exactly like a code does.

Step-by-step: creating a scheduled automatic discount

  1. Go to Discounts > Create discount and pick your discount type, same as before.
  2. Under Method, select Automatic discount instead of Discount code.
  3. Give it a title. This title is customer-facing — it appears in the cart and at checkout as the reason for the price drop (“Summer Sale 20%”), so write it like a shopper will read it, because they will.
  4. Set the value and scope (products, collections, or the whole order depending on type).
  5. Set Combinations deliberately. Automatic discounts and codes interact here, and the defaults are conservative.
  6. Under Active dates, set the start date/time, check Set end date, and set the end date/time.
  7. Save. Status shows Scheduled, and the discount turns itself on and off at the times you set.

Two constraints to plan around. Shopify caps you at 25 active automatic discounts at any one time — generous for most stores, but relevant if you run tiered promos across many collections. And a customer can’t choose between automatic discounts; Shopify applies what qualifies based on your combination settings, so overlapping automatic discounts need to be thought through rather than stacked hopefully.

The product page problem

Here’s the limitation that decides whether Method 2 is enough for you: in most themes, an automatic discount does not change what the product page shows. The shopper sees $80 on the product page and discovers at cart or checkout that it’s actually $64. Some newer themes and Shopify’s own checkout surfaces have gotten better at revealing automatic discounts earlier, but you should verify what your theme does on a test order rather than assume. When we tested this across the free Shopify themes on a dev store, the consistent pattern was: cart and checkout show the strikethrough, product and collection pages don’t.

Psychologically that’s backwards from how sales work. The slashed price on the product page is what converts browsers; a surprise discount at checkout is pleasant but doesn’t pull anyone in. If your sale’s success depends on shoppers seeing markdowns while they browse, automatic discounts alone won’t get you there — which brings us to compare-at pricing.

Method 3: The compare-at price method (real visible markdowns)

This is what most people picture when they picture a sale. You lower the variant’s Price and put the original price in Compare-at price. The theme renders the compare-at price struck through next to the new lower price, most themes add a “Sale” badge automatically, and if you use automated collections, a condition like “Compare-at price is not empty” can populate a Sale collection on its own. Product pages, collection pages, search results — the markdown is visible everywhere. This is the merchandising-grade sale.

How to set it up on a single product

  1. Go to Products and open the product.
  2. In the Pricing section (or per-variant if the product has variants), set Compare-at price to the original price — say, 80.00.
  3. Set Price to the sale price — say, 64.00.
  4. Save. The storefront updates within moments: strikethrough, sale price, badge.
  5. To end the sale, reverse it: move the compare-at value back into Price and clear the Compare-at field.

Simple, powerful, and completely manual. Which is the whole problem.

Why compare-at edits don’t schedule natively

There is no Active dates box anywhere near a price field. Shopify treats prices as catalog data, not campaign data — the platform’s scheduling machinery lives entirely inside Discounts. That means every compare-at sale has two hard deadlines where a human has to be at a keyboard: the moment prices go down, and the moment they go back up. Miss the first and your launch email points at full-priced products. Miss the second and you’re selling at sale prices indefinitely — we’ve heard from merchants who discovered a “weekend” sale still running on a Thursday because the revert was a sticky note, not a system.

The revert is also where data quality goes to die. Ending a sale means restoring every variant’s original price, exactly. Do that by memory across 300 variants and some fraction of them come back wrong — a 79.99 that returns as 79.00, a compare-at that never gets cleared and leaves a phantom strikethrough. The larger the catalog, the more the revert is the real project.

For a handful of products and a merchant who’s comfortable being online at start and end time, none of this is disqualifying. Methods 4 and 5 exist to shrink the manual work; apps exist to remove the deadlines entirely.

Method 4: Bulk editor and CSV workflows for bigger catalogs

If you’re doing compare-at markdowns on more than a few products, editing them one page at a time is not a plan. Shopify gives you two batch tools. Neither one schedules anything — read that sentence twice — but they compress the manual window from an evening to minutes.

The bulk editor: best up to a few dozen products

  1. Go to Products and select the products for the sale — filter by collection first to make selection fast.
  2. Click Bulk edit.
  3. In the bulk editor, use the Columns menu to add Price and Compare-at price if they’re not already showing.
  4. Edit values inline, spreadsheet-style. Copy-paste down a column works and is the fastest way to apply a uniform sale price pattern.
  5. Click Save. All changes apply immediately.

The bulk editor is genuinely good up to somewhere around fifty products. Past that it gets slow to work in, selection across pages gets fiddly, and a percentage-based markdown (15% off everything) means doing arithmetic per row because the editor sets absolute values — it can’t apply a formula. When we run bulk edits on our test catalog, the editor is our tool for “the 30 items in the Summer collection” and never for “every variant in the store.”

The CSV round-trip: best for hundreds or thousands of variants

  1. Go to Products > Export. Export the products in scope as CSV for Excel, Numbers, or other spreadsheet programs.
  2. Save an untouched copy of this export. This file is your revert. It is the exact pre-sale state of every price, and when the sale ends you’ll re-import it to restore everything. Name it something you’ll find at midnight.
  3. In a working copy, edit the Variant Price and Variant Compare At Price columns. In a spreadsheet you can do this with formulas — set Compare At to the old price, set Price to old price × 0.85 for 15% off — which is exactly what the bulk editor can’t do.
  4. Don’t touch the Handle column. The import matches products by handle; change it and you create duplicates instead of updating.
  5. Go to Products > Import, upload the edited file, and check Overwrite products with matching handles.
  6. Review the preview, run the import, and spot-check a sample of products on the storefront when it finishes.

Two honest warnings from having done this more than once. First, imports are queued and not instantaneous — a large catalog import can take a while to process, and you don’t control when it finishes. An import kicked off at 11:58 p.m. does not mean prices change at midnight; it means they change when the queue gets to you. Second, if your store uses Shopify Markets or multiple currencies, the CSV price columns are your base currency, and market-specific pricing adds a layer this workflow doesn’t cover. Test on a handful of products before you trust it with the whole catalog.

The takeaway for both tools: they solve the volume problem, not the timing problem. You’ve turned four hours of clicking into ten minutes of importing, but those ten minutes still happen at sale start and again at sale end, performed live, by you.

Method 5: Shopify Flow — scheduling automation, with caveats

Shopify Flow is Shopify’s automation app — long a Plus-only tool, now installable free on paid plans from the App Store (Apps > search “Shopify Flow”). Flow matters for this topic because it has the one thing the rest of the admin lacks: a Scheduled time trigger that fires a workflow at an exact date and time, optionally repeating.

So can Flow schedule your price changes? Technically, sometimes; comfortably, no. Flow’s built-in action library is oriented around tags, metafields, notifications, and order operations — there is no first-class “change this variant’s price” action. The path that exists is the Send Admin API request action, where your workflow calls Shopify’s Admin GraphQL API directly (the productVariantsBulkUpdate mutation) with a payload you write yourself.

We’ve built this on a dev store, and here’s the honest assessment of what you’re signing up for:

  • You’re writing GraphQL. This is a developer task wearing an automation costume. Fine for Plus stores with a technical team; not a settings screen.
  • Prices are hardcoded into the workflow. The mutation sets the values you wrote when you built it. If a price changed between building the workflow and it firing, your stale value overwrites the real one silently.
  • The revert is a second workflow you build by hand, with the original prices hardcoded again — so the “restore original prices exactly” problem from Method 3 comes right back, now in GraphQL.
  • No guardrails. Nothing warns you if a markdown takes a product below cost, and error handling when a mutation partially fails is on you to notice in the run log.

Where Flow genuinely shines for sales is the operational choreography around the price change: tag products when they go on sale so an automated collection picks them up, notify your team channel when the sale starts, flag orders that used a sale discount. We use Flow for exactly that kind of glue. For the price changes themselves, a small static list run by a technical person is workable; a catalog-wide markdown with a clean revert is the wrong fight.

Where third-party scheduling apps take over

Everything above is native, and if your sale fits Methods 1 or 2 — a scheduled code or automatic discount — stop reading and go schedule it. You don’t need an app for that, and anyone who tells you otherwise is selling you something you already own.

The app category exists for the specific jobs native tools can’t do, and it’s a short, concrete list:

  • Scheduled compare-at price changes. Visible product-page markdowns that start and end at exact times, across hundreds or thousands of variants, with no one at a keyboard. This is the core job: the app stores each variant’s original price when the sale starts and restores it exactly when the sale ends, which kills the revert problem outright.
  • Automatic revert as a guarantee, not a reminder. The end of the sale is enforced by software holding the original values — not by your memory, a sticky note, or a pristine CSV you hope you saved.
  • Floor protection. Rules like “never price below cost plus 10%” applied automatically, so a fat-fingered percentage can’t put your bestseller underwater at 2 a.m.
  • Velocity-triggered markdowns. This one isn’t a scheduling feature at all — it’s pricing that reacts to sell-through. Items that haven’t sold in 45 days get 10% off automatically; still not moving after another 30, deepen the cut, down to the floor. No native tool or Flow recipe does this, because it requires watching sales velocity per product continuously.

Our app in this category is Auto Markdown — scheduled and velocity-triggered markdowns with floor protection. Our studio motto is “we use the apps we sell,” and that’s literal: the velocity rules in Auto Markdown exist because we watched slow stock sit at full price on stores we run, and the floor protection exists because we once scheduled a markdown that would have cheerfully priced a product below its shipping cost. The feature list is a scar tissue inventory.

If you’re evaluating the category rather than taking our word for it, we published a survey of the best Shopify discount apps in 2026 that covers where each tool fits. And if one-off sales are turning into a recurring rhythm for you — monthly clearance cycles, rolling seasonal markdowns — that’s less a scheduling problem than a pricing-rules problem, which we’ve written up separately in our automated markdowns pricing-rules playbook.

Which method for which sale: the decision table

Here’s the whole post as a lookup table. Find your scenario, use that method, ignore the rest.

Your scenarioBest methodWhy
Weekend promo for your email listScheduled discount code (Method 1)Fully native start/end times; shareable auto-apply link removes code friction
Sitewide or collection-wide % off, no code, hands-off start and endScheduled automatic discount (Method 2)Zero customer effort; Shopify flips it on and off for you
Visible strikethrough prices on ~10–50 products, and you can be online at start and endCompare-at via bulk editor (Methods 3 + 4)Real product-page markdowns; manual timing is tolerable at this scale
Visible markdowns on hundreds+ of variants, timing flexibleCSV round-trip (Method 4)Formulas handle the math; keep the pristine export as your revert file
Visible markdowns that must start and end at exact times, nobody at a keyboardScheduling/markdown appOnly apps schedule compare-at changes with automatic, exact revert
Technical team, small static price list, comfortable with GraphQLShopify Flow (Method 5)Scheduled-time trigger + Admin API action works, with hardcoded values and DIY revert
Ongoing clearance driven by what’s actually sellingVelocity-triggered app rulesRequires continuous sell-through monitoring; no native equivalent exists

Common mistakes when scheduling Shopify sales

These are the failure modes we see most, from our own stores and from merchants who write in. Every one of them is cheap to avoid before the sale and expensive during it.

Scheduling in the wrong timezone. Discount Active dates run on the store timezone under Settings > General, not on your laptop’s clock. A store set up on UTC with a merchant in Miami fires its “midnight” sale at 8 p.m. the previous evening — or worse, your emails announce a live sale that’s still four hours from starting. Verify the store timezone once; it takes ten seconds.

Assuming an automatic discount changes product pages. It usually doesn’t. If your campaign creative screams “everything 25% off” and the product pages show full price with no strikethrough, shoppers assume the sale is over or fake, and bounce. Either pair the automatic discount with announcement-bar messaging, or use compare-at markdowns for the visual.

Stacking a discount on top of a compare-at markdown by accident. This is the expensive one. You mark products down 20% with compare-at pricing, and a scheduled automatic discount from a previous campaign — or a code you forgot was still active — applies on top. Now you’re 40% off and margins are gone. Before any sale goes live, open Discounts, filter by Active and Scheduled, and make sure nothing overlaps your marked-down products.

No end date. The Set end date checkbox is optional and unchecked by default. An automatic discount without an end date runs until someone notices. “Someone notices” has been known to take weeks.

Editing prices via CSV without keeping the pristine export. Your pre-sale export is the only exact record of original prices. If you edit the same file you exported and save over it, the revert becomes archaeology. Export, duplicate, edit the duplicate — always.

Leaving Combinations on defaults without reading them. The Combinations settings decide whether your code stacks with automatic discounts, free-shipping offers, or other codes. Both failure directions happen: stacking you didn’t intend (margin leak) and non-stacking you did intend (a “free shipping + 15% off” promo where checkout only honors one, and support tickets follow).

Treating Black Friday like a normal weekend sale. BFCM compresses every risk on this list into one night: bigger catalogs, deeper cuts, higher traffic, and platform-wide load at exactly the moment your CSV import sits in a queue. Manual price changes at midnight before Black Friday is the single worst version of the timing problem. We’re covering the full approach in our Shopify Black Friday markdown strategy guide — the short version is: whatever method you choose, rehearse it on a small collection a week early.

FAQ: Shopify sale scheduling questions we actually get

Can I schedule a sale on Shopify without an app?

Yes, if the sale is discount-based. Both discount codes and automatic discounts support scheduled start and end times natively under Discounts > Create discount > Active dates, and Shopify handles both transitions automatically. What you can’t schedule without an app (or a hand-built Flow workflow) is a change to actual product prices — the compare-at strikethrough style of sale. Those price edits happen the moment you make them, full stop.

What timezone does a Shopify sale start and end time use?

The store’s timezone, configured under Settings > General — not your device’s clock and not your customers’ local time. A sale scheduled for 6 p.m. starts at 6 p.m. store time everywhere in the world simultaneously. If your customers span timezones, pick times based on where your revenue actually comes from; your analytics’ sales-by-hour report will tell you.

Why doesn’t my automatic discount show on product pages?

Because automatic discounts are applied to carts and checkouts, not to catalog prices. Most themes render the discounted line item in the cart and at checkout, but product and collection pages keep showing the regular price. If you need the visible slashed-out price while shoppers browse, that requires changing the product’s Price and Compare-at price fields — manually, or on a schedule via an app.

Can I schedule compare-at price changes in Shopify natively?

No. There is no scheduling field on any price input in the admin, the bulk editor, or the CSV import. Your native options are to make the edits live at start and end time (bulk editor or CSV makes the edits fast, but not scheduled), or to build a Shopify Flow workflow using the Scheduled time trigger and a hand-written Admin API request — which works but hardcodes prices and leaves the revert entirely to you. Apps like Auto Markdown exist precisely because this gap is real.

How far in advance can I schedule a Shopify discount?

As far ahead as you like — the Active dates fields accept any future date, so you can build your entire promotional calendar for the quarter in one sitting and let each discount flip itself on. We’d actually recommend it: scheduling discounts in a calm week beats configuring them the night before launch, and the Scheduled status list under Discounts becomes a de facto promo calendar you can review at a glance.

How do I make a sale end automatically?

For discounts: check Set end date in Active dates and pick the end date and time — Shopify deactivates the discount on schedule, and even carts holding the discount get re-validated at checkout. For compare-at price sales: natively, ending automatically isn’t possible; someone restores the original prices by hand or re-imports the pre-sale CSV. If the automatic, exact revert is the part you need — original prices stored at markdown time and restored to the penny at end time — that’s the core job of a markdown scheduling app.


— Palm Beach Themes is a Miami-based Shopify app studio. We use the apps we sell, so every claim in this post comes from our own merchant testing.

If your sale needs visible markdowns that start and end on their own — with original prices restored exactly, floors that protect your margin, and rules that react to what’s actually selling — that’s what we built Auto Markdown for. Schedule the sale, close the laptop, and let it run.