DEV Community

DPJ Wholesale
DPJ Wholesale

Posted on

Scoring demand against competition across 65,000 SKUs

We run a wholesale catalog covering roughly 65,000 consumer SKUs. The question we kept coming back to is not "what sells" but "what sells and is not already saturated" — and those are different rankings.

This is how we ended up scoring demand against competition per SKU.

The naive version, and why it failed

The first attempt ranked SKUs by order volume. It produced a useful-looking list and a bad decision: almost everything at the top was a commodity with dozens of equivalent listings, so buying deeper on it meant competing on price alone.

Volume without a competition term is not an opportunity score. It is a popularity chart.

Splitting the problem in two

We stopped treating "demand" as one number and split it:

  • Demand — order frequency plus reorder rate, where reorder rate is the share of accounts that bought the same SKU a second time.
  • Competition — how many equivalent listings exist for the same functional item, normalised by category.

The score is the ratio, not the sum. A high-demand SKU in a crowded category scores like a mediocre SKU in a thin one, which matches what actually happens when you try to sell it.

Reorder rate is the part people skip

Bestseller rank tells you what sold once. Reorder rate tells you what a buyer chose again with their own money, which is the only signal that survives a season change, a price move, or a competitor listing the same item cheaper.

In our data, reorder rate is a stronger predictor of whether a line survives two seasons than unit cost is. It is also the field most catalogs do not publish.

Two properties that beat every other signal

After enough iterations, two SKU properties kept outperforming everything else:

  1. Size consistency. If the second unit does not fit the first, the customer does not come back. Storage totes and replacement lids dominate our home category for exactly this reason.
  2. A consumable attached. Parts and consumables reorder without persuasion — compost accelerator, tote lids, crate mats, ear pads, replacement tent stakes. A line with a consumable attached keeps reordering even when the main unit does not.

What we do with the score

Three buckets, treated differently:

  • Proven reorders — the same account bought it more than once. Buy deep; the repeat is the forecast.
  • First-time SKUs — buy narrow and wide: one case per variant, many variants. That buys information, not inventory.
  • Seasonal and fashion — a bet with a deadline. The price after the season boundary is the real price.

The stop rule

Stop a SKU when its reorder rate falls below the cost of the shelf space it occupies — not when it stops selling entirely. A slow mover that never reorders is consuming capacity a proven repeat line would use better.


The catalog and the scoring output are public at dpjwholesale.com if you want to poke at the numbers.

Top comments (0)