v2.0

GoRules Version 2 is here - redesigned, now with managed cloud.GoRules Version 2 is here!

Watch the launch videoWatch

Warehouse Storage Location

Maximizes warehouse efficiency by strategically placing products based on turnover rates, picking frequency, and product characteristics.

Solution

This warehouse optimization system assigns ideal storage locations for products based on multiple key factors to improve operational efficiency. The system first classifies products using monthly sales volume, turnover rates, and daily picking frequency to identify high-priority items that require strategic placement. Products are then assigned specific storage locations - from floor-level spaces to pallet racks or bin shelving - based on their classification and handling requirements.

Fast-moving products with high volume are positioned in prime picking areas for quick access, while slower-moving items are stored in standard or overflow zones. The system factors in product fragility when determining vertical placement, keeping delicate items at lower heights for safer handling. Each assignment includes a priority score that helps warehouse managers plan optimal layouts, alongside specific replenishment schedules tailored to each product's turnover rate - creating a balanced approach that reduces picking times while maximizing space utilization.

How it works

The decision graph processes product data through three sequential steps:

  1. Product Classification: Analyzes monthly units, turnover rate, and picks per day to categorize products into high-volume, medium-volume, low-volume-fast, or low-volume-standard groups, adding a fast-moving indicator for quick-rotating inventory.

  2. Location Assignment: Determines the optimal storage type (floor-level, pallet rack positions, or bin shelving) and warehouse zone (prime picking, standard, or overflow) based on volume category, movement speed, and fragility score.

  3. Allocation Finalization: Generates the exact storage location code, calculates a picking efficiency score, recommends optimal quantity to store, and establishes a replenishment frequency (daily, weekly, or monthly) based on turnover rate.

Where teams use it

  • E-commerce fulfillment centers
  • Retail distribution centers
  • Manufacturing parts warehouses
  • Grocery and food distribution
  • Electronics and technology warehousing
  • Third-party logistics providers
  • Pharmaceutical and medical supply storage
  • Automotive parts distribution centers

Inside the decision model

Warehouse Storage Location ships as a JDM decision graph with 4 nodes, 2 decision tables and 13 rules. Download it, load it into GoRules, and run it as-is on Zen Engine.

Decision graph4 nodes · read-only
input requesttable classifyProducttable assignLocationexpression finalizeAllocation
01

Request

input

One product record drives the whole slotting decision: the nested product object supplies monthlyUnits, turnoverRate, picksPerDay, and fragilityScore, along with dimensions, weight, and handling flags. Classification and placement both read from this single structure.

Sample requestJSON
{
  "product": {
    "id": "PRD-12345",
    "name": "Gaming Laptop XZ5000",
    "dimensions": {
      "length": 40,
      "width": 30,
      "height": 10,
      "unit": "cm"
    },
    "weight": {
      "value": 3.5,
      "unit": "kg"
    },
    "monthlyUnits": 2500,
    "turnoverRate": 0.65,
    "picksPerDay": 12,
    "fragilityScore": 4,
    "specialHandling": false,
    "hazardous": false
  }
}
02

Classify Product

table

Classification runs top-down with a first hit policy across product.monthlyUnits, product.turnoverRate, and product.picksPerDay. Products moving more than 5000 units a month with turnover above 0.8 and over 15 picks a day become 'high-volume' with fastMoving true; the two 'medium-volume' rows split on whether turnover and picks sit above or below 0.5 and 10; a low-volume item can still earn 'low-volume-fast' when turnover exceeds 0.7 and picks exceed 8, and the blank catch-all lands everything else in 'low-volume-standard'.

Requiring all three signals to agree before granting the top class is the point: monthly units alone can be inflated by one bulk order, so pairing volume with turnover and daily pick frequency filters for items that genuinely earn prime real estate. The 'low-volume-fast' row captures the classic small-but-frequent SKU, like spare parts, that velocity-based slotting would otherwise bury in overflow.

Decision tablefirst hit policy
Monthly Unitsproduct.monthlyUnitsTurnover Rateproduct.turnoverRatePicks Per Dayproduct.picksPerDayVolume Categoryclassification.volumeCategoryFast Movingclassification.fastMoving
> 5000> 0.8> 15'high-volume'true
> 1000> 0.5> 10'medium-volume'true
> 1000< 0.5< 10'medium-volume'false
< 1000> 0.7> 8'low-volume-fast'true
---'low-volume-standard'false
03

Assign Location

table

Placement maps classification.volumeCategory, classification.fastMoving, and product.fragilityScore to a storage type, zone, and priority, first hit wins. Fragile high-volume items (fragility above 3) go to 'floor-level' in the 'prime-picking-area' at priority 1, sturdier ones to 'pallet-rack-bottom'; medium-volume stock spreads across 'pallet-rack-bottom', 'pallet-rack-middle', and 'pallet-rack-upper' depending on speed and fragility; 'low-volume-fast' items get 'bin-shelving-middle', the slowest sturdy items fall to 'bin-shelving-upper' in the 'overflow-area' at priority 7, and the catch-all assigns 'bin-shelving-standard'.

The height logic follows standard warehouse ergonomics: fast movers belong in the golden zone at floor and bottom-rack level where pickers spend no time on ladders or lifts, and delicate items stay low so a drop costs centimeters, not meters. Pushing slow, sturdy stock to upper positions and overflow keeps the expensive ground-level slots turning, which is the whole economics of slotting.

Decision tablefirst hit policy
Volume Categoryclassification.volumeCategoryFast Movingclassification.fastMovingFragilityproduct.fragilityScoreStorage Typeallocation.storageTypeWarehouse Zoneallocation.warehouseZonePriorityallocation.priority
'high-volume'true> 3'floor-level''prime-picking-area'1
'high-volume'true< 3'pallet-rack-bottom''prime-picking-area'2
'medium-volume'true> 2'pallet-rack-bottom''prime-picking-area'3
'medium-volume'false> 2'pallet-rack-middle''standard-picking-area'4
'medium-volume'false< 2'pallet-rack-upper''standard-picking-area'5
'low-volume-fast'true-'bin-shelving-middle''standard-picking-area'6

+2 more rows in the downloadable template

04

Finalize Allocation

expression

Final outputs get assembled here: allocatedLocation concatenates allocation.warehouseZone and allocation.storageType into a single code, and pickingEfficiencyScore subtracts allocation.priority from 10 for fast movers or 5 for the rest, so a lower priority number yields a higher score. recommendedQuantity stocks half of product.monthlyUnits at the location, and replenishmentFrequency turns product.turnoverRate into a schedule, 'daily' above 0.7, 'weekly' above 0.4, otherwise 'monthly', giving the replenishment team a cadence matched to how fast the slot empties.

Expressions4 fields
allocatedLocationallocation.warehouseZone + '-' + allocation.storageType
pickingEfficiencyScoreclassification.fastMoving ? 10 - allocation.priority : 5 - allocation.priority
recommendedQuantityproduct.monthlyUnits / 2
replenishmentFrequencyproduct.turnoverRate > 0.7 ? 'daily' : product.turnoverRate > 0.4 ? 'weekly' : 'monthly'

Make this template
your own.

Load Warehouse Storage Location into GoRules, adjust the rules to your policy, and ship it behind your own API.