Sizecurve by Bananafest Destiny

How many of each size should I buy?

The honest answer is that nobody outside your store can tell you the quantity. What 58,595 real size runs can tell you is which sizes to carry — and that the reason usually given for keeping a range narrow does not show up in the data at all.

21 September 2026 · 246 apparel catalogues already on disk · zero new requests to anyone

This page exists because it is the question asked immediately before money is spent, and because most of the answers to it in circulation are a remembered ratio — 10/20/40/20/10, or some neighbour of it — passed between merchants without a source. We are not going to add another one. We are going to say which part of the question is answerable from outside a storefront, answer that part with a count, and be explicit about the part that is not.

The part nobody can answer for you

The quantity split is not measurable from outside your store, by us or by anyone else selling you a tool. A public catalogue shows which sizes exist and whether each one is buyable right now. It does not show units sold, and it never has — from outside a storefront that number does not exist. Any size curve quoted to you as a percentage, by us or by anyone, was measured on somebody else's customers, in a different category, at a different price, in a different country.

That matters more than it sounds. Two stores selling the same garment at the same price can have genuinely different size curves, because a curve is a property of an audience and not of a product. So the split is your data, and the rest of this page is about what can be established without it.

The size split calculator works yours out from what each size sold, what came back and what is on the shelf. Free, no login, and nothing you type leaves your browser.

The part that is measured: which sizes to carry

We read every readable alpha size run in 246 cached apparel catalogues — 58,595 runs — and counted how many carry each size. This is not a demand curve. It is a census of what the trade actually stocks.

sizeruns carrying itshare of runs
XXS12,29021.0%
XS50,72286.6%
S58,38999.6%
M58,39699.7%
L58,40199.7%
XL53,28090.9%
XXL32,44055.4%

S, M and L are not a decision. They are on 99.6% to 99.7% of runs, which is to say on all of them, and a page telling you to carry them is telling you nothing. The decisions in an apparel buy are at the two ends, and they are not symmetrical: XL is carried by 90.9% of runs and XXL by 55.4%, while XS is carried by 86.6% and XXS by 21.0%. The top of the range is stocked substantially deeper than the bottom.

The same fact stated as whole runs rather than as sizes:

runrunsshare
XS-S-M-L-XL15,31426.1%
XS-S-M-L-XL-XXL12,48021.3%
XXS-XS-S-M-L-XL-XXL5,4239.3%
XS-S-M-L4,2587.3%
S-M-L-XL-XXL3,5936.1%
XXS-XS-S-M-L-XL2,8914.9%
S-M-L-XL2,4394.2%

Two shapes account for 47.4% of everything on the shelf: the five-size run and the same run with XXL added.

We expected width to cost something. It does not

Before running the count we wrote down what we expected, in the script, so that the result could not afterwards be described as the thing we had predicted. What we wrote was: wider runs will break more often, because more sizes is more chances for one of them to be gone. That is the reason merchants give for keeping a range narrow, and we believed it.

It is not there. Of the runs carrying an M — 99.7% of them — the share where the M is currently gone, by how many sizes the run has:

sizes in the runrunsM goneshare
46,7682,70039.9%
519,7626,53033.0%
616,7324,47826.8%
710,5794,22840.0%
81,85866235.6%

There is no trend. The narrowest run in the table is not the safest one — at four sizes the M is gone 39.9% of the time, and at six sizes, the widest row with a large base, it is gone 26.8% of the time, the lowest figure here. Between four and eight sizes, which is 95.1% of every run we read, the number moves around in a band and does not climb. Whatever decides that a style's middle size is empty, the number of sizes either side of it is not it.

We are stating this narrowly on purpose. It is not evidence that extending a range is free — it costs working capital, and this measures none of that. It is evidence against one specific claim: that a wider run is more likely to end up with a hole in the middle of it. On 58,595 runs, it is not.

Runs of nine sizes and wider are excluded from the table rather than folded into the eight. There are 2,697 of them, they climb to 56.6% at ten sizes, and we do not think that is a width effect: a brand running nine or more alpha sizes is usually an extended-size specialist with a different ladder and a different customer, so the row compares brands rather than widths. Printing it next to the others would invite exactly the comparison it cannot support.

The version of this table that would have been wrong

The obvious way to build the table above is to count our own scanner’s broken verdict per width, and the first version of this script did. That column cannot be read across its own rows, and we nearly published it.

Our scanner calls a run broken when every size in its core is gone, and the core is defined as the middle half of the run: two sizes at width four, five sizes at width ten. So “broken” asks whether two sizes are missing on one row and whether five are missing on another, and the row-to-row comparison the table exists to invite is the one thing it cannot support. The figures it produced looked fine — 12.2% at four sizes rising to 49.4% at ten — and they looked like our hypothesis being confirmed, which is the most dangerous way for a wrong number to look.

What replaced it is a question with the same meaning on every row: is the M gone? M is on 99.7% of runs, so it exists unchanged at width four and at width fourteen. That is the only reason the rows may be compared, and it is why the finding reversed.

What this does not show

It does not show demand, and so it cannot give you the quantity. A public catalogue carries a buyable-or-not flag per size and no units, which means every figure on this page is about what is on the shelf, not about what left it.

It is a single reading, not a history. Every run here was in whatever state it was in on the day the catalogue was cached. A store that restocks weekly and a store that restocks twice a year both contribute one snapshot each.

Width is not randomly assigned. A brand that carries eight sizes chose to, and differs from a four-size brand in ways we cannot see — price, category, how much stock it can finance. So the table above rules out a large, simple width effect. It cannot rule out a small one hidden under those differences, and we are not claiming it does.

And the sample is apparel storefronts on one platform whose catalogues were already cached here from earlier work. It is not a sample of the industry.

So what should you actually do

Carry S, M and L, because everyone does and the data has no opinion worth hearing about it. Decide XS, XL, XXL and XXS on your own returns and sell-through, knowing that the trade stocks the top of the range deeper than the bottom. And if you were keeping the range narrow to avoid broken runs, that reason is not supported here — pick a better one, or widen it.

The quantity is the part we cannot answer from outside, and it is the part Sizecurve is for. It reads your own orders and your own returns, builds each style’s curve from demand net of returns rather than from a remembered ratio, and tells you what to reorder in which sizes. The free check below needs none of that and reads only what is public.

If you have your own numbers to hand, the size split calculator runs the same arithmetic on them: sold, returned and on hand per size in, an order per size out. No login, and nothing you type leaves your browser.

This takes you to the check with the address already filled in. Nothing is read until you press the button there — no login, no install, nothing private.

Method

Same instrument and same rules as every report here: public /products.json only, robots.txt obeyed per host, one request at a time, no accounts, no customer data. This report made no new requests at all — every figure comes from catalogues already cached on disk from earlier scans. Size labels are normalised by scan/sizes.py, which drops a style whole rather than guess at an unreadable size. The count is reproducible: python3 scan/breadth.py in the repository derives every number on this page, and the release gate recomputes them and refuses to ship if the page and the data disagree.