Skip to main content

How Does Size Curve Level Hopping Work?

How dynamic size curves test for thin data and borrow size shapes from wider scopes, with worked examples.

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 is Min Threshold % × the group's average. With the default 20%, anything below one fifth of the average fails. Inside a block, a size is held to Min 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

Min Threshold %

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.

Minimum Sales per Choice

100

A choice that sold less than this in the curve's time frame and filters is left out of the curve.

Prioritization

Hop Product First

Which way a thin block widens first: its partition (Hop Product First) or its location (Hop Location First).

Partition Attributes order

Order you selected them in

The last attribute is dropped first while hopping. Put the most important attribute first.

Size Summary (Edit only)

None

Like Size and Like Size Ratio for sizes that are still thin after hopping.

Add Size Curve dialog with the Level Hopping settings

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% and Minimum Sales per Choice 100, 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.

Size Summary with XS marked Insufficient data and SM assigned as its like size
  1. Click the Like Size cell next to the thin size and pick a size, for example S.

  2. Enter a Like Size Ratio, for example 0.5, meaning "XS sells about half as much as S".

  3. 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 × Gender

  • Calculated from like size S × 0.5

Tooltip on a cell filled from a wider scope
Tooltip on a cell calculated from a like size

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:

  1. Your adjusted value, if you entered one.

  2. The value from Level Hopping or a like size.

  3. 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.

Did this answer your question?