Skip to main content
Thirdwatchthirdwatch
E-commerce & products

Monitor Myntra Deals and Discounts at Scale (2026)

Track Myntra End-of-Reason-Sale, Big Fashion Days and steady-state discounts with Thirdwatch. Real-deal alerts, sale-window analytics, Python recipes inside.

May 12, 2026 · 5 min read · 1,245 words
See the scraper →

Thirdwatch's Myntra Scraper returns live MRP, current price and computed discount_percent for every product, making it the workhorse data layer for an India fashion deal-tracking pipeline. Built for ops teams running price-alert services, dropshippers timing inventory buys, consumer-app builders running deal-feed products, and brand teams monitoring their own discount frequency.

Why monitor Myntra deals at scale

Myntra runs the most aggressive promotional cycle of any India fashion marketplace. End-of-Reason-Sale (EORS) is the country's anchor fashion sale event — Economic Times reports routinely cite EORS as Myntra's largest revenue window, with discounts reaching 50-80% off MRP across apparel, footwear and beauty. Between EORS windows, Big Fashion Days run every 4-6 weeks, Republic Day Sale anchors January, Independence Day Sale anchors August, and category-specific events run year-round. For deal-tracking services, dropshippers, and brand-protection teams, this cycle is the entire job-to-be-done.

The job-to-be-done is structured. A consumer-facing deal-alert app needs hourly discount sweeps during sale windows and daily sweeps the rest of the year. A dropshipper buys clearance inventory at 70%+ off MRP for resale on Meesho or Amazon. A brand-protection team watches for unauthorised resellers running deeper discounts than the brand's own approved channels. A pricing analyst studies seasonal discount cycles for category-level forecasting. All reduce to longitudinal MRP + price + discount_percent capture against a watchlist of SKUs or categories.

How does this compare to the alternatives?

Three options for systematic Myntra discount monitoring:

Approach Reliability Setup time Maintenance
Browse Myntra manually + spreadsheet Low — can't scale beyond a few SKUs, misses intraday windows Continuous Doesn't scale
Deal aggregator scraping (Desidime, GrabOn) Medium — community-driven, variable freshness, opinionated curation 1-2 days Aggregator schema changes
Thirdwatch Myntra Scraper Production-tested with production-grade anti-bot tooling 5 minutes Thirdwatch tracks Myntra changes

Deal aggregators are downstream consumers, not primary sources — many of them use scrapers like ours as their upstream input. The Myntra Scraper actor page gives you the raw MRP + price + discount fields at transparent per-result pricing, so you can build your own deal-detection logic rather than inherit someone else's curation.

How to monitor Myntra deals in 4 steps

Step 1: How do I run a sale-window sweep?

During EORS or Big Fashion Days, sweep a broad watchlist hourly. Sort by discount to put the deepest cuts first.

export APIFY_TOKEN="apify_api_xxxxxxxxxxxxxxxx"
import os, requests, datetime, json, pathlib

ACTOR = "thirdwatch~myntra-scraper"
TOKEN = os.environ["APIFY_TOKEN"]

CATEGORIES = ["men-tshirts", "men-shirts", "men-jeans",
              "women-tops", "women-dresses", "women-kurtas-kurtis",
              "men-footwear", "women-footwear",
              "sportswear", "beauty-personal-care"]

resp = requests.post(
    f"https://api.apify.com/v2/acts/{ACTOR}/run-sync-get-dataset-items",
    params={"token": TOKEN},
    json={
        "queries": CATEGORIES,
        "sortBy": "discount",
        "maxResults": 200,
    },
    timeout=900,
)
records = resp.json()
stamp = datetime.datetime.utcnow().isoformat()[:13] + "Z"
pathlib.Path(f"sweeps/myntra-{stamp}.json").write_text(json.dumps(records))
print(f"{stamp}: {len(records)} records across {len(CATEGORIES)} categories")

sortBy: "discount" returns the deepest discounts first within each category, so the first 50 records per category cover the visible sale anchors. Ten categories × 200 records each = 2,000 records per hourly sweep — affordable for a 48-hour EORS hot window.

Step 2: How do I filter to genuinely deep discounts?

Compute discount-percent against a 30-day median price rather than MRP. MRP inflation makes raw discount-percent unreliable as a deal signal.

import pandas as pd, glob

frames = []
for f in sorted(glob.glob("sweeps/myntra-*.json")):
    stamp = pathlib.Path(f).stem.replace("myntra-", "")
    for j in json.loads(pathlib.Path(f).read_text()):
        frames.append({
            "stamp": stamp,
            "sku": j.get("sku"),
            "brand": j.get("brand"),
            "product_name": j.get("product_name"),
            "price": j.get("price"),
            "mrp": j.get("original_price"),
            "rating": j.get("rating"),
            "rating_count": j.get("rating_count"),
            "url": j.get("url"),
        })

ts = pd.DataFrame(frames).dropna(subset=["sku", "price"])
ts["stamp"] = pd.to_datetime(ts.stamp, format="%Y-%m-%dT%H")
ts = ts.sort_values("stamp")

# 30-day median per SKU
ts["price_30d_median"] = (
    ts.groupby("sku")["price"]
      .transform(lambda s: s.rolling("30D", on=ts.stamp).median())
)
ts["delta_pct"] = (ts.price - ts.price_30d_median) / ts.price_30d_median * 100

real_deals = ts[
    (ts.delta_pct <= -15)
    & (ts.rating >= 4.0)
    & (ts.rating_count >= 100)
].sort_values("delta_pct")
print(real_deals[["brand", "product_name", "price",
                  "price_30d_median", "delta_pct", "rating"]].head(20))

A 15%+ drop below the SKU's own 30-day median, on a 4.0+ rated product with 100+ reviews, is the canonical "real deal" filter — robust against MRP inflation, low-quality clearance and review-bombed listings.

Step 3: How do I alert on first detection only?

Persist a seen-deals state so you alert once per (sku, deal_event) rather than every hour.

import sqlite3, pathlib

DB = pathlib.Path("seen_deals.sqlite")
con = sqlite3.connect(DB)
con.execute("""CREATE TABLE IF NOT EXISTS seen_deals
              (sku TEXT, alerted_at TEXT, last_price INTEGER,
               PRIMARY KEY (sku))""")

import requests as r

for _, row in real_deals.iterrows():
    cur = con.execute("SELECT last_price FROM seen_deals WHERE sku = ?", (row.sku,))
    seen = cur.fetchone()
    if seen and abs(seen[0] - row.price) / seen[0] < 0.05:
        continue  # already alerted at roughly this price
    msg = (f":fire: *{row.brand} {row.product_name[:60]}* — "
           f"₹{int(row.price):,} (₹{int(row.price_30d_median):,} 30d median, "
           f"{row.delta_pct:+.1f}%) — {row.url}")
    r.post("https://hooks.slack.com/services/.../...",
           json={"text": msg}, timeout=10)
    con.execute("REPLACE INTO seen_deals VALUES (?,?,?)",
                (row.sku, datetime.datetime.utcnow().isoformat(),
                 int(row.price)))
con.commit()

Step 4: How do I produce a sale-event recap?

After an EORS window closes, aggregate by brand and category for a post-mortem.

event_window = ts[(ts.stamp >= "2026-06-01") & (ts.stamp <= "2026-06-12")]

brand_recap = (
    event_window.groupby("brand")
      .agg(deals=("sku", "nunique"),
           median_disc=("delta_pct", "median"),
           max_disc=("delta_pct", "min"))
      .sort_values("deals", ascending=False)
      .head(20)
)
print("Top brands by EORS deal volume:")
print(brand_recap)

Brand-level recaps are the most actionable artefact — they reveal which brands push deepest discounts (typically private labels and clearance-heavy international brands) versus which hold price (premium-tier brands).

Sample output

A single record during EORS for a heavily-discounted product looks like the example below. discount_percent is computed by the actor from original_price and price.

{
  "sku": "29384721",
  "product_name": "HRX by Hrithik Roshan Men's Active Tshirt",
  "brand": "HRX by Hrithik Roshan",
  "price": 379,
  "original_price": 1499,
  "discount_amount": 1120,
  "discount_percent": 74.7,
  "currency": "INR",
  "rating": 4.3,
  "rating_count": 8420,
  "image_url": "https://assets.myntassets.com/.../29384721.jpg",
  "url": "https://www.myntra.com/tshirts/hrx-by-hrithik-roshan/.../buy",
  "article_type": "Tshirts",
  "primary_colour": "Olive",
  "sizes": ["S", "M", "L", "XL", "XXL"],
  "color_variants_count": 4
}

discount_percent of 74.7 means this listing is at one-quarter of MRP — typical for HRX during EORS day one. The 8,420-rating count is meaningful: a high-volume rated SKU at this discount level is genuine inventory clearance, not a low-quality outlier. For deal-alert services, rating_count is the strongest quality filter alongside the 30-day median check.

Common pitfalls

Three things go wrong in production deal-monitoring pipelines. MRP inflation — brands routinely set MRP at 2-3x the steady-state price specifically to support discount-claim marketing; never use discount_percent against MRP as your sole signal. Compare against the SKU's own rolling median price instead. Alert fatigue — without dedup state, a 200-record hourly sweep that's mostly the same SKUs at the same prices fires thousands of duplicate alerts; persist a seen-deals table and only alert on first-detection. Sale-window skew in 30-day medians — if your 30-day window includes a previous EORS, the median itself is depressed; either exclude past sale windows from the median calculation or compute a separate "steady-state median" using only non-sale days.

Thirdwatch's actor handles the anti-bot work and India-region routing to stay reliable through EORS-scale traffic — even a 2,000-record hourly sweep typically completes in single-digit minutes. Pair Myntra with AJIO and Flipkart for a cross-marketplace India deal pipeline. A subtle fourth pitfall worth flagging: Myntra Insider tier members see prices 5-10% below the public price; the actor returns the public number, which is the right signal for non-Insider users but understates the deal depth for premium-tier customers.

Related use cases

Frequently asked questions

When are Myntra's big sale events?

Myntra runs End-of-Reason-Sale (EORS) twice a year in June and December, Big Fashion Days every 4-6 weeks, Republic Day Sale in January, Independence Day Sale in August, and category-specific events year-round. Discounts during EORS typically reach 50-80% off MRP; steady-state discounts sit around 30-50% for most apparel.

How do I separate real discounts from MRP inflation?

Persist the median price for each SKU over the trailing 30 days and treat any discount where current_price drops more than 15% below the 30-day median as a real event. Discounts measured against MRP alone are noisy because Myntra brands commonly set MRP 2-3x the steady-state price specifically to support discount-claim marketing.

What's the right cadence for sale-event monitoring?

Hourly during the first 24-48 hours of EORS and Big Fashion Days — the deepest discounts usually drop on day one and restock cycles change the catalogue intraday. After day three, daily cadence is sufficient. For steady-state discount tracking outside named events, daily is fine and stays cheap.

What fields tell me a product is on sale?

Three: original_price (MRP), price (current selling price), and discount_percent (computed from the two). A product with original_price = price and discount_percent = 0 is at full price. discount_percent above 50 typically indicates a sale-event listing or clearance SKU.

Can I track the same SKU over time?

Yes — the sku field (also exposed as product_id) is Myntra's stable product identifier and is the right natural key for cross-snapshot dedup and time-series joins. The url field is the human-readable equivalent. Both survive across sale events and price changes.

How does this compare to deal aggregator sites?

Aggregators like Desidime or GrabOn surface community-submitted deals — high recall but variable freshness and curation. The Myntra Scraper gives you a deterministic, structured discount-detection layer keyed off live MRP-vs-price data. Many aggregators use scrapers like this as the input layer to their public-facing dealfeeds.

Related

Try it yourself

100 free credits, no credit card.

About 30 real searches. Add the MCP to Claude or Cursor in two minutes.