DEV Community

Zhuang Hua
Zhuang Hua

Posted on

How to schedule Shopify sale prices so they actually end on time (without leaving variants discounted)

I build a small Shopify app, and the problem I hear about most isn't "how do I start a sale." It's "why is my sale still running on Tuesday?"

Starting a sale is easy. Ending it cleanly — across every product, every variant, with the original prices restored exactly — is where things go sideways. This post covers why that happens and a checklist you can use whether or not you ever use a tool for it.

The problem: sales are easy to start, hard to end

On Shopify, a "sale price" is usually just two fields on each variant:

  • Price — what the customer pays
  • Compare-at price — the crossed-out "was" price

To run a sale, you lower price and set compare-at to the old price. To end it, you reverse that. Simple on one product. Messy on fifty products with sizes and colors.

Here's what tends to go wrong:

1. Hand edits don't scale to variants

A T-shirt with 4 sizes × 3 colors is 12 variants. Editing the product-level view and forgetting that one variant has a different price is very easy. Bulk editor helps, but it's still manual, and manual means someone has to be awake and at a laptop when the sale ends.

2. Stuck sale prices

The sale was supposed to end Sunday at midnight. Nobody remembered, or someone reverted most of the products. Now a handful of variants are still discounted days later — and you often find out from a customer, or from your margin report.

3. Lost compare-at prices

This one hurts more quietly. If you overwrite compare-at during the sale and don't record what it was before, you can't restore it accurately. Some products had a permanent compare-at (e.g., an MSRP) before your sale even started. Wipe that out and your "normal" listing looks different after the sale than it did before.

4. Time zones and "midnight"

"Ends at midnight" — whose midnight? Your store's time zone, your own, or your customers'? If you announced a time in an email, the prices should change at that time in the zone you announced.

5. Overlapping sales

A product in both the "Black Friday" collection and a "Clearance" sale. Which price wins? What gets restored when one ends but the other hasn't?

A checklist for timed Shopify sales

Use this before, during, and after any sale.

Before the sale

  • [ ] Export a snapshot of current price and compare-at for every variant in scope (CSV export from Products works). This is your undo button.
  • [ ] List the scope explicitly: which products, which collections, and whether all variants are included.
  • [ ] Note existing compare-at values. Decide whether the sale should overwrite them or leave them alone.
  • [ ] Write down start and end times with a time zone. Match your store's time zone setting (Settings → General).
  • [ ] Check for overlaps with other running or scheduled sales.
  • [ ] Decide on rounding (e.g., 20% off then round to .99) so prices don't land on odd numbers like $23.47.
  • [ ] Line up marketing (emails, banners, social posts) with the exact same end time.

When the sale starts

  • [ ] Spot-check a few products at the variant level, not just the product overview.
  • [ ] Check the storefront in a private window — the theme should show the crossed-out compare-at price.
  • [ ] Confirm the collection or discount banner points to the right products.

When the sale ends

  • [ ] Restore prices from your snapshot — every variant, not just the default.
  • [ ] Restore the original compare-at values (including ones that existed before the sale).
  • [ ] Remove sale banners, badges, and announcement bars.
  • [ ] Spot-check again: search the admin for products with a compare-at higher than price that shouldn't have one.

After the sale

  • [ ] Keep the snapshot file for a while in case something surfaces later.
  • [ ] Write down what went wrong so the next sale has fewer surprises.

Automate the boring, risky part

You can do all of the above by hand. Lots of merchants do. But the riskiest step — reverting every variant at an exact time — is also the most boring one, and that's exactly the kind of thing that's worth automating.

That's why I built SaleGuard. It lets you schedule a sale with a start and end time, applies prices across the variants you pick, saves the original price and compare-at values, and restores them when the sale ends. The goal is simple: the sale ends when you said it would, and your catalog goes back to exactly how it was.

No pressure — even if you never install anything, steal the checklist. The "export a snapshot first" habit alone will save you a bad Monday.

Wrapping up

Timed sales fail at the edges: the forgotten variant, the overwritten compare-at, the midnight nobody agreed on. Make a snapshot, be explicit about scope and time zone, verify at the variant level, and restore from your snapshot instead of from memory.

If you run Shopify sales and have a horror story (or a better process), I'd genuinely love to hear it in the comments — it directly shapes what I build next.

Top comments (1)

Collapse
 
growganic profile image
GrowGanic •

Your end of sale checklist covers the admin and the storefront, but there is a third copy of the price that often lags behind: the one Google holds.

If the store syncs to Merchant Center, a variant that stays discounted for days can become the price shown in Shopping ads and free listings. Once you restore it, the page and the feed can disagree for a while. Merchant Center flags that as a price mismatch from page crawl, which can get items disapproved just as sale traffic winds down.

Two additions I would put on the list. Before the sale, check whether prices reach Google through the feed or through automatic item updates read from the page's structured data, since that decides which one you fix first. After the sale, open Merchant Center diagnostics a day later and filter for price mismatches, alongside your admin search for leftover compare at prices.

It tends to surface the variants a spot check missed.