October 13, 2026 · StoreSentry Team

How to Map a Competitor's Sale Calendar from Price History

A wall calendar with discount price tags on several days of the month, next to a shelf of products

Most small Shopify competitors do not discount at random. They run sales on a rhythm: a weekend every month, a clearance push at the end of a season, a deeper cut when stock piles up. Write that rhythm down and you can plan your own promotions around theirs instead of reacting to each price drop as it happens. Below is how to build a competitor sale calendar from public catalog data, with a worked example and the places where the method stops being reliable.

What a sale calendar actually is

A sale calendar is a simple log of discount events for each competitor: when a sale started, how long it lasted, how many products it covered and how deep the cuts were. After a few months, the log shows patterns that a single snapshot never will:

You can do all of this with free data: regular snapshots of the competitor's catalog and a few rules for deciding what counts as a sale.

Step 1: collect daily snapshots

Every Shopify store exposes its public catalog at /products.json, with the current price and the compare_at_price for every variant. The products.json guide covers how to read it. The catch is that it only shows today's prices. To see a sale start and end, you have to save a copy yourself, on a schedule.

Save one every day. Many small-store sales last three or four days, and a weekly snapshot misses a lot of them. If you save one snapshot every Monday and a competitor runs a sale from Thursday to Sunday, you never see it. Other jobs can get by with less; the frequency guide covers those.

For each snapshot, keep the date, product handle, variant, price and compare_at_price. A spreadsheet with one row per product per day is enough for a store with a few hundred products.

Step 2: decide what counts as a sale

Without a rule, you end up arguing with yourself about every small price change. Two simple rules work well:

  1. Product on sale: the price is at least 10% below that product's usual price (the median of its last 30 days), or a compare_at_price above the current price appears that was not there before.
  2. Store-wide event: on the same day, at least 15% of the competitor's products go on sale. The event ends on the first day that share falls back below the threshold.

The second rule separates a real promotion from background noise, like a single product being repriced. Be careful with compare_at_price on its own: some stores keep a struck-through "was" price on products all year. The compare_at_price article explains how to tell a permanent fake discount from a real markdown. A product whose price never changes is not on sale, whatever the label says.

Step 3: log the events

Here is an example. Suppose a competitor sells outdoor gear and has 120 products. After six months (26 weeks) of daily snapshots, the store-wide events look like this:

MonthStarted onDaysProducts on saleTypical discount
Month 1Thursday438 of 12020%
Month 2Friday341 of 12020%
Month 3Thursday444 of 12025%
Month 4Thursday440 of 12020%
Month 5Friday336 of 12025%
Month 6Thursday445 of 12025%

Six events in 26 weeks, 22 sale days in total. Out of roughly 182 days, that is about 12% of the time on sale. Each event covered 30 to 38% of the catalog. The typical discount moved from 20% in the first two months to 25% in three of the last four.

Separately, the log shows seven products that dropped 35 to 40% outside any store-wide event and were removed from the catalog within two weeks. That looks like clearance of old stock, so keep those on a separate list.

Step 4: read the pattern

From that table you can say a few useful things with some confidence:

Step 5: decide what to do with it

With the calendar you can decide before their next sale starts. Some options:

Where this method breaks

A catalog-based sale calendar only sees what the catalog shows. Know the gaps:

Doing this by hand is realistic for one or two competitors. Past that, saving daily snapshots and keeping the log up to date becomes the real work. StoreSentry keeps a price history for every tracked product and sends price-drop alerts after each check (hourly on paid plans, daily on Free), so the raw data for a sale calendar collects itself. You still have to read the pattern yourself.

Let the sale log fill itself

StoreSentry checks competitor Shopify stores on a schedule and sends a digest of price moves, launches, restocks and sell-outs by email or Telegram. Free for 2 competitors, no card required; price history and CSV export on paid plans.

Install the app — free for 2 competitors →