190 of 298 catalogues (63.8%) had a style on sale with its core sizes gone and two or more other sizes still on the shelf. Among the 101 brands carrying 200 or more size runs, it was 95 (94.1%). A month later, two in three of those stranded runs that could still be compared were still stranded.
Every Shopify storefront answers /products.json without a login. It returns each product's options, its variants, and whether each variant is available. No inventory counts, no customer data, nothing private. It is enough to tell, from outside a store, whether a style's size run has a hole in the middle of it.
So we asked a question we had been asserting the answer to: does the problem we built an app for actually happen?
A run is broken when every size in the positional core is unavailable while the style is still buyable. Sold out entirely is not broken — nothing is being misrepresented to anyone. The damage is the style that still reads "in stock" while the part people actually buy is not there:
Judged per colourway, never pooled. Pool the colours and an in-stock black M covers for the sold-out white M, and every broken run disappears.
The diagram above is a claim: that the run breaks in the middle, not at random. We asserted it here first and only counted it afterwards — it holds — the middle of a broken run is empty roughly nine times in ten, and it held again on 159 stores we had not read when we published that.
The definition was written down and frozen before any store was scanned, along with a kill criterion: if fewer than about 10% of buyable styles came back broken, we would say so and stop selling that half of the product. A threshold picked after seeing the data measures the person who picked it.
One sample of 68 brands from public "best Shopify stores" listicles. A second of 62 independent labels from a directory with no overlap in how it was compiled. The second sample exists because the first could validate the thesis and still say nothing useful: those brands mostly have a merchandising team already.
| Of styles still buyable | listicle brands | independent labels |
|---|---|---|
| whole run | 40.0% | 33.8% |
| some of the core gone | 38.0% | 40.8% |
| most of the core gone | 12.2% | 12.9% |
| broken — all of the core gone | 9.7% | 12.5% |
| stores with at least one | 47 of 54 | 35 of 44 |
Withdrawn 19 September 2026: this row led with 84% of stores had one. That figure did not survive tripling the sample, for a reason worth reading: the headline moved. The other three figures are the 109-store scan's own and stand as published; the fourth card now carries the merge’s figure.
The two samples were compiled by different people for different reasons and they land 2.8 points apart — 9.7% and 12.5%. What replicates across them is the order of magnitude, not the decimal: about one buyable style in ten, from two lists built by strangers who were not answering our question. An earlier pass had them 1.4 points apart and we said so; the gap widened when we fixed a bug in our own parser, which is a fair warning about how much weight the gap itself can carry.
About three in four broken styles have exactly one size left. 72.7% in the first sample, 71.8% in the second.
A run with one size standing is technically broken and practically sold through. If a merchant looks at that and says "it's just sold out", they are right, and no app should be telling them otherwise.
Styles with two or more sizes still sitting there — the ones where there is genuinely stock that cannot move — are 2.8% of buyable styles across the 438-store merge. That is the conservative version, and we would rather publish it than the flattering one.
This paragraph said 2.6% and 3.5% until 20 September 2026. Those were the two halves of the 109-store sample, and they stayed here after the merge below replaced every other figure on this page — so the page led with an old number while its own comparison table, a few hundred words down, printed the new one. The correction is upward, which is the direction that flatters us, and it is being made for that reason and against it: a page that only corrects downward is not correcting, it is negotiating.
What survives either way is the store-level finding: four in five stores have at least one style on sale with the middle of its run missing. Not most of a catalogue. One style, somewhere, that nobody has looked at. [Corrected 19 September 2026: this sentence picked the wrong survivor. The store-level figure is precisely the one that did not survive a larger sample; the per-style rate did. See the headline moved.]
Is one of them yours? The check below reads your public catalogue the way this scan read theirs, names the styles, and emails you the list.
A measurement that lists no errors is a measurement nobody checked.
Our size grammar knew xx-large and xxlarge and did not know XX Large. Every product spelled that way was discarded. It is now handled as a rule — any <prefix> large/small/medium resolves — rather than by adding one more row to a table that had already failed to have the row we needed.
ONE SIZE, OS, Default Title — 426 products — are not sizes we failed to read. They are products without a size run. Counting them as unreadable inflated our own coverage hole by about a third of itself.
The first sweep kept our analysis of each catalogue and not the catalogue. So fixing the parser meant fetching all 130 stores a second time — and that sweep came back 429 Too Many Requests on 48 of 68. The budget a stranger's server extends you is measured in hours, and we had spent ours re-downloading data we had already been given, to fix a mistake that was ours. Raw responses are cached before anything is computed now, so a fix to our own grammar costs us a re-read of a directory and costs a stranger nothing.
Pointed at real storefronts, the scanner turned up two faults in the product this research was meant to support. Our "share of demand missing" was summed per variant instead of per size, so a style in four colours with M gone in all four would have emailed a merchant that 160% of demand was missing, and told them to "restock M and M and M". And our size-option matcher was anchored to exactly Size, so real-world names like Size (Regular) and Waist were silently dropped — which could have told an apparel store it had no sized products at all. Both were invisible from inside our own test fixtures. Both are fixed.
A 429 Too Many Requests was being written into the same field as a 404, so 17 stores that had only asked us to slow down were filed as having refused — and then permanently excluded from the sample and never retried. The bias runs one way: the stores that rate-limit you are the stores with the largest catalogues, which are the stores most likely to have a broken run in them. Those records were deleted, the scanner now waits out a 429 and slows down globally rather than per host, and nothing retryable is cached as a result.
The numbers above are a second pass, re-fetched and re-judged. The parser had been filing ONE SIZE products under "size unreadable" rather than "has no size run", which inflated our coverage hole and shrank the denominator: unreadable fell from 34.8% to 19.4% of sized products in the first sample and from 17.9% to 5.1% in the second. Almost everything downstream moved with it.
| Figure | as first published | now |
|---|---|---|
| products read | 49,176 | 50,090 |
| readable size runs | 25,639 | 29,129 |
| broken runs | 2,256 | 2,590 |
| broken rate, listicle brands | 10.0% | 9.7% |
| broken rate, independent labels | 11.4% | 12.5% |
| one size left, independent labels | 77.2% | 71.8% |
| stores with at least one | 84% | 83.7% |
The headline is the one figure that did not move. That is luck rather than virtue — it could as easily have gone the other way, and the old numbers are printed here rather than overwritten because a research page whose figures change without a note is a page nobody can cite.
The paragraph above says the headline surviving a parser fix was "luck rather than virtue — it could as easily have gone the other way". On 19 September 2026 we merged every scan we had ever run, keeping the most recent record per store: 438 stores, of which 354 answered and 298 returned readable size runs, 122,425 products and 64,268 readable size runs — roughly three times the sample behind everything above. It went the other way.
The two product totals are worth keeping apart, because this site got them confused for a week: 122,425 is every product on the 354 stores that answered. The 298 that returned readable size runs hold 111,774 of them. A footer link here read “298 apparel catalogues, 122,425 products” until 21 September, which overstated the sample by 9.5%. The size-run count is the same number either way — a store with no size runs contributes none — which is why 64,268 is the figure the footers carry now. Every row is published: the dataset.
| Figure | 109-store sample | 438-store merge |
|---|---|---|
| broken rate, buyable styles | 9.7% / 12.5% | 10.3% |
| of broken styles, one size left | 72.7% / 71.8% | 72.6% |
| two or more sizes left, of buyable | 2.6% / 3.5% | 2.8% |
| stores with at least one | 84% | 78.5% |
Three of the four replicated to within a few tenths: the broken rate across buyable styles came back at 10.3%, and 72.6% of broken styles still had exactly one size left. The one that moved is the one we had been leading with, and the reason it moved is not that the world changed. The first three are rates per style. The fourth is a rate per store, and a store is not a fixed unit: it can hold four styles or eight hundred. The stores added in September came from curated indexes of very small independent labels, and a brand with four styles mostly has no broken run because it barely has runs at all.
A figure we can move by choosing who to scan was never a fact about stores. It was a fact about how many small catalogues happened to be in the batch. Sampling the other way would have pushed it above the figure we first published just as easily.
Split by how much catalogue there is to break. Two columns, because there are two defensible ways to count a broken run and we would rather show you both than pick the flattering one. Broken is the strict verdict — every core size in the run sold out, the style still listed. Stranded is that and two or more sizes still on sale: real stock sitting in the ends of a run that no shopper can complete. A broken style down to a single size is, in practice, sold through, and the second column drops it.
| Stores with at least this many readable runs | stores | with a broken run | rate | with stock stranded | rate |
|---|---|---|---|---|---|
| 1 or more | 298 | 234 | 78.5% | 190 | 63.8% |
| 5 or more | 280 | 231 | 82.5% | 189 | 67.5% |
| 10 or more | 265 | 227 | 85.7% | 187 | 70.6% |
| 20 or more | 240 | 216 | 90.0% | 183 | 76.2% |
| 50 or more | 202 | 191 | 94.6% | 168 | 83.2% |
| 100 or more | 150 | 146 | 97.3% | 135 | 90.0% |
| 200 or more | 101 | 101 | 100.0% | 95 | 94.1% |
44 of the 298 catalogues are larger than we read: we took the first 1,000 products each storefront returns, which are its most recently published. A partly read catalogue has fewer chances to show a stranded style, so these rates are a floor. Among the 254 catalogues read whole, 153 had stock stranded, or 60.2%. That is lower than 63.8%, not higher, because the catalogues read whole are the smaller ones, and the table shows how much size alone moves the rate.
The stranded column was added 23 September 2026, and it is the column to read. Until that date every store-level figure on this site was the left-hand one, while the app itself had been rewritten three days earlier to report only the right-hand one. Both are true and they are not the same claim: a merchant could read 78.5% of stores have a broken size run, install the tool, and be told nothing on their store is stranded — because those are two measurements wearing one word. Nothing in the left column has been changed or withdrawn. What has changed is which one we lead with, and the answer is the smaller one, because it is the one the product delivers.
Re-derived 24 September 2026, and every store-level figure moved up: 78.2% → 78.5%, 63.1% → 63.8%, 94 of the largest 100 → 95 of the largest 101. No store was rescanned. Our size grammar read “Extra Extra Large”, “Extra Extra Small” and “Extra Extra Extra Large” as unplaceable, and one unplaceable value discards the whole product — so a brand spelling its sizes out in full mostly vanished from the sample. Fixing that on 23 September added 1,014 readable size runs across four of the 298 catalogues; one of them went from 1 readable run to 892 and crossed into the bottom row of the table above, which is why the largest group is 101 brands and no longer 100. Every row of every table on this page was recomputed from the same cached catalogues, not re-fetched.
The part worth admitting is the timing. The parser fix shipped on 23 September and the size-census page was republished against it the same day, because that page recomputes from the catalogues on every release. This page does not — it is built from per-store scan records, and nothing checked those records against the catalogues they were a reading of. So for a day the site carried a better parser and an older set of numbers, and every test passed, because each one faithfully compared a page to a stale record. The missing check now runs on every release: all 354 cached catalogues are re-read and each record has to come back identical.
The two columns converge as catalogues get bigger: 15 points apart across all 298 stores, 6 points apart among the largest 101. That is not a coincidence and it is not reassuring. A small catalogue has few runs, so the one broken run it has is more likely to be a style genuinely sold down to its last size. A large catalogue breaks runs faster than it retires them. The gap measures how much of the loose figure is made of stores whose only qualifying style was, in fairness, finished.
Every one of the 101 brands in the sample carrying 200 or more readable size runs had at least one style with its entire core size range sold out while the style was still on sale. Not most of them. All 101 — and 95 of them had one with two or more sizes still on the shelf behind the hole, which is the version of that sentence we now lead with. We are more confident in that sentence than in the store-level figure it replaces, because it says what it is counting in the same breath as the number — and it is the sentence that was available the whole time.
The four cards at the top of this page still describe the 109-store sample they were computed from, and the two-sample table still reports what those two samples said. Nothing above has been overwritten. This section is what a bigger sample did to it.
The obvious answer to 190 of 298 is that a broken run at the end of a season is clearance, and clearance is not a problem. If that were the whole story, the runs would have gone the way clearance goes: sold out, or taken down. So on 19 October 2026 we read the same 298 catalogues again, with the same scanner and the same method, 30 to 35 days after the September reads (14 to 19 September), and looked for every stranded run behind the figure above.
Of the stranded runs that still list the same sizes, 864 of 1,279 (67.6%) are still stranded. 1,049 of them (82.0%) are still on sale with the core gone.
By catalogue, 156 of the 190 (82.1%) still have one of the same runs stranded. New stranding was 0.7% of the runs that were not stranded in September (469 of 63,989, counted over every colourway rather than one per style). The store-level rate now is 185 of the 296 catalogues read again (62.5%), against 63.8% in September.
September’s figure counts one stranded run per style, 1,581 in all. This is where each of them went:
| September’s 1,581 stranded runs, in October | runs | of 1,581 |
|---|---|---|
| still stranded | 864 | 54.6% |
| core still gone, down to one other size | 185 | 11.7% |
| core back in stock | 178 | 11.3% |
| sold out | 52 | 3.3% |
| sizes changed | 15 | 0.9% |
| product removed | 112 | 7.1% |
| not seen under the read cap | 175 | 11.1% |
The first four rows are the 1,279 runs that list the same sizes both times, and they are what the 67.6% is a share of. The last three cannot be compared. “Not seen” is a product missing from a read that stopped at 1,000 products — 44 catalogues in September, 41 now — and a cap drops the oldest styles first, which is where a stale stranded run would sit. “Product removed” means missing from two reads that were both whole, except that a September read which stopped part-way was not marked as one, so it was taken as whole. Counted against all 1,581, still stranded is 54.6%.
No prices were kept in September, so this cannot say whether these runs are now marked down. It shows they had not cleared in a month, not that nobody is trying to clear them.
Matched by product handle and colour, not product id. September’s reads kept no product id, so each run was found again by its product’s handle — the store’s own address for the product — and its colourway, and its length where it has one. A product renamed since September drops out as removed or not seen.
“Available” is the store’s own flag. It says a size can be bought, not how many are left, and a store that sells on backorder reads as in stock.
Same convenience sample, with every caveat above: it is not Shopify apparel as a whole.
Two stores could not be read again: one now disallows the read in its robots.txt, and one could not be reached. Neither is among the 190.
Public endpoint only, and only what it returns. robots.txt fetched and obeyed per host. A user-agent naming the app and a contact address. One request at a time with a floor between them. No accounts, no logins, no customer data, nothing written anywhere. A refusal — 401, 403, 404, or a disallow — was recorded and never retried. A 429 is not a refusal: it is the host saying "not this fast", which is a statement about our rate and not about whether we may read the page, so it is waited out and never written down as an answer. 16 of 130 stores refused or returned something unreadable, and all 16 are named in the output rather than quietly dropped. A further 5 failed transiently on the last pass and are deliberately absent: recording those as refusals is exactly the bug described below.
One deliberate limit: shoe sizes (UK 7 / EU 40 / US 9) and combined waist-and-length (W32 L34) are still refused rather than guessed at. Reading one axis of a two-axis product as its size curve is its own bug.
The scan demands that every core size be gone. Sizecurve itself alerts when 30% of a style's demand curve is missing, or when more than half of the core sizes a store names for itself are gone, which happens a good deal earlier — and it can weight by real demand, which from outside a store is invisible. So 10% is not an estimate of the problem. It is the part of the problem visible to a stranger with no sales history.