Forecasts
Forecasts turns monthly sales history into versioned demand plans, then combines a selected forecast with inventory, labor inputs, and setlist bills of materials for production planning.
Where: setlist → Forecasts
A Forecast here is a named, time-phased version across products and months. It is different from the single Forecast total stored on an individual product card.
One thing to understand first: the grain
Every forecast row and every month of sales history is stored at the grain it was authored:
- setlist-authored data is per variant — the row's identity is the one SKU.
- Workbook imports keep the merchant's grain — a product label that may cover one SKU or several.
setlist preserves that difference rather than splitting an imported label into invented per-variant numbers, and accuracy is scored at the same grain the forecast was made at. That's why the detail page's Products tile reads "distinct products (at the grain the forecast was authored)" rather than a variant count.
Start with sales history
The Forecasts page summarizes:
- Synced months from Shopify orders;
- Imported months from workbooks;
- Tracked products mapped — or waiting to be mapped — from workbook labels to Shopify SKUs;
- On-hand SKUs from the latest inventory snapshot.
Sync Shopify sales
Choose Sync Shopify sales to aggregate recent Shopify order lines into monthly units per SKU. The sync runs asynchronously, so the page reports progress until ingestion completes.
- Shopify supplies the most recent 60 days of orders with the requested Order access. Import older history from a workbook.
- Line items without SKUs are skipped and reported in the result.
- If another Shopify bulk operation is running, return later and retry.
Before the first sales sync, use the Order access card to request optional read_orders access through Shopify; Sync Shopify sales remains disabled until it is granted. Other Forecasts actions do not require this optional scope. See Shopify access & permissions.
After a shop has run its first sales sync, setlist refreshes Shopify sales weekly — every Monday at 14:00 UTC. The refresh runs on setlist's deployed services, so the merchant's computer does not need to be on, and it only covers shops that have synced at least once. Use Sync Shopify sales whenever an immediate refresh is needed.
Sync inventory
Choose Sync inventory to snapshot current Shopify inventory by SKU. This powers Needed = remaining forecast − on hand on forecast detail pages. Blank SKUs are skipped; duplicate SKUs are combined.
Inventory sync uses the product-read access already required by setlist. It does not require the optional inventory-write access used when creating Shopify products.
Forecast versions
Below sales history, every forecast version is listed: Forecast · Horizon · Status · Origin · Products · Units · Created, plus a Delete. Generate forecast sits above the table. Before there are any versions, the section explains the flow and offers Import workbook and Generate forecast side by side.
Import a forecast workbook
Choose Import workbook to upload a planning workbook. The file must be .xlsx and 2 MB or smaller, with at most about 15,000 data rows per sheet. setlist finds the sheets by their column headers, not their tab names, so renamed tabs still import. Larger, ZIP64, multi-disk, encrypted, or unusually compressed workbooks are rejected before anything is read.
Data sheet
Required columns:
| Column | Meaning |
|---|---|
| Product | Product label used throughout the workbook. |
| Month | Month for the row. |
| Figure | Actual adds sales history; Forecast adds a locked forecast version. |
| Units | Actual or forecast unit count. |
Detail sheet
An optional detail sheet maps workbook products to Shopify SKUs:
| Column | Meaning |
|---|---|
| Product | Must match the product label from the data sheet. |
| Product Variant ID | One or more Shopify SKUs associated with that label. |
Rows without a SKU mapping still import, but they cannot join Shopify-synced sales or setlist BOMs. The detail sheet can also supply Skilled min/u and Assembly min/u for labor planning.
Importing a workbook can produce three results at once:
- remembered product-label-to-SKU mappings;
- imported monthly actuals;
- an immediately Locked forecast from Forecast rows.
Re-importing the same imported months replaces those earlier workbook months. The result reports mapped products, actual rows/months, the locked forecast horizon, unresolved labels, and skipped rows.
Generate a forecast
Choose Generate forecast once tracked product labels exist. Sales history is needed for useful modeled values, but the hard prerequisite is at least one tracked label from an import.
- Enter an optional name.
- Choose the start month.
- Choose a horizon from 1 to 24 months (six months by default).
- Choose Generate draft.
The explainable model multiplies four factors, and stores that decomposition on every entry so the grid can show its work:
| Factor | Where it comes from |
|---|---|
| Base | Deseasonalized trailing demand — the average of the last three covered months, with seasonality divided back out. |
| Seasonality | A month-of-year index built from the category's own sales history, falling back to a catalog-wide index. |
| Trend | Recent three months vs. the three before, damped. |
| Bias | A correction learned from a prior locked forecast's scored accuracy, per category. Defaults to 1 with none yet. |
The current, in-progress month is excluded from the history the model reads, so a half-finished month can't drag the base rate down. Generation creates a Draft, so every product/month value can be reviewed before it becomes an accuracy baseline. A product with no recent sales generates zero and says so ("No recent sales … — set manually if this product is active.").
Review a forecast version
Open a forecast to see its status and origin badges, its horizon and creation date, and four tiles: Total units, Products (at the authored grain), Entries (product × month rows), and Months. Every version also gets a Planning section, an Accuracy section, and a Units by category grid.
Draft forecasts
Generated drafts add an editable product-by-month grid:
- search narrows the product list;
- the grid shows up to 40 matching products at a time, and says so ("Showing 40 of N products — search to narrow");
- the model's math appears beneath each product, e.g. "Base 42/mo (avg Mar–May 2026) × seasonal 1.14 × trend 0.96 × bias 1.00";
- enter a nonnegative unit override and an optional note explaining why;
- only changed cells are saved — the button reads Save N changes and is disabled at "No changes" — and an overridden product is badged Edited.
Choose Lock forecast when review is complete. Locking freezes the version as an immutable record used for later accuracy scoring. There is no unlock action.
Locked forecasts
Imported forecasts are locked immediately. Locked detail pages are read-only, and add a Largest products table (the top 25, with the total called out in the heading) beneath the units-by-category grid.
Deleting a forecast is immediate and has no confirmation dialog.
Accuracy
Accuracy appears after a forecast month has fully elapsed and actual sales cover that month. Sync Shopify sales or import actuals to keep scoring current. The section names which months were scored and which it's still waiting on. Scoring happens at the grain each entry was authored at.
| Metric | Meaning |
|---|---|
| WMAPE | Unit-weighted absolute error; lower is better, and big products count more than small ones. |
| Bias | Positive means over-forecast, negative means under-forecast. |
| Hit rate | Share of product-months within ±20% of actuals. |
| Scored | Total forecast units vs. actual units across the scored months. |
The detail page also breaks accuracy down by month and by workbook dimension, and lists the Biggest misses (product, month, forecast, actual, error).
Production planning
Planning covers the current and future months remaining in the forecast horizon, and names them. Four tiles lead: Remaining forecast, On-hand, Needed (max(0, remaining − on-hand) per product, badged with the count of products that have no SKU mapping), and Labor coverage (the share of remaining units that have per-unit minutes).
Beneath them:
- Most needed — product, category, remaining forecast, on-hand, needed;
- Labor hours by month, from the workbook's per-unit minutes — only shown when the detail sheet supplied any;
- Material needs and shortfalls from setlist variant BOMs and material stock.
The two long tables show their top 25 rows. Until inventory is synced, the on-hand and needed figures read "—" and a warning explains why. Forecast SKUs must match setlist variant SKUs for BOM planning. When one workbook label maps to multiple SKUs, the material estimate splits its units evenly across those SKUs. Once a forecast's horizon has fully elapsed, the section just says there's nothing left to plan against.
Current limitations
- Forecasts plan units, not revenue or sales channels.
- Shopify inventory sync remains manual; Shopify sales refresh weekly after the first merchant-started sync.
- There is no merchant UI for resolving unmapped workbook labels after import.
- Generated drafts have no separate reviewer/approval workflow.
- Labor comes from workbook detail columns until Fulfil routing is connected to forecasting.
- A Forecast version does not push its monthly values back into each product card's Forecast total.
See also
- Products — product-card Forecast totals
- The Product Workspace — variant forecasts and BOMs
- Shopify access & permissions — Order access