Demand forecasting for Shopify: 4 methods compared (and when to use each)
Velocity, weighted velocity, blended, or seasonal? The forecasting method you pick decides whether you stock out, sit on dead stock, or ship just enough. Here's the operator's guide.
Most Shopify forecasting advice falls into one of two failure modes: either it's "use last 30 days" (which kills you in any seasonal business), or it's a wall of statistics theory you'll never apply (Holt-Winters, ARIMA, Croston) for SKU counts you don't have.
The actual answer is in between, and it's not one method. It's knowing when to use which. A new hero SKU launched 21 days ago needs a different forecast than a 4-year-old core SKU with predictable seasonality. Using one model for both is what causes the inventory pain that keeps Shopify operators awake at night.
This is the framework we use inside Ecombone Inventory. Four methods, ordered by complexity, with the question that decides which to use.
What "demand forecasting" actually has to deliver
Before we get into methods, anchor what a forecast is for. A forecast in a Shopify ops context exists to answer one question: how many units of this SKU should I have on hand on a given future date so that I don't stock out and don't sit on dead stock?
That's it. The number you forecast feeds three downstream decisions:
- Reorder point — when to place the next PO.
- Reorder quantity — how many units to put on the PO.
- Allocation — across locations, what's the split.
A great forecasting method is one whose error is small enough that those three decisions stop hurting. It doesn't need to be theoretically pure. It needs to be operationally cheap, fast to recompute, and resilient to the specific failure modes of e-commerce data (promo spikes, viral days, stockout-distorted history).
Method 1: 30-day velocity
The simplest method. Take units sold in the last 30 days. Divide by 30. That's your daily velocity. Multiply by your forecast horizon (lead time + safety stock days) to get the forecast.
30-day units sold = 600
daily velocity = 600 / 30 = 20 units/day
forecast for 45-day horizon = 20 * 45 = 900 units
When to use it:
- The SKU is brand new (less than 45 days of sales history).
- The SKU is highly trendy and you expect performance to be more like "last 30 days" than "last 12 months."
- You're in a non-seasonal vertical (consumables, B2B, repeat-purchase essentials).
Where it breaks:
- Anything with seasonality. A 30-day velocity in November will catastrophically over-forecast January.
- SKUs with promo spikes. A Black Friday week inflates your velocity for weeks afterwards if you don't handle it.
- Stockout periods. If you were OOS for 8 of those 30 days, your "velocity" is wildly understated. (Most teams get this wrong — they don't normalize for in-stock days.)
The fix for stockout days: divide by in-stock days, not calendar days. If you sold 600 units across 22 in-stock days, your real velocity is 600/22 = 27.3 units/day, not 20.
Method 2: 90-day velocity
Same math, different window. Take units sold over the last 90 days, divide by in-stock days, get daily velocity.
This is the default method most operators should use for the bulk of their catalog. 90 days smooths over weekly noise without yet getting into seasonality territory.
When to use it:
- Stable SKUs with at least 90 days of sales history.
- Categories without strong monthly seasonality.
- Any SKU where 30-day velocity feels too noisy.
Where it breaks:
- Seasonal businesses. A 90-day window in November already includes October — a different demand regime than the December that follows.
- Brands that had a big PR / viral / promo spike in the last 90 days. The spike pulls the average up and you over-forecast.
The fix for spikes: cap any single day's contribution at, say, 2× the median day. This dampens the influence of a single anomalous day without you having to manually flag it.
Method 3: Blended weighted average
Now we start actually thinking. Instead of picking 30 or 90, use both — and weight the recent more heavily.
A simple, robust formula:
forecast_velocity = (0.6 * velocity_30d) + (0.4 * velocity_90d)
Why it works: the 30-day window captures recent direction (your launch is taking off, or your category is cooling). The 90-day window provides stability so a freak Tuesday doesn't break your reorder logic. The 60/40 weighting is empirically what most Shopify ops teams converge to after a year of trial and error.
You can also weight 30/60/90 (e.g., 0.5/0.3/0.2). For most SKUs the marginal accuracy gain is small — the 60/40 split gets you 90% of the way for half the bookkeeping.
When to use it:
- Stable SKUs in growing categories.
- SKUs where you want to be responsive to trend without being whiplashed.
- The "default default" for your top 50 SKUs.
Where it breaks:
- Seasonality. Blended velocity still doesn't know December is different from October. It will under-forecast Q4 and over-forecast Q1.
Method 4: Weighted moving average with seasonal multipliers + trend
This is the one most Shopify brands need but never build because it sounds complicated. It isn't.
The formula:
base_velocity = 0.6 * velocity_30d + 0.4 * velocity_90d
seasonal_multiplier = avg_units(this_month, last_year) / avg_units(full_year, last_year)
trend_factor = velocity_last_30d / velocity_30d_a_year_ago
forecast_velocity = base_velocity * seasonal_multiplier * trend_factor
In English:
- Base velocity: same as Method 3, the recent demand.
- Seasonal multiplier: how does THIS month historically compare to the AVERAGE month? If December averages 1.8× the year, multiply by 1.8 in December.
- Trend factor: is the brand growing or shrinking YoY? If you're up 30% YoY, the historical seasonal pattern still applies but at a higher base.
This is the model behind the seasonal mode in Ecombone Inventory. It's not Holt-Winters. It's not ARIMA. It's a flat operator's model — but it captures 80% of what those statistical methods do, on data sizes Shopify SKUs actually have.
When to use it:
- Any business with month-to-month seasonality (most of them, honestly — even "non-seasonal" verticals usually have a Q4 lift).
- SKUs with at least 13 months of history (you need last year's same month).
- Hero SKUs where forecast accuracy matters more than computational simplicity.
Where it breaks:
- New SKUs (no last-year data). Fall back to Method 3.
- Black-swan years. If your seasonal multiplier is computed off 2024 and 2024 was an outlier, you'll forecast wrong. Use 2-3 years of seasonal data when you can, average the multipliers.
- Pre-launch SKUs and PR-driven launches that won't replicate.
Side-by-side comparison
| Method | History needed | Handles seasonality | Best for | Computational cost |
|---|---|---|---|---|
| 30-day velocity | 30 days | No | New SKUs, non-seasonal | Trivial |
| 90-day velocity | 90 days | Slightly | Stable mid-tier SKUs | Trivial |
| Blended 30/90 | 90 days | No | Most stable SKUs | Trivial |
| Seasonal WMA + trend | 13+ months | Yes | Hero SKUs, seasonal categories | Moderate |
The decision tree
If you can't figure out which method to use for a SKU, walk this:
- Less than 45 days of sales history? → Method 1 (30-day velocity, with manual override based on judgment).
- 45–90 days of history? → Method 2 (90-day velocity, normalized for in-stock days).
- More than 90 days, but less than 13 months? → Method 3 (blended 30/90).
- More than 13 months and has seasonality? → Method 4 (seasonal WMA + trend).
- More than 13 months but no seasonality? → Method 3 is enough.
Don't pick one method for the whole catalog. Tier your SKUs and apply the right method per tier. Most brands have 5-15 hero SKUs that justify Method 4, a long tail that lives on Method 2 or 3, and a handful of new SKUs that need Method 1. That's the operator's setup.
Three traps almost every Shopify operator falls into
Trap 1: forecasting demand without correcting for stockout days
If you ran out of stock for 8 days in the last 30, your "30-day velocity" is computed on 22 days of demand, not 30. Always divide by in-stock days, not calendar days. This single fix is the biggest accuracy gain for most brands.
Trap 2: confusing forecast accuracy with forecast usefulness
A "perfect" forecast that arrives too late to act on is worthless. Recompute weekly at minimum, daily if you have the infrastructure. A 90% accurate weekly forecast beats a 95% accurate monthly forecast every time, because you can react to the weekly one.
Trap 3: forecasting in units when you should forecast in coverage days
Don't ask "how many units do I need next month." Ask "how many days of coverage do I have right now, given the current forecast?" Coverage is decision-ready. Units aren't.
coverage days = current_on_hand / forecast_velocity
reorder when coverage_days <= lead_time + safety_stock_days
If your inventory dashboard isn't showing you coverage days as the primary KPI, switch.
The summary you can use today: divide your SKUs into three tiers (heroes, mid, long-tail). Run Method 4 on heroes, Method 3 on mid, Method 1 or 2 on long-tail. Recompute weekly. Always normalize for in-stock days. This is 80% of forecasting done right, with zero data science.
What forecasting can't do for you
Forecasting is necessary but not sufficient. Even with a perfect forecast, you still need:
- Accurate lead times by supplier (and the variance — a 30-day average lead time with ±10 day variance behaves like 40 days).
- A safety stock policy that scales with variance, not a flat number of days.
- Pack size and MOQ awareness when generating reorder quantities.
- Pending PO tracking so you don't over-reorder while inbound is in transit.
A forecast that doesn't connect to those four things is a number on a dashboard. A forecast that does is a reorder suggestion you can act on. That's the difference between "we have a forecast" and "we have a forecasting system."
This is the gap Ecombone Inventory is built to close: each of the four forecasting methods above runs natively, the system normalizes for in-stock days, lead time and variance, MOQ and pending POs feed back into the reorder suggestion, and the dashboard shows coverage days, not just units. It installs on Shopify in 15 minutes and there's a 14-day trial to check the forecasts against your gut on your real catalog.
If you're guessing reorders, you're either stocked out or sitting on capital. The forecast is the cheapest fix.