Purchasing & Supplier Management
How do I forecast demand and build a purchase plan for a seasonal Shopify brand?
Building a purchase plan for a seasonal brand from a week-by-week demand forecast.
Last updated September 16, 2026
Do not use trailing twelve months as if December were July. A seasonal brand forecasts by week against last year, then overlays what you know now: live velocity, inbound already on the water, the marketing calendar, and cash.
Build a weekly demand curve
Build a weekly demand curve from last year's shipments (not orders, not Shopify "available"). Align the calendar (4-5-4 if that is how you close). Lift or cut weeks that have a named event: BFCM, Mother's Day, a drop date. New SKUs inherit a sibling style's curve, not a flat weekly average. A 365-day ABC class will hide the season. Use a 90 to 180 day lookback for trend, and last year's same weeks for the peak. Plan at style or color, then explode to size with a size curve. Planning every variant as its own forecast is how you overbuy XL and stock out of M. Wholesale and DTC are not one curve. An 850 you already hold is committed. Do not buy it twice, and do not let Shopify velocity eat the hold you already promised.
Turn the curve into a purchase plan
Turn the curve into a purchase plan by walking backward from the in-stock date. Cover is demand during actual lead time, plus safety. Actual lead time is receipt date minus PO date, on the last few POs, not the supplier's promise. Safety is the miss you will not survive (a slipped boat, a BFCM week). It is not a second forecast. Subtract inbound already purchased and already named. Ignore a named container and the system will recommend a second factory PO the week Shopify goes sold-out. Sold-out on the storefront is not the signal if that container is already on the water. Round up to MOQ and case-pack. Then stop and look at cash: the deposit, the balance when the container clears, and what is already committed to wholesale holds. A mathematically perfect PO you cannot pay is not a plan. This is a buy you will send. It is not a min/max policy that recommends a weekly top-up.
Freeze the buy and exception-manage
Freeze the buy. Exception-manage after. Weekly: SKUs that will stock out before inbound, POs that slipped, DTC velocity that is eating a wholesale hold. Draft the next PO from those exceptions. A human sends it. Do not let a storefront assistant draft a buy it cannot see (3PL counts, FBA reserved, landed cost, open 850s). Receive the container into the hold or pool that funded it, or the remainder math lies the week it docks. The forecast is a calendar you will be wrong about in pieces. The purchase plan is the cash and the dock dates you can still move.
Connect Claude or ChatGPT to your Fulfil data with the Fulfil MCP, then run this prompt on your own numbers.
You are the buyer for a seasonal Shopify brand. Here is: sku, style, last_year_weekly_units (52 weeks), last_90d_units, inbound_qty, inbound_eta, actual_lead_time_days, moq, case_pack, on_hand, wholesale_hold, cash_available, in_stock_needed_by. [paste] Produce: 1. A weekly demand curve (last year same weeks, adjusted for live velocity and named events). 2. Cover qty using actual lead time plus safety, minus inbound, rounded to MOQ / case-pack. 3. SKUs that stock out before inbound, and POs that cash cannot fund. 4. What to plan at style/color vs explode by size curve. Do not use trailing 365-day ABC as the seasonal forecast. Mark every PO DRAFT.
Explore this in Fulfil
More on Purchasing & Supplier Management
What is three-way matching and how do I do it for ecommerce purchase orders?
What three-way matching is and how to run it on your ecommerce purchase orders.
Three-way matching when your invoice arrives before your inventory does.
Handling a supplier invoice that arrives before the inventory does.
Handling partial receipts and short-shipments cleanly.
Keeping a PO clean when a supplier ships part of the order or comes up short.
See it run on
your data.
Fulfil runs inventory, fulfillment, purchasing, and accounting for scaling DTC brands in one system.