Skip to content
Case study Contemporary apparel · $9M · Shopify + wholesale ~9 min read

Full-price sell-through +11 points.
$340K per season, back in margin.

A $9M contemporary apparel brand was calling markdowns by feel in a recurring Monday meeting. Fast movers got cut too early. Slow movers sat past the season. Wholesale timing was ignored, then argued about after the fact. TwoDots built a per-SKU markdown recommender that reads aging, velocity, and the wholesale calendar, and outputs one decision per SKU per week.

"Every markdown feels like a coin flip. When do I cut, how deep, and how long before I cut again? Nobody in this building actually knows."
COO, contemporary apparel brand

+$340K

Recovered markdown margin per season

8 weeks

Implementation window

$58K

Total engagement cost

Illustrative case study. Composite of TwoDots engagements. Specific client name anonymised at the operator's request. Figures are drawn from real work.

The brand

Who we worked with.

A design-led contemporary apparel brand with a hybrid D2C and wholesale model. Seasonal drops. Strong wholesale distribution. The kind of business where every markdown decision is also a wholesale-relationship decision.

Category
Contemporary apparel, seasonal drops
Annual revenue
$9M
Team size
18 people
Stack
Shopify, NuOrder wholesale, Cin7, Google Sheets
Season structure
4 seasons, 6 to 8 week clear windows
Channels
Own site + 60 wholesale accounts

The problem

Markdown was the single largest margin variable, and nobody owned it.

Full-price sell-through was averaging 58% by end of season. The category benchmark is closer to 68%. Every ten-point gap on a $9M brand is roughly $900K of gross margin that runs through markdown instead of full-price channels. The math was known. The lever was not.

Markdowns were called every three weeks in a Monday meeting. The COO, the merchandising director, and the head of ecommerce debated depth by feel. Whole categories got the same cut when only a subset needed it. Fast movers got cut too early because their visible inventory pile made someone nervous. Slow movers sat past the season because nobody wanted to admit the buy was wrong.

The wholesale channel made it worse. A D2C markdown that undercut an active wholesale sell-in window generated chargeback conversations, sometimes lost accounts. The team ran the D2C markdown calendar and the wholesale calendar in different spreadsheets. Conflicts surfaced after the fact.

"The pattern we found in the data was uncomfortable. We were cutting the fast movers too early because they had visible inventory, and letting the slow movers sit because nobody wanted to admit the buy was wrong."
Merchandising director, same brand

The diagnosis

What the Fit Sprint found.

Four weeks of data joining and historical analysis. The patterns were already in the data. The team had never sat down and drawn them.

Historical markdown data

Available but scattered. Every past markdown lived in a Google Sheet with dates, percentages, and revenue impact. Nobody had joined them to SKU-level sell-through history. When we did, the patterns were legible.

Full-price sell-through baseline

Averaged 58% by end of season, meaning 42% of every buy went to markdown. Industry benchmark for the category is closer to 68%. That gap alone was worth pursuing before any markdown work.

The decision cadence

Markdowns were called in a Monday meeting once every three weeks. Depth was set by feel. Timing was set by whether Shopify had a low inventory turn number in a specific line item. Whole categories got the same cut when only a subset needed it.

The wholesale complication

60 wholesale accounts held roughly a third of the inventory across the season. Markdowns on the D2C site cannibalised wholesale sell-through and created chargeback conversations. Any markdown logic had to account for the wholesale calendar, not just the D2C one.

"I stopped defending markdown depths in the Monday meeting. The number was the number. If I disagreed with the model I could override it, but I had to say why. That single change fixed the meeting."
COO, same brand, week 6

The build

Aging, velocity, wholesale calendar. One screen a week.

Eight weeks. The model was straightforward. The interesting work was joining the D2C and wholesale views so the recommender could see both at once.

  1. 01 Days 1–10

    Season history stitched into one table

    Joined 4 seasons of historical sell-through, past markdowns, wholesale allocation, and full-price versus markdown revenue per SKU. Roughly 4,200 SKU-season rows. This dataset was the whole engagement.

  2. 02 Days 11–24

    Per-SKU aging and velocity model

    For every active SKU: current sell-through, days in season, comparable SKU velocity from prior seasons, wholesale allocation and its sell-through timing. Output: probability of clearing at full price in the remaining season window.

  3. 03 Days 20–35

    Markdown depth recommender

    For every SKU that would not clear at full price, the model recommended a first-cut depth (typically 20 to 40%) with an expected clear-through curve. Timing was set against the wholesale calendar so D2C cuts did not undercut active wholesale sell-in.

  4. 04 Days 30–42

    One screen for the Monday meeting

    The COO opens a Retool screen every Monday: which SKUs to mark down this week, at what depth, and why. Wholesale conflicts flagged in red. She approves, edits, or defers. The whole meeting compressed from 90 minutes to 20.

  5. 05 Days 43–50

    Second-cut logic and terminal markdown

    For SKUs still sitting after a first cut: recommended second-cut depth and terminal-clear threshold. The model treats a slow second cut as more damaging than a firm one, because inventory sitting in warehouse past the season is the actual enemy.

  6. 06 Ongoing

    Weekly retrain and cross-season learning

    Every completed season becomes training data for the next one. The model gets better because your season structure and your customer are consistent, even as the assortment changes.

The outcome

The margin number moved. The meeting shrunk.

Measured over the first full season after go-live, compared to the trailing-season baseline.

+11 pts

Full-price sell-through, season over season

+$340K

Recovered markdown margin per season

90 → 20 min

Monday markdown meeting

0

Wholesale chargebacks tied to markdown timing (previously 4 to 7 per season)

"The 11 points of full-price sell-through is the number that matters. The $340K is the outcome. But the number we bought this for was full-price sell-through, and that number moved."
Founder, same brand, end of first full season

The honest note

What we'd do differently.

Include wholesale in the model from week 1, not week 4. We started the engagement thinking of markdown as a D2C decision, then discovered halfway through that the wholesale allocation and sell-in timing were half the story. Retrofitting the wholesale calendar into the model worked, but it made the first version fragile. Next apparel brand with a wholesale channel: build the joint D2C + wholesale view before the first line of model code.

Common questions

Frequently asked

Is this a real client?

This is an illustrative case study composited from TwoDots engagements. The specific figures (11 points of full-price sell-through, $340K per season, 90 to 20 minute meeting) reflect real work. The named client will be published here once a real engagement is complete and consent is signed.

How much season history do you need for this to work?

Three full seasons minimum. Four is comfortable. What matters is that you have SKU-level sell-through by week for each season, plus the markdown decisions that were taken and their outcomes. If your data lives in a mix of Shopify, ERP, and Google Sheets, we can join it. That work is usually the first two weeks of the engagement.

Does this replace the merchandising team?

No. It replaces the Monday morning guesswork. The model recommends a cut, a depth, and a timing. A human merchandiser approves, adjusts, or defers, and the reason for any override becomes training data for next season. The team still holds every decision. What changes is that the debate stops being about instincts and starts being about the specific SKUs where instinct and model disagree.

How does this handle wholesale accounts?

Wholesale is treated as a first-class input, not an afterthought. The model reads your wholesale allocation, sell-in timing, and reorder patterns. A D2C markdown that would undercut a wholesale account whose sell-in window is still open is flagged before it goes live. This is the change we would build first if we ran the engagement again.

What does this engagement cost?

$10K AI Fit Sprint (4 weeks of data joining and historical analysis) plus $48K implementation (8 weeks). $58K total. For a brand doing $9M with a season-over-season markdown gap of $340K, payback is inside the first full season.

How does this apply to my apparel brand?

The pattern holds for seasonal apparel brands doing $3M to $30M with at least 3 seasons of history and any of the following: full-price sell-through below 65%, markdown decisions made by feel in a recurring meeting, or a wholesale channel that complicates the D2C markdown calendar. If two of those three are true, book a call.

Same shape of problem?

Book a 30-minute call.

Bring three seasons of sell-through history and your last markdown calendar. We will tell you honestly whether a per-SKU markdown model will move margin in your business right now, and roughly what an engagement would look like.

The Retail AI Implementation Weekly

Practical AI implementation for e-commerce operators. No hype.