The EOQ formula is EOQ = √(2 × D × S ÷ H), where D is annual demand in units, S is the fixed cost to place and receive one order, and H is the annual holding cost per unit. It gives you the order quantity that minimizes the combined cost of ordering and holding a stocked item, and it has been doing that job since Ford W. Harris published it in 1913, back when a hardware store's biggest logistics question involved a horse.

What each letter in the formula means

Before you run the numbers, it helps to know what you're feeding the formula, because two of the three inputs get confused constantly.

D is annual demand in units, meaning the boxes, bags, or gallons you sell in a year rather than dollars or margin, and it is the one input you probably know cold or can pull from a sales report in a minute.

S is the fixed cost to place and receive one order. This is not the cost of the goods but the labor and hassle of the order itself: someone's time to build the purchase order, send it, receive the truck, check the packing slip against the purchase order, put the stock away, and voucher the invoice. Whether you order 10 boxes or 100, that work is roughly the same, which is why it's a fixed cost per order.

H is the annual holding cost per unit, sometimes called carrying cost. It's what one unit of that item costs you to sit on the shelf for a year: the money tied up in it, the shelf space it occupies, insurance, shrink, and the slow dusty decline of anything that doesn't turn. It's usually expressed as a percentage of the item's cost, and getting a defensible number for it is its own exercise. If you want the full breakdown, the guide on inventory carrying cost walks through how to build yours.

A worked example from the fastener aisle

Take a box of #9 x 3 in. deck screws that costs you $12.40 and sells 600 boxes a year, which is your D. Say it costs $20 in staff time to place and receive an order with that vendor, which is your S. For holding cost, use 25% of item cost per year as an assumed example rate: 25% of $12.40 gives you H = $3.10 per box per year.

Now plug it in:

Variable Value
D (annual demand) 600 boxes
S (cost per order) $20
H (holding cost per box per year) $3.10
EOQ = √(2 × 600 × 20 ÷ 3.10) = √7,741.9 ≈ 88 boxes

So the math says to order 88 boxes at a time. You'll place about 600 ÷ 88 = 6.8 orders a year, call it every seven or eight weeks.

Here's the elegant part, and it's a property of the model rather than a coincidence: at the EOQ, your annual ordering cost and your annual holding cost are equal. Ordering cost is 6.8 orders × $20 = about $136, and holding cost is your average inventory (half of 88, so 44 boxes) × $3.10, also about $136. The two lines cross at the bottom of the total cost curve, and the EOQ sits at that crossing point.

Why the exact answer matters less than you think

That 88 is not a cliff edge. The total cost curve is flat near the bottom, which means ordering somewhat more or less than the EOQ costs you very little extra. Look at the totals:

Order quantity Orders per year Ordering cost Holding cost Total
50 boxes 12 $240 $77.50 $317.50
88 boxes (EOQ) 6.8 $136 $136 $273
120 boxes 5 $100 $186 $286

Ordering 120 instead of 88 costs you about $13 a year, and ordering 50 costs you about $45, which is useful news because it means you can round to the case pack without guilt. If screws come 20 boxes to a case, order 80 or 100 and sleep fine. Ford Harris did not have a distributor truck showing up every Tuesday, so you may forgive him for not building case packs into the model.

Where the textbook breaks in a supply store

The EOQ model rests on assumptions that describe a textbook warehouse, not your store: demand is constant over the period, each order arrives in full, there's a fixed cost per order regardless of quantity, and each order is for one item. Here's where those assumptions meet the real world.

The weekly truck makes S near zero for warehouse items. If your distributor order goes out every week regardless, adding one more line to that purchase order costs you nothing extra. The fixed cost of "placing an order" is already paid. For those items, the real decisions are case pack, shelf space, and your min and max, and EOQ adds little. The model earns its keep on the orders where S is real: a direct-from-vendor buy with a prepaid-freight minimum, a line you can only get by the pallet, or a big seasonal purchase like a pallet of ice melt where you're deciding how deep to go in one shot.

Seasonal items violate constant demand. EOQ assumes steady, even demand, so it fits your staples: fasteners, caulk, sandpaper, rope, layer feed, the gallon of paint that moves every week of the year. It does not fit grills, seed, or anything whose demand arrives in one six-week rush. For those, you're placing a season bet, not solving for an equilibrium.

Quantity breaks are an extension, not part of the base model. The formula assumes the unit cost stays flat, but vendors love to dangle a discount at a round quantity. The right way to handle it: compare total annual cost (goods plus ordering plus holding) at the EOQ against total annual cost at the break quantity, and take the lower one.

Using the screw example, say the vendor offers 5% off at 200 boxes. At the EOQ, your total annual cost is the goods ($7,440) plus about $273 in ordering and holding, or $7,713. At 200 boxes, you'd order 3 times a year: goods drop to $7,068, ordering drops to $60, but holding climbs because you're carrying an average of 100 boxes at the discounted cost, about $295. That totals roughly $7,423, so the break wins by about $290 a year, and it wins because the discount on the goods swamps the extra holding cost. Run the same comparison with a smaller discount and it can easily flip, which is why you run it instead of eyeballing it.

EOQ tells you how much, not when

The formula answers one question, which is how much to order, and says nothing about when to place the order. That is the reorder point's job, and the two work as a pair. The reorder point covers demand during your vendor's lead time plus a cushion of safety stock, and the reorder point and safety stock formula guide covers that half.

Once you have both numbers, they translate directly into the min and max your POS or purchasing system uses: Min is your reorder point, and Max is roughly your reorder point plus your EOQ. When stock drops to Min, you buy back up to Max, and the quantity that falls out of that is your EOQ with a little rounding for the case pack.

Which items deserve the math

You stock thousands of SKUs, and calculating EOQ for all of them is a fine way to never open the store on Monday. The better approach is to spend the math where the money is. An ABC analysis of your inventory ranks items by their annual dollar movement, and your A items, the small slice of SKUs that carry most of your dollar volume, are the ones worth an EOQ calculation and a tuned min and max. Your C items can live on a simple min/max you set from experience and check twice a year.

Two more practical notes on inputs. First, the cost that feeds H should be your true cost, not the price on the vendor's price list. If freight comes in on the received purchase order, it belongs in the unit cost, and the landed cost for retail inventory guide shows how to spread freight across a receipt so H (and your margin math) reflects what the screws cost you landed. Second, revisit D whenever demand shifts, because the 600-boxes-a-year assumption from two years ago might be 450 now, and the formula is only as good as the demand number you feed it.

How Rundoo handles it

Rundoo hands you the inputs rather than a textbook. Each product's detail page shows units sold, margin, and stock turns above its transaction history, and the Inventory dataset in custom reports gives you annual units sold, on hand, on-hand value, and annual turns, grouped by location, department, or vendor and downloadable as CSV, so pulling D for an item or a whole department takes a minute. On the cost side, receiving updates Average cost per product, and landed cost (freight added on a received purchase order, distributed by quantity or by subtotal) flows into that average cost, so the number you'd use for H already has freight in it. Min and Max are set per product per location, and when on hand plus on order drops to or below Min, Rundoo suggests enough to bring stock back up to Max, rounded up to the product's case quantity, which is the EOQ-then-round-to-the-case move done for you. The purchase order builder's Generate order offers Replenishment, Min & Max, and Predictive (a year-over-year forecast), and you can see the whole workflow on the manage pricing and purchasing page.