Shopify Range Setting: Fix "Range Parameters Must Have at Most 101 Steps"
The Shopify range setting enforces a hard cap of 101 steps. Learn exactly why it triggers, how to calculate your way out of it, and when to use number
The error "Range settings must have at most 101 steps" means your min, max, and step combination produces more than 101 possible slider positions. Fix it by widening step, narrowing the max, or switching to the number input type when you genuinely need a large numeric range. The root cause is always arithmetic, not a bug.
Key takeaways
- Shopify caps range settings at 101 steps maximum (enforced at schema parse time).
- The step count is calculated as
(max - min) / step; that result must be 100 or fewer. - The error appears in the Shopify theme editor and blocks the section from rendering.
- Changing
step: 1to a higher integer is usually the fastest fix. - When you need an uncapped integer input, replace
rangewithnumber.
What is the 101-step rule?
Shopify's range input type renders a slider in the theme editor. The platform enforces a hard cap: the slider can have at most 101 positions (steps 0 through 100, inclusive). Shopify calculates the number of steps internally as:
steps = (max - min) / step
If that calculation produces a value greater than 100, Shopify rejects the schema and throws:
Error: Invalid schema: setting with id="[your_id]" step invalid.
Range settings must have at most 101 steps.
This validation runs every time the theme editor loads the section, so the section becomes completely non-functional until the schema is corrected.
Note: As Shopify confirmed in their input settings documentation, all four range attributes (min,max,step,default) must be numeric values, not strings. Passing a string for any of them also throws an error.
The three most common triggers
These are the patterns I see most often when merchants or junior developers hit this wall:
- Large range with
step: 1, Settingmin: 0, max: 500, step: 1creates 500 steps. This is the most frequent case. - Bumping an existing max without adjusting step, A developer changes
maxfrom 100 to 300 on a logo width slider, forgetting the step stays at 1. - Copying a range from an HTML spec example, Standard HTML allows any step count; Shopify does not.
Real community examples include a free_shipping_threshold slider set to min: 0, max: 500, step: 1 and a logo_max_width slider pushed from 300px to 550px without recalculating the step.
How to calculate whether your range is valid
Before writing a single line of schema, run this check:
(max - min) / step <= 100 → valid
(max - min) / step > 100 → will throw the 101-step error
Quick examples
| min | max | step | Steps calculated | Valid? |
|---|---|---|---|---|
| 0 | 100 | 1 | 100 | Yes |
| 0 | 500 | 1 | 500 | No |
| 0 | 500 | 5 | 100 | Yes |
| 0 | 1000 | 10 | 100 | Yes |
| 10 | 210 | 2 | 100 | Yes |
| 0 | 300 | 1 | 300 | No |
| 0 | 300 | 3 | 100 | Yes |
The boundary is exactly 100 calculated steps (which gives 101 slider positions including the start point). Any value above 100 is rejected.
Three ways to fix it
1. Increase the step value
This is the correct fix in most cases. A padding slider that goes from 0 to 200px in steps of 2 gives merchants 101 positions and stays within the limit.
{
"type": "range",
"id": "section_padding",
"label": "Section padding",
"min": 0,
"max": 200,
"step": 2,
"unit": "px",
"default": 40
}
When to use: Almost always. Most design values (padding, font sizes, opacity percentages) do not need single-unit precision across a wide range.
2. Narrow the max value
If single-step precision matters (for example, a 1-to-5 star rating or a 0-to-100 percentage), simply reduce max to stay within 100 steps at step: 1.
{
"type": "range",
"id": "free_shipping_threshold",
"label": "Free shipping threshold",
"min": 0,
"max": 100,
"step": 1,
"unit": "$",
"default": 50
}
This community-verified fix was the accepted solution for the free_shipping_threshold case that spread across the Shopify forums.
3. Switch to the number type
When you genuinely need a merchant to input any integer (an animation delay in milliseconds, a product count above 100, a threshold that could be 0-9999), the range type is the wrong tool entirely. Use number instead.
{
"type": "number",
"id": "free_shipping_threshold",
"label": "Free shipping threshold ($)",
"default": 50
}
The number type accepts any integer, has no slider cap, and is accessed identically in Liquid via section.settings.free_shipping_threshold. The tradeoff is a text input instead of a slider, so merchants can enter out-of-range values. If guardrails matter, add a Liquid check in your section code.
Choosing the right fix: a decision table
| Situation | Recommended fix | Why |
|---|---|---|
| Padding / spacing slider, wide range | Increase step to 2, 4, or 5 | Precision rarely needed at single pixel |
| Percentage or 0-100 value | Keep step: 1, set max: 100 | 100 steps fits exactly |
| Currency threshold (small amounts) | Set max to your realistic ceiling | Avoids impractical high values |
| Large integer, no upper bound | Switch to number type | Removes the cap entirely |
| Opacity or scale (0.0 to 1.0) | min: 0, max: 100, step: 1, divide by 100 in Liquid | Shopify range only supports integers |
One thing many tutorials skip: range only supports integers
Shopify's range input does not support decimal step values. If you need a 0.1 step for opacity, the workaround is to store the value as an integer (0 to 100) and divide by 100 in your Liquid output:
{% assign opacity = section.settings.overlay_opacity | divided_by: 100.0 %}
<div style="opacity: {{ opacity }}">
This pattern is cleaner than it looks: the merchant sees a 0-100 slider, your CSS gets a 0.0-1.0 float. No hacks needed.
Verifying your fix before publishing
Theme Check, Shopify's official linting CLI, catches this error during local development. Run it before pushing any schema changes:
shopify theme check
If you are working directly in the Shopify admin code editor (without a local CLI setup), save the section file and reload the theme editor preview. The error appears as a red banner at the top of the customizer if the schema is still invalid.
For a deeper look at how Theme Check handles schema validation and argument errors, see Shopify Theme Check: Why a Single File Path Argument Does Not Work.
Practical checklist before adding any range setting
Use this list every time you write a new range block:
- Calculate
(max - min) / stepand confirm the result is 100 or below. - Confirm all four attributes (
min,max,step,default) are integers, not strings. - Confirm
defaultfalls betweenminandmax. - Ask: does this value genuinely benefit from a slider? If not, use
number,select, ortext. - Test in the theme editor before pushing to production.
For a full breakdown of every schema input type and when to reach for each one, see the Shopify theme development guide.
Summary
The "range parameters must have at most 101 steps" error is pure arithmetic. The formula (max - min) / step must produce 100 or fewer. Widen your step, cap your max, or swap to the number type. None of these fixes require a Shopify plan upgrade, a theme reinstall, or support ticket. Understand the constraint once and you will never hit it again.
Frequently asked questions
What does 'range settings must have at most 101 steps' mean in Shopify?
It means your range setting's min, max, and step values produce more than 100 calculated steps. Shopify calculates steps as (max - min) / step, and that result must be 100 or less. Fix it by increasing the step value, reducing the max, or switching to the number input type.
Can I use decimal step values in a Shopify range setting?
No. Shopify range settings only support integer values for min, max, step, and default. To work with decimals (such as opacity from 0.0 to 1.0), store the value as 0 to 100 with step 1 and divide by 100.0 in your Liquid code.
What is the difference between the range and number input types in Shopify schema?
The range type renders a slider with a defined min, max, and step, and is capped at 101 positions. The number type renders a plain text field that accepts any integer with no upper or lower limit enforced at the UI level. Use range for constrained values with visual slider feedback, and number for open-ended integers.