Skip to content

Understanding Overlapping Discounts

How Campaignly stacks multiple campaigns on the same product and unwinds them in the right order.

This is the doc to read before Black Friday. It explains what Campaignly does when two campaigns are scheduled on the same product at the same time — and why the storefront never accidentally exposes the wrong price between them.

The mental model

Think of each product variant as having a stack of campaigns pushed on top of its original price. Last one in (= newest applied) wins on the storefront; the others wait their turn.

                Original price: $100
                ──────────────
Aug 1: Weekly clearance starts (15% off)
   → Stack: [Clearance]
   → Storefront shows: $85

Nov 24: Black Friday starts (40% off)
   → Stack: [Clearance, BlackFriday]
   → Storefront shows: $60  (the most recent push)

Nov 30: Black Friday ends
   → Stack pops: [Clearance]
   → Storefront shows: $85  (the next one in line)

Dec 31: Clearance ends
   → Stack empty, row deleted
   → Storefront shows: $100  (original)

The same logic runs for every variant Campaignly touches. There’s no “global” stack — each variant has its own little stack tracked in DynamoDB.

Why this matters

Without stacking, ending Black Friday on day 30 would have to:

  1. Detect the clearance was still in flight on this variant.
  2. Recompute the clearance price.
  3. Push that new price to Shopify.
  4. Hope the recompute didn’t race the apply Lambda’s writes.

That’s a lot of “ifs” between steps, and a single race condition exposes the un-discounted $100 to a customer for those few minutes. With the stack, the revert just pops one entry off and writes the next entry’s price — which we already computed when the campaign started.

What you’ll see in the admin

The Campaigns list groups overlapping campaigns visually:

  • Active campaigns show a green pill.
  • When two campaigns are active and overlap on at least one variant, the lower-priority one (the older / longer-running) shows a small “stacked under” indicator.

Tap the indicator to see exactly which variants are double-covered. This is useful for planning a new promo without accidentally pricing a product below cost.

Common scenarios

Stacking promos to layer urgency

You’re running an evergreen 15% clearance on the Outdoor collection. Black Friday weekend you want to push it deeper. Schedule a new campaign — 40% off, products = Outdoor collection — for Nov 27 → Dec 1. When Black Friday ends, the storefront snaps back to the 15% clearance, not to full price.

Running a brand-wide promo on top of category sales

You have three “always-on” category clearances (Outdoor, Apparel, Footwear). On Cyber Monday you want everything at 30% off. Schedule a Cyber Monday campaign with products = all. Campaignly pushes the 30% price; when Cyber Monday ends, each variant snaps back to its own category clearance (if it had one) or to the original (if not).

Manually editing a price during overlap

Mid-campaign you decide one specific variant should be 50% off instead of the campaign’s 40%. Edit the price in Shopify admin.

What Campaignly does:

  1. Within ~10 seconds, the products/update webhook from Shopify arrives at Campaignly’s worker.
  2. The worker notices the new price is different from what the current top-of-stack campaign expects.
  3. Your edit is captured as the new “baseline” for that variant.
  4. You receive a confirmation email so you know we noticed.
  5. When the campaign ends, prices revert to your edited value, not the pre-campaign original.

We never silently overwrite a manual edit.

Limits

  • A variant can sit under at most 10 active campaigns simultaneously. In practice, no one hits this — it would mean the same variant is on sale 10 different ways at once. The cap is defensive.
  • Two campaigns starting at the exact same second on the same variant are processed in (startTime, createdAt) order — the newer one wins. Avoid scheduling two campaigns to fire on the same second; pick different seconds (or different minutes) so the ordering is unambiguous.

See also

  • Creating Your First Campaign for the basic setup.
  • Troubleshooting if a variant shows an unexpected price.
  • FAQ for cancellation behaviour mid-stack.