When a store or partition has too little sales history to trust its own size curve, Toolio borrows the size curve from a wider scope that has enough data. This is called Level Hopping. The block keeps its own sales volume in the backend. Only the split across sizes changes (based on fallback weights assigned).
This article walks through every step with a single small example, so you can see why a value changed and which setting to adjust.
💡 Level Hopping applies to Dynamic Size Curves and is behind a feature flag. If you don't see the settings below, ask your Customer Success Manager to enable it for your account.
Use Cases
Smaller stores whose own history would produce a noisy size curve.
Partitions (for example a small category) with too few sales to trust.
Fringe sizes, such as XXS or XXL, that barely sell in some stores.
New or rarely sold sizes that need a stand-in, using a Like Size.
Key Terms
Block: one location × one partition group. For a curve partitioned by Gender and Category, Store A × Womens · Tops is one block. A size curve is made of many blocks.
Data points: the number of weeks behind a size's sales, counted per choice and week. They show how much evidence the sales are based on. When Good Weeks is enabled, only good weeks are counted. Otherwise, every week with a sales or inventory record is counted. See Dynamic and Static Size Curves.
Threshold: the minimum a value needs to pass a test, set by
Min Threshold %. For partition groups, locations and sizes across the whole curve, it isMin Threshold %× the group's average. With the default 20%, anything below one fifth of the average fails. Inside a block, a size is held toMin Threshold %of its own share of the whole curve instead (Step 4), so a size that usually sells little is not failed for selling little.Wider scope: a larger group to borrow a size curve from. For example, the same store across all Womens categories, or every Retail store in Womens · Tops.
Settings on Each Curve
Go to Settings > Intelligence > Size Curves and click Add, or right-click a curve and click Edit. The settings appear in the Dynamic section, below Exclude Markdown Sales.
Setting | Default | What it controls |
| 20% | How thin is too thin. A partition group, location or size below this share of its group's average fails. Inside a block, a size fails below this share of its usual share of the curve. |
| 100 | A choice that sold less than this in the curve's time frame and filters is left out of the curve. |
|
| Which way a thin block widens first: its partition ( |
| Order you selected them in | The last attribute is dropped first while hopping. Put the most important attribute first. |
| None | Like Size and Like Size Ratio for sizes that are still thin after hopping. |
Changes to Min Threshold %, Prioritization, partition attribute order and like sizes are re-applied to the current curve without regenerating it. The update runs in the background, so the new values show once it finishes. A curve last generated before Level Hopping was turned on needs one generation first. Changes to Minimum Sales per Choice or to which partition attributes are used take effect at the next generation.
The Example Curve
Every step below uses the same small curve:
Partition Attributes: Gender, then Category. This gives four partition groups: Womens · Tops, Womens · Dresses, Mens · Tops and Mens · Outerwear.
Sizes: XS, S, M, L, XL and XXL.
Locations: Retail Stores A, B, C and D, plus one Ecom location.
Min Threshold %20% andMinimum Sales per Choice100, the defaults.
Toolio runs the steps in this order. The location test only looks at partition groups that passed Step 2. The size tests in Step 4 use all of the curve's data, including partitions and locations that failed.
Step 1: Leave Out Low-Selling Choices
Before any test runs, Toolio adds up each choice's sales across all locations, within the curve's time frame and filters. A choice that sold less than Minimum Sales per Choice is left out of the curve completely. We only use the remaining larger choices for size curve calculations.
Choice (Mens · Outerwear) | Sales | Result |
Parka - Green | 200 | Kept |
Field Jacket - Blue | 100 | Kept (exactly at the minimum) |
Rain Shell - Red | 80 | Left out |
Vest - Black | 40 | Left out |
This total is taken before the Good Weeks filter. If no choice reaches the minimum, the curve is empty and shows a warning.
Step 2: Test Each Partition Group
Each partition group's total sales and total data points are compared with the average partition group in the curve. A partition group must pass both.
Partition group | Sales | Sales threshold (20% × 3,000) | Data points | Data points threshold (20% × 5,000) | Result |
Womens · Tops | 6,000 | 600 | 9,000 | 1,000 | Pass |
Womens · Dresses | 3,000 | 600 | 5,000 | 1,000 | Pass |
Mens · Tops | 2,700 | 600 | 4,600 | 1,000 | Pass |
Mens · Outerwear | 300 | 600 | 1,400 | 1,000 | Fail (sales) |
Average | 3,000 | 5,000 |
Mens · Outerwear has enough data points but too few sales, so it fails. Because it fails, every Mens · Outerwear block in every store borrows its size curve in Step 5. Its data is also kept out of every wider scope calculation, so it never affects another block.
Step 3: Test Each Location, Within Each Partition
Within each partition group that passed, each store is compared with the other stores in the same channel that sell that partition. A store is judged per partition, not on its overall size.
Womens · Tops, Retail stores
Store | Sales | Sales threshold (20% × 1,250) | Data points | Data points threshold (20% × 1,750) | Result |
Store A | 2,000 | 250 | 2,400 | 350 | Pass |
Store B | 1,500 | 250 | 2,200 | 350 | Pass |
Store C | 200 | 250 | 400 | 350 | Fail (sales) |
Store D | 1,300 | 250 | 2,000 | 350 | Pass |
Average | 1,250 | 1,750 |
Womens · Dresses, Retail stores
Store | Sales | Sales threshold (20% × 675) | Data points | Data points threshold (20% × 862.5) | Result |
Store A | 900 | 135 | 1,200 | 172.5 | Pass |
Store B | 700 | 135 | 1,100 | 172.5 | Pass |
Store C | 600 | 135 | 1,000 | 172.5 | Pass |
Store D | 500 | 135 | 150 | 172.5 | Fail (data points) |
Average | 675 | 862.5 |
Store C sells very few Tops but plenty of Dresses. Its Tops block borrows a size curve, while its Dresses block keeps its own and can be used by other blocks.
Store D shows why data points matter. It sold 500 Dresses, which clears the sales threshold, but those sales came from only 150 choice-weeks, for example a few big promotion weeks. That is too little evidence to trust, so its Dresses block borrows a size curve too.
The Ecom location is only compared with other Ecom locations, never with Retail stores.
Step 4: Test the Sizes
The sizes are tested in two ways.
Across the Whole Curve
Each size's total sales and data points across all locations and partitions are compared with the average size.
Size | Sales | Sales threshold (20% × 2,000) | Data points | Data points threshold (20% × 3,333) | Result |
XS | 150 | 400 | 600 | 667 | Insufficient data |
S | 2,607 | 400 | 4,200 | 667 | Pass |
M | 3,792 | 400 | 4,500 | 667 | Pass |
L | 3,081 | 400 | 4,300 | 667 | Pass |
XL | 1,422 | 400 | 3,800 | 667 | Pass |
XXL | 948 | 400 | 2,600 | 667 | Pass |
Total | 12,000 | 20,000 |
A size that fails here is too thin almost everywhere, so borrowing from a wider scope won't fix it. Toolio marks it as insufficient data, shows a warning, and recommends a like size (Step 7). It is left out of the per-block size test below, so XS alone does not make every block fall back.
Inside Each Block
Within each block, each size's share is compared with its share of the whole curve. A size fails if its share in the block is below 20% of its curve share. This is checked on sales and on data points, and a size must pass both. XS is left out, because it already failed across the whole curve.
Store A × Womens · Tops, sales (block total 2,000)
Size | Sales | Share in block | Curve share | Threshold (20% × curve share) | Result |
S | 460 | 23.0% | 22.0% | 4.4% | Pass |
M | 680 | 34.0% | 32.0% | 6.4% | Pass |
L | 560 | 28.0% | 26.0% | 5.2% | Pass |
XL | 280 | 14.0% | 12.0% | 2.4% | Pass |
XXL | 20 | 1.0% | 8.0% | 1.6% | Fail |
Store A × Womens · Tops, data points (block total 2,400)
Size | Data points | Share in block | Curve share | Threshold (20% × curve share) | Result |
S | 560 | 23.3% | 21.6% | 4.3% | Pass |
M | 640 | 26.7% | 23.2% | 4.6% | Pass |
L | 600 | 25.0% | 22.2% | 4.4% | Pass |
XL | 540 | 22.5% | 19.6% | 3.9% | Pass |
XXL | 60 | 2.5% | 13.4% | 2.7% | Fail |
Store A is a strong store and Womens · Tops is a strong partition. The block still borrows a size curve, because one size inside it is too thin. A size with no history at all in a block counts as 0 and fails the same way.
Step 5: Hop to a Wider Scope
A block that failed any test hops up a ladder of wider scopes. It stops at the first scope that has sales. Only blocks that passed every test feed these scopes, so thin data never spreads to other blocks.
The ladder depends on Prioritization and on the partition attribute order. For our curve (Gender, then Category):
Step | Hop Product First (default) | Hop Location First |
1 | Location × Gender | Channel × Gender + Category |
2 | Location × All partitions | All locations × Gender + Category |
3 | Channel × Gender + Category | Location × Gender |
4 | Channel × Gender | Channel × Gender |
5 | Channel × All partitions | All locations × Gender |
6 | All locations × Gender + Category | Location × All partitions |
7 | All locations × Gender | Channel × All partitions |
8 | All locations × All partitions | All locations × All partitions |
Hop Product First stays in the same store as long as it can and widens the product first. Use it when stores differ a lot from each other.
Hop Location First keeps the exact partition as long as it can and widens the location first. Use it when categories differ a lot from each other.
Example: Store C × Womens · Tops
Store C failed the location test for Tops (Step 3), so its 200 units need a size curve from somewhere else.
Size | Hop Product First: Step 1, Store C × Womens (Store C Dresses) | Hop Location First: Step 1, Retail × Womens · Tops (Stores B + D) |
S | 23% → 46 | 23% → 46 |
M | 31% → 62 | 32% → 64 |
L | 25% → 50 | 26% → 52 |
XL | 12% → 24 | 11% → 22 |
XXL | 9% → 18 | 8% → 16 |
Total | 200 | 200 |
With Hop Product First, Store C borrows from its own Dresses, because Store C × Womens · Tops failed and Dresses is the only Womens partition left in that store. With Hop Location First, it borrows from the other Retail stores' Tops. Store A is not in that pool, because its Tops block failed the size test in Step 4.
Example: Mens · Outerwear
Every Mens · Outerwear block failed in Step 2. With Hop Location First, steps 1 and 2 (Channel and All locations × Mens · Outerwear) are empty, since none of those blocks passed. The block moves on to step 3, Location × Mens, and borrows from the store's own Mens · Tops.
If no step on the ladder has any sales, the block keeps its own size curve and a warning message is shown.
❗ Hopping can drop every partition attribute, including Gender. A Womens block can then borrow a size curve built partly from Mens sales. When sizes sell very differently across partitions, build a separate size curve for each one, for example one for Mens and one for Womens.
Step 6: Fill the Block
The block keeps its own total. Every size in the block, not only the one that failed, takes the borrowed size curve.
New value = block total × (size sales in wider scope ÷ total sales in wider scope)
Store A × Womens · Tops, filled from step 1 of Hop Product First (Store A × Womens). The only Womens block in Store A that passed is Dresses, which sold 900 units.
Size | Original | Store A Dresses | Dresses share | New value | Change |
XS | 0 | 0 | 0% | 0 | 0 |
S | 460 | 207 | 23% | 460 | 0 |
M | 680 | 279 | 31% | 620 | −60 |
L | 560 | 234 | 26% | 520 | −40 |
XL | 280 | 108 | 12% | 240 | −40 |
XXL | 20 | 72 | 8% | 160 | +140 |
Total | 2,000 | 900 | 100% | 2,000 | 0 |
The store still gets 2,000 units' worth of weight, so its volume compared with other stores doesn't change. XXL is fixed. XS is still 0, because nobody sells XS in this scope either. Step 7 handles that.
Step 7: Assign Like Sizes
A size that is still thin after hopping, like XS here, can borrow from a similar size. Open the curve with Edit and expand the Size Summary section. Sizes marked Insufficient data are the ones to fix.
Click the
Like Sizecell next to the thin size and pick a size, for example S.Enter a
Like Size Ratio, for example 0.5, meaning "XS sells about half as much as S".Click
Save. The curve is recalculated in the background.
In every block, the size gets its like size's value × the ratio. Then the whole block is scaled back to its own total.
Store A × Womens · Tops, XS = S × 0.5
Size | After Step 6 | XS = 460 × 0.5 | Scaled back to 2,000 | Share |
XS | 0 | 230 | 206 | 10.3% |
S | 460 | 460 | 413 | 20.6% |
M | 620 | 620 | 556 | 27.8% |
L | 520 | 520 | 466 | 23.3% |
XL | 240 | 240 | 215 | 10.8% |
XXL | 160 | 160 | 144 | 7.2% |
Total | 2,000 | 2,230 | 2,000 | 100% |
Rules for like sizes:
The ratio must be greater than 0 and at most 2.
A like size must be another size on the curve. It can't be thin itself or have a like size of its own.
A size used as a like size can't be given a like size.
Clearing the like size also clears the ratio.
Where You See the Results
Fallback Markers in the Spread Grid
On the curve's spread view, a System % of TTL cell that was filled by Level Hopping or a like size shows an info marker in its corner. Hover over it to see where the value came from:
Filled from a wider scope: Location × GenderCalculated from like size S × 0.5
Warnings
A warning banner above the spread grid explains problems with the curve:
No sales to build the size curve from: no choice reached
Minimum Sales per Choice.N of M sizes have insufficient data: sizes that failed the curve-wide test and have no like size yet.
N data blocks have insufficient data and no wider scope to borrow a size shape from: blocks that reached the end of the ladder.
In the Edit dialog, a yellow banner lists the sizes that don't have enough data and points you to Size Summary. Once every thin size has a like size, it changes to Like sizes assigned. Save to recalculate the size curve.
Your Overrides
Your own edits always win. Toolio uses the value in this order:
Your adjusted value, if you entered one.
The value from Level Hopping or a like size.
The curve's own calculated value.
Level Hopping never overwrites an adjusted value. To go back to the system value, right-click and use Remove Overrides.
FAQs
Why did a block from a big store borrow a size curve?
The size test runs inside every block (Step 4). A strong store in a strong partition still borrows if one size in that block is far below its usual share. Check the size with the lowest share in that block.
Why does a size still show insufficient data after Level Hopping?
The size is thin across the whole curve, so no wider scope can fix it. Assign it a like size and ratio in Size Summary. You can also lower Min Threshold %, or remove the size and build a separate curve from the products that carry it.
Why is a cell I never edited shown as overridden?
A stored adjusted value now counts as an override even when it equals the system value. Older curves can have these values from earlier edits. Use Remove Overrides to clear them.
How do I change the partition attribute order?
Attributes are used in the order you select them in Partition Attributes. The last one is dropped first while hopping. To change the order, remove the attributes and select them again in the order you want.
Can I stop Level Hopping from crossing an attribute, like Mens and Womens?
Not within one curve. Level Hopping can drop every partition attribute, so a Mens block can end up borrowing a size curve built from Womens sales at the All partitions steps. Putting Division first in Partition Attributes only makes it the last attribute dropped. It does not stop the hop.
When sizes sell very differently across an attribute, build a separate curve for each value. For example, create one curve with the filter Division equals Mens and another with Division equals Womens. Each curve then only borrows within its own division.
Does Level Hopping work without Good Weeks?
Yes. The tests work the same way, on both sales and data points. Good Weeks only changes which weeks are counted as data points: only good weeks when it is enabled, and every week with a sales or inventory record when it is not.
When do my setting changes take effect?
Changes to Min Threshold %, Prioritization, attribute order and like sizes are re-applied without regenerating, once the background update finishes. This needs the curve to have been generated at least once with Level Hopping on. Changes to Minimum Sales per Choice or to which partition attributes are used apply at the next generation.
Do I need to regenerate my existing curves?
Not to keep them working. Existing curves keep working as they do today once Level Hopping is turned on. To use Level Hopping, a curve needs one generation: either its next scheduled update, based on Update Cadence, or right-click and click Generate. Until then, changes to the Level Hopping settings wait for that generation. New settings start at their defaults, and your overrides are kept.
Should I lower Min Threshold %?
Lower it when too many blocks borrow and you trust your stores' own size curves. Raise it when noisy, small stores are distorting allocations.
