Economic Order Quantity (EOQ) for Shopify: Calculate a Smarter Reorder Size
Economic order quantity is the purchase lot size that minimizes the combined cost of placing orders and holding stock. For a Shopify SKU, you calculate it from annual unit demand, the fixed cost of one purchase order, and the annual holding cost of one unit. The result tells you how many units to buy. A separate reorder-point calculation tells you when to buy them.
Ford W. Harris developed the model in 1913, according to Investopedia. Shopify lists EOQ among standard inventory methods and describes it as a way to find the most cost-effective amount to order by balancing storage cost with ordering cost. Shopify inventory reports do not output an EOQ figure. You assemble the three inputs from sales, cost, and supplier data, then run the formula yourself.
What economic order quantity measures
Every reorder has two opposing costs. Small, frequent POs raise the cost of buying (staff time, inbound freight that does not scale with units, receiving). Large, rare POs raise the cost of holding (warehouse space, insurance, markdowns, cash stuck in cartons). EOQ is the lot size where those two annual cost curves meet at their lowest combined point.
The EOQ formula
EOQ = square root of (2 × D × S ÷ H)
Investopedia publishes the same equation as Q = √(2DS / H). The three inputs must use the same time window. Annual demand with an annual holding cost is the usual pairing.
- D = demand in units for the period (usually one year)
- S = fixed cost to place and receive one order (not the product cost)
- H = cost to hold one unit for that same period
How to pull the three inputs from Shopify
Annual demand (D)
Open Analytics > Reports, filter the category to Inventory, and run Inventory sold daily by product. Shopify defines quantity sold per day as units sold in the selected period divided by the number of days in that period. For a stable SKU, set the period to a full year and multiply quantity sold per day by 365. That product is D.
Shopify’s inventory-based metrics only go back to October 1, 2023. If the variant is newer than a year, annualize the longest clean window you have. If the window includes a stockout, demand is understated. Patch the gap with the daily rate from days the SKU was actually available, or use a demand forecast that does not treat a zero-stock week as zero demand.
Ordering cost (S)
S is the cost of one replenishment cycle that does not change with unit count. Leave unit cost, duties that scale with units, and per-unit inbound out of S. Those belong in product cost or in H.
- Time to raise, send, and chase one purchase order
- Fixed inbound freight or broker fees that you pay per shipment
- Receiving and put-away labor for that arrival
- Quality checks that happen once per delivery
Holding cost (H)
H is what it costs to keep one unit on hand for a year. The clean construction is unit cost × carrying-cost rate. Carrying cost is capital, storage, service (insurance, counts), and risk (markdowns, shrink, expiry). Shopify does not publish a carrying-cost percentage. Build the rate from invoices and Month-end inventory value, which multiplies available units by cost per item.
Work the full rate on the SKUs that hold the most cash, then reuse it on similar items. The inventory carrying cost walkthrough shows how to assemble the four buckets and convert them into H. A slow fashion leftover often carries a higher risk rate than a staple that turns every month.
Worked example for a Shopify SKU
- Annual demand (D): 2,400 units
- Fixed cost per order (S): $80
- Holding cost (H): $6 per unit per year (a $30 cost per item at a 20% carrying-cost rate)
EOQ = square root of (2 × 2,400 × 80 ÷ 6) = square root of 64,000 = 253 units (rounded). At that lot size you place about 9.5 orders a year, or one PO roughly every 38 days. Annual ordering cost is about $759. Annual holding cost on cycle stock (253 ÷ 2 units on average) is also about $759. The two costs match at the minimum.
| Order quantity | Orders per year | Annual ordering cost | Annual holding cost | Total relevant cost |
|---|---|---|---|---|
| 100 | 24 | $1,920 | $300 | $2,220 |
| 200 | 12 | $960 | $600 | $1,560 |
| 253 (EOQ) | 9.5 | $759 | $759 | $1,518 |
| 400 | 6 | $480 | $1,200 | $1,680 |
| 600 | 4 | $320 | $1,800 | $2,120 |
Pair EOQ with a reorder point
EOQ answers how many units to put on the next PO. It does not tell you the on-hand threshold that should trigger that PO. Shopify’s own safety-stock guide uses this reorder point: (average sales rate × lead time) + safety stock.
On the crewneck, 2,400 units a year is about 6.6 units a day. A 21-day supplier lead time consumes about 138 units in transit. Add whatever safety stock you keep for late containers or a promo spike. If safety stock is 40 units, you raise the 253-unit PO when available inventory hits 178. Work the full Shopify reorder formula on the same SKU so the date and the quantity stay consistent.
When the classic model fails
Demand is not flat
A yearly average hides a Q4 spike and a dead February. For seasonal SKUs, compute D on the season you are buying for, not on a 12-month blend that never actually happens. Recalculate after a promo, a stockout, or a price change. Investopedia flags the same limit: the formula assumes constant demand and stable ordering and holding costs, so it misses seasonal swings and shortage costs.
A practical EOQ workflow for Shopify merchants
Do not run this on the whole catalog in one sitting. Shopify’s ABC product analysis grades variants on the last 28 days of revenue: A-grade items are the group that accounts for about 80% of revenue, B-grade about 15%, and C-grade about 5%. Start with A-grade replenishment SKUs. An ABC analysis pass tells you which POs are worth the spreadsheet time.
- Confirm inventory tracking is on and cost per item is filled for the SKU. Month-end inventory value is blank or wrong without cost.
- Export a year of Inventory sold daily by product (or the longest clean window) and set D. Adjust for stockout days.
- Estimate S from the last few POs: buyer time, fixed freight, receiving.
- Set H from unit cost × carrying-cost rate. Reuse the rate from similar SKUs if you already built it.
- Compute EOQ. Round to the next case pack or MOQ and record the extra annual cost of that round-up.
- Set the reorder point from daily sales, lead time, and safety stock. Put that on-hand number next to the EOQ on the same row.
- Create the purchase order in Shopify with that quantity and cost. After the supplier confirms, mark it Ordered and create the inventory transfer so incoming units are visible.
- Set a Shopify Flow workflow that notifies you when variant inventory crosses the reorder point. Flow’s inventory templates include a low-stock notification that fires on the Inventory quantity changed trigger.
Shopify Flow can email you at a quantity threshold. It does not recompute EOQ when velocity changes. Recalculate D and the reorder point when the last 28 days no longer look like the year you used for D. Stock Intelligence watches cover and ranks reorder actions by revenue risk, which is useful after you trust cost per item and have EOQ on the heroes. Pair the quantity with inventory alerts so the PO goes out while lead time still fits.
Recalculate when the inputs move
Rerun EOQ when annual demand shifts, the supplier changes freight or MOQ, or your carrying-cost rate changes (new 3PL tariff, new interest rate, a markdown wave). A quiet staple can wait for a quarterly review. A paid-traffic hero should get a new D after any week that does not look like the last one.
Pick one A-grade SKU this week. Pull D from Inventory sold daily by product, write down S and H, and compare the EOQ to the quantity on your last PO. If those two numbers are far apart, change the next order, not the spreadsheet label.