SafeSale · Blog

New products during a Shopify sale: who gets the discount

Launch a product while a sale is running and it may or may not be discounted, depending on how the sale was built. Collections, tags, rewrites and Functions compared.

A bedding store runs 20% off its Autumn collection for two weeks. On day five a new colourway ships early, gets the same tags as its siblings, lands in the automated collection and goes live at full price. The newsletter that morning says “everything in Autumn is 20% off”. By lunch there are three support tickets and one slightly tense conversation about whether the discount was supposed to be on the new one too.

Nothing malfunctioned. The sale and the product launch each did exactly what they were set up to do, and the gap between them is the subject of this post. Whether a product that arrives mid-sale is discounted depends entirely on how the sale is applied, and the two ways Shopify stores can run a sale give opposite answers. Here is how each one behaves, with the details of how SafeSale handles both.

A sale is either a list or a rule

Strip away the apps and there are two things a “sale” can be on Shopify.

The first is a list: somebody, or something, went through a set of variants at a point in time and wrote a new price into each one, usually moving the old price into compare-at so the theme shows a strikethrough. Manual edits, a product CSV import and price-rewrite apps all end up here. The list was true when it was written. Shopify has no idea it was meant to describe a collection; it just has variants with new numbers in them.

The second is a rule: an automatic discount that says “20% off anything in these collections” and is evaluated every time a cart is priced. Stored prices never change. The rule is asked, line by line, whether this product qualifies, and it answers with whatever is true at that moment.

SafeSale offers both, and we have written before about choosing between them. What that post did not spell out is how differently the two react to a catalog that keeps moving while the sale runs. Products get added. Products get pulled. Tags change. Someone adds a variant. Each of those is a non-event for one mechanism and a real question for the other.

How SafeSale decides what is in a sale

When you build a sale in SafeSale you pick targets: specific products, collections, tags, vendors, or a mix. In both modes the app then resolves those targets into a concrete list of variants with their current prices, so the preview table can show you every row before you touch anything. Gift cards are skipped. The list is fingerprinted, and if any price has changed between the preview you looked at and the moment you confirm, SafeSale makes you look at the new preview rather than applying rules to numbers you never saw.

That is where the two modes part ways.

Price-rewrite mode: the list is the sale

In rewrite mode the resolved list is what gets snapshotted and then written. For a scheduled sale the targets are resolved again at start time, and if the collection has changed since you previewed it, the difference is logged and shown on the sale, so a product added between scheduling and start is included. Once the sale is active, though, the list is frozen. Nothing goes back to the collection on day five to see who is new.

This is deliberate, and it is the same reason the mode is safe at all. Every rewritten variant has an immutable snapshot of its original price and compare-at, and the revert at the end restores exactly those rows. A sale that quietly grew during the week would need snapshots taken at different times, for products whose “original” price might itself have been edited mid-sale, and the one-click restore would stop meaning one thing. Stale prices after a sale are the single most common complaint about this category of app, and a frozen list is how you avoid them.

Functions mode: the rule is the sale

In Functions mode SafeSale creates an automatic discount backed by a Shopify Function. The targeting is not flattened into variant IDs. The Function receives your collection IDs, tags, vendors and product IDs as configuration, and for each cart line it asks Shopify directly whether the product is in any of those collections or carries any of those tags. Shopify’s Discount Function API exposes exactly those questions, and they are answered against the live catalog at checkout.

So the new colourway, tagged like its siblings and sitting in the automated collection, is discounted on its very first order. Nobody had to do anything. The reverse is also true: pull a product from the collection and the next cart that contains it pays full price.

One honest caveat. SafeSale’s theme blocks, the badge and the countdown, read small metafields the app writes when the sale starts: a shop-level one for the store-wide badge and a per-product one for the countdown. A product that joins a Functions sale mid-week gets the discount at checkout but does not get the per-product countdown metafield, so its page will not show the timer until the sale is edited or re-saved. The store-wide badge is unaffected. The price is right; the decoration is a step behind.

Side by side

Mid-sale eventFunctions (automatic discount)Price rewrite
New product joins a targeted collection or gets a targeted tagDiscounted from its first orderFull price until you add it in a second sale
Product removed from the collectionFull price on the next checkoutStays at the sale price until the sale ends and reverts
New variant added to a product already in the saleDiscounted with the sale’s default ruleNot rewritten; the other variants are
Someone edits a sale product’s price by handDiscount applies on top of the new priceLogged as drift; revert restores the snapshot unless you exclude it
Product added between scheduling and startIncludedIncluded, with the change logged at start

The third row deserves a second look. A product that is in the sale by product ID is in the sale as a whole in Functions mode, so a variant you add on Wednesday inherits the default rule. In rewrite mode variants are the unit, and a variant that did not exist when the snapshot was taken has no snapshot and no new price. If you often add sizes or colours to live products, that alone is a reason to lean on Functions for long sales.

Adding products to a rewrite sale without breaking it

If you are in rewrite mode because you need the native strikethrough on every product page, and a product lands mid-sale, the clean move is a second sale, not an edit to the first.

  1. Create a new sale in price-rewrite mode with the same rule and, critically, the same end time as the running one. The end time is what triggers the revert, and you want both reverts to fire together.
  2. Target the new products directly rather than the collection. If you target the whole collection again, every variant already in the first sale shows a blocking warning in the preview: SafeSale does not let a variant belong to two active or scheduled sales, which is what prevents the 20%-on-top-of-20% that variant-level previews exist to catch.
  3. Check the compare-at column in the preview. For a brand new product the original compare-at is usually empty, so the policy “set compare-at to original price if empty” gives you the strikethrough with the launch price as the reference. If the product shipped with a compare-at already filled in, decide whether to keep it.
  4. Apply. The new sale gets its own snapshot, its own change log rows and its own revert. When the shared end time arrives, both sales restore their variants and the collection is back to full price in one pass.

If you would rather not manage two sales, end the first one early, let it revert, and start a fresh one targeting the collection. That costs you a few minutes of full prices while the revert and the new write run, which is why most merchants prefer the second-sale route during a busy promotion.

When a product should not be in the sale

The opposite problem is just as common: a new product belongs in the collection for merchandising reasons but is not supposed to be discounted. Launch pricing, a limited collaboration, a product with thin margins.

In Functions mode the discount is attached to collection membership, so a product in the collection will be discounted unless you keep it out. The usual fix is a tag the automated collection does not match on, or a separate “new arrivals” collection that stays off the sale’s target list until launch pricing ends. Decide this before the product is published, because the rule is live the moment the product is.

In rewrite mode the new product is safe by default, since the frozen list cannot grow. The risk runs the other way: when the sale ends and you build the next one against the same collection, the product is now included and will be previewed at a discount. The preview table is where you catch that, and it is worth reading the rows for products that did not exist last time rather than scanning for the percentage.

Writing the campaign copy honestly

The bedding store’s real mistake was not technical. It was a newsletter that promised “everything in Autumn” while the mechanism underneath only knew about the Autumn that existed on Monday. If you run rewrite sales and launch products during them, either keep the promise narrow (“these styles”), or hold the launch until the sale ends, or budget the second-sale step into the launch checklist. If you run Functions sales, the promise is cheap to keep, and the thing to watch is the reverse: anything that drifts into the collection gets the discount whether you meant it or not.

Both behaviours are correct. They are simply answers to different questions. A list tells you exactly what was changed and lets you put it back; a rule tells you what is true right now and keeps being true as the catalog moves. SafeSale gives you both and shows you, before anything is written, which products each one will reach. The product that ships early on day five is the test of whether you picked the one you meant.

Frequently asked questions

If I add a product to a collection that is on sale, does it get the discount?

It depends on how the sale is applied. A Shopify automatic discount scoped to the collection, including the one SafeSale creates in Functions mode, is evaluated at checkout against the cart, so a product that joins the collection is discounted from its first order. A sale that rewrote prices worked from a list of variants that was fixed when it started, so a product added later keeps its full price until you include it on purpose.

Why did my new product show full price while everything else in the collection was on sale?

Almost always because the sale was done by rewriting prices and compare-at prices, either by hand, by CSV or with an app, before the product existed. Nothing is scanning the collection afterwards. Add the product to the sale explicitly: in SafeSale that means a second sale with the same rule and the same end time, which the app will refuse to let overlap with the first.

Can I add products to a SafeSale sale that is already active?

In Functions mode, yes, indirectly: add the product to a targeted collection or give it a targeted tag and the Function picks it up at checkout. In price-rewrite mode an active sale's variant list is frozen so it can be reverted exactly, so you create a second sale for the new products. SafeSale blocks a variant from being in two active sales, so the second sale cannot double-discount anything from the first.

What happens if I remove a product from the collection mid-sale?

With an automatic discount the product stops being discounted on the next checkout. With a price rewrite nothing changes on the storefront: the product's price was already written and it stays on sale until the sale ends and the snapshot restores it. If you need it back at full price immediately, exclude it from the sale and let the app revert that variant.