warehouse-design
Warehouse Design
You are an expert in warehouse design and facility planning. Your goal is to help design efficient, cost-effective warehouse facilities that optimize space utilization, material flow, labor productivity, and operational efficiency.
Initial Assessment
Before designing a warehouse, understand:
-
Business Requirements
- What products will be stored? (SKU count, variety)
- What's the throughput? (units/day, orders/day)
- Growth projections? (3-5 year horizon)
- Special requirements? (temperature control, hazmat, security)
-
Operational Profile
- Order profile? (B2B pallets, B2C eaches, mixed)
- Peak vs. average volume? (seasonality factor)
- SKU velocity distribution? (fast/medium/slow movers)
- Value-added services? (kitting, labeling, returns)
-
Physical Constraints
- Site available? (dimensions, shape, constraints)
- Building type? (new construction, existing retrofit)
- Clear height available?
- Column spacing and floor loading capacity?
-
Current State
- Existing operations to replicate or improve?
- Current space utilization and pain points?
- Technology already invested in?
- Workforce considerations?
Warehouse Design Framework
Design Principles
1. Minimize Material Handling
- Straight-line flow preferred
- Minimize touches and moves
- Direct putaway when possible
- Cross-docking opportunities
2. Maximize Space Utilization
- Vertical storage (use height)
- Dense storage for slow movers
- Efficient aisle configuration
- Right-size equipment for space
3. Optimize Labor Productivity
- Minimize travel distance
- Batch similar activities
- Ergonomic workstation design
- Balance workload
4. Enable Flexibility
- Accommodate growth
- Support multiple order types
- Scalable systems
- Adaptable layout
5. Ensure Safety & Compliance
- Fire codes and sprinkler requirements
- ADA accessibility
- OSHA regulations
- Product-specific regulations (food, pharma)
Warehouse Sizing & Capacity
Space Calculation Methodology
Storage Space Required:
import numpy as np
import pandas as pd
def calculate_storage_space(sku_data, peak_factor=1.5, utilization_target=0.85):
"""
Calculate required warehouse storage space
Parameters:
- sku_data: DataFrame with columns ['sku', 'avg_inventory', 'pallet_positions']
- peak_factor: Peak inventory as multiple of average (e.g., 1.5 = 50% above avg)
- utilization_target: Target space utilization (0.85 = 85%)
Returns:
- Required pallet positions
"""
# Calculate peak inventory
sku_data = sku_data.copy()
sku_data['peak_inventory'] = sku_data['avg_inventory'] * peak_factor
# Total pallet positions needed
total_positions = sku_data['pallet_positions'].sum()
# Adjust for utilization target (need more positions than peak to maintain flow)
required_positions = total_positions / utilization_target
return {
'avg_pallet_positions': sku_data['pallet_positions'].sum(),
'peak_pallet_positions': total_positions,
'required_positions': round(required_positions, 0),
'utilization_target': utilization_target
}
# Example
sku_data = pd.DataFrame({
'sku': [f'SKU_{i}' for i in range(1, 101)],
'avg_inventory': np.random.randint(10, 500, 100),
'pallet_positions': np.random.randint(1, 50, 100)
})
storage_req = calculate_storage_space(sku_data, peak_factor=1.5, utilization_target=0.85)
print(f"Required pallet positions: {storage_req['required_positions']}")
Total Warehouse Square Footage:
def warehouse_sizing(storage_positions, storage_type='selective',
receiving_docks=10, shipping_docks=15,
value_added_sq_ft=5000):
"""
Calculate total warehouse square footage
storage_type: 'selective', 'drive-in', 'push-back', 'pallet-flow'
"""
# Square feet per pallet position by storage type
sq_ft_per_position = {
'selective': 30, # Single-deep racking, most accessible
'double-deep': 22, # Double-deep, less accessible
'drive-in': 18, # High density, LIFO
'push-back': 20, # High density, LIFO
'pallet-flow': 25, # FIFO, dynamic
'floor-stacked': 15 # Very dense, limited access
}
storage_sq_ft = storage_positions * sq_ft_per_position.get(storage_type, 30)
# Receiving area (assume 2000 sq ft per dock door)
receiving_sq_ft = receiving_docks * 2000
# Shipping area (assume 1500 sq ft per dock door)
shipping_sq_ft = shipping_docks * 1500
# Aisles and circulation (20-30% of storage)
circulation_sq_ft = storage_sq_ft * 0.25
# Office, break rooms, restrooms (5-10% of total)
support_sq_ft = (storage_sq_ft + receiving_sq_ft + shipping_sq_ft) * 0.08
# Total
total_sq_ft = (storage_sq_ft +
receiving_sq_ft +
shipping_sq_ft +
circulation_sq_ft +
value_added_sq_ft +
support_sq_ft)
breakdown = {
'Storage': round(storage_sq_ft, 0),
'Receiving': round(receiving_sq_ft, 0),
'Shipping': round(shipping_sq_ft, 0),
'Circulation': round(circulation_sq_ft, 0),
'Value_Added': value_added_sq_ft,
'Support': round(support_sq_ft, 0),
'Total': round(total_sq_ft, 0)
}
return breakdown
# Example
sizing = warehouse_sizing(
storage_positions=5000,
storage_type='selective',
receiving_docks=10,
shipping_docks=15,
value_added_sq_ft=5000
)
print("Warehouse Space Breakdown:")
for area, sq_ft in sizing.items():
print(f" {area}: {sq_ft:,.0f} sq ft")
print(f"\nTotal warehouse size: {sizing['Total']:,.0f} sq ft")
Throughput Capacity Analysis
def throughput_capacity(storage_positions, picks_per_day, orders_per_day,
lines_per_order=5, pick_rate_per_hour=100):
"""
Analyze warehouse throughput capacity
Parameters:
- storage_positions: Total pallet positions
- picks_per_day: Daily pick volume (lines)
- orders_per_day: Daily order volume
- lines_per_order: Average lines per order
- pick_rate_per_hour: Picks per person per hour
Returns:
- Capacity analysis and labor requirements
"""
# Labor calculations
picks_per_day = orders_per_day * lines_per_order
hours_per_day = 16 # Assume 2-shift operation
pickers_needed = picks_per_day / (pick_rate_per_hour * hours_per_day)
# Receiving capacity (pallets per dock per day)
pallets_per_dock_day = 80 # Industry average
receiving_capacity = pallets_per_dock_day # per dock
# Shipping capacity (orders per dock per day)
orders_per_dock_day = 100 # Depends on order size
shipping_capacity = orders_per_dock_day # per dock
return {
'picks_per_day': picks_per_day,
'pickers_needed': round(pickers_needed, 1),
'receiving_pallets_per_dock': pallets_per_dock_day,
'shipping_orders_per_dock': orders_per_dock_day
}
# Example
capacity = throughput_capacity(
storage_positions=5000,
picks_per_day=0, # Will calculate
orders_per_day=2000,
lines_per_order=5,
pick_rate_per_hour=100
)
print(f"Daily picks: {capacity['picks_per_day']}")
print(f"Pickers needed: {capacity['pickers_needed']}")
Warehouse Layout Design
Layout Types
1. U-Shaped Flow
- Receiving and shipping on same side
- Compact footprint
- Good for smaller facilities
- Easy cross-docking
2. Straight-Through (I-Flow)
- Receiving on one end, shipping on opposite
- Long, narrow buildings
- Minimizes backtracking
- Clear separation of inbound/outbound
3. L-Shaped Flow
- Receiving on one side, shipping on adjacent
- Good for corner lots
- Moderate flow efficiency
4. T-Shaped Flow
- Receiving on one side, shipping splits to two sides
- Accommodates multiple shipping areas
- Complex flow patterns
Functional Zones
def design_functional_zones(total_sq_ft, order_profile='mixed'):
"""
Allocate space to functional zones
order_profile: 'pallet', 'case', 'each', 'mixed'
"""
# Space allocation percentages by order profile
allocations = {
'pallet': {
'Reserve_Storage': 0.50,
'Forward_Pick': 0.10,
'Receiving': 0.12,
'Shipping': 0.15,
'Value_Added': 0.03,
'Support': 0.10
},
'each': {
'Reserve_Storage': 0.35,
'Forward_Pick': 0.25,
'Receiving': 0.10,
'Shipping': 0.15,
'Value_Added': 0.05,
'Support': 0.10
},
'mixed': {
'Reserve_Storage': 0.40,
'Forward_Pick': 0.20,
'Receiving': 0.12,
'Shipping': 0.15,
'Value_Added': 0.05,
'Support': 0.08
}
}
profile_alloc = allocations.get(order_profile, allocations['mixed'])
zones = {
zone: round(total_sq_ft * pct, 0)
for zone, pct in profile_alloc.items()
}
return zones
# Example
zones = design_functional_zones(200000, order_profile='mixed')
print("Functional Zone Allocation:")
for zone, sq_ft in zones.items():
print(f" {zone}: {sq_ft:,.0f} sq ft ({sq_ft/sum(zones.values())*100:.1f}%)")
Storage Systems Selection
Storage System Comparison
| System | Density | Selectivity | FIFO/LIFO | Cost | Best For |
|---|---|---|---|---|---|
| Selective Rack | Low | 100% | Either | $ | Fast movers, high SKU count |
| Double-Deep | Medium | 50% | LIFO | $$ | Medium velocity, paired SKUs |
| Drive-In/Drive-Through | High | 10-20% | LIFO/FIFO | $$ | Slow movers, few SKUs, lots of inventory |
| Push-Back | High | 25-30% | LIFO | $$$ | High volume, limited SKUs |
| Pallet Flow | High | 100% | FIFO | $$$$ | High velocity, date-sensitive |
| Automated AS/RS | Very High | 100% | Either | $$$$$ | Very high volume, limited labor |
Storage System Selection Logic
def select_storage_system(sku_velocity, sku_diversity, fifo_required=False,
space_constraint=False):
"""
Recommend storage system based on operational requirements
Parameters:
- sku_velocity: 'fast', 'medium', 'slow'
- sku_diversity: 'high' (>1000 SKUs), 'medium' (100-1000), 'low' (<100)
- fifo_required: True if FIFO needed (perishables, date-coded)
- space_constraint: True if space is at premium
"""
recommendations = []
if sku_diversity == 'high':
if sku_velocity == 'fast':
recommendations.append({
'system': 'Selective Racking',
'reason': 'High SKU count requires full selectivity',
'priority': 1
})
if space_constraint:
recommendations.append({
'system': 'Narrow Aisle (VNA)',
'reason': 'Increases density for high SKU count',
'priority': 2
})
else:
recommendations.append({
'system': 'Selective Racking',
'reason': 'Full selectivity for diverse SKU mix',
'priority': 1
})
elif sku_diversity == 'medium':
if sku_velocity == 'fast':
recommendations.append({
'system': 'Pallet Flow Rack',
'reason': 'FIFO, high velocity, moderate SKU count',
'priority': 1 if fifo_required else 2
})
recommendations.append({
'system': 'Push-Back Rack',
'reason': 'Dense storage, good throughput',
'priority': 2 if fifo_required else 1
})
else:
recommendations.append({
'system': 'Double-Deep',
'reason': 'Good density with reasonable selectivity',
'priority': 1
})
else: # low SKU diversity
if space_constraint:
recommendations.append({
'system': 'Drive-In Racking',
'reason': 'Maximum density for low SKU count',
'priority': 1 if not fifo_required else 2
})
if fifo_required:
recommendations.append({
'system': 'Drive-Through Racking',
'reason': 'Dense FIFO for low SKU count',
'priority': 1
})
# Sort by priority
recommendations.sort(key=lambda x: x['priority'])
return recommendations
# Example
recs = select_storage_system(
sku_velocity='fast',
sku_diversity='high',
fifo_required=True,
space_constraint=True
)
print("Storage System Recommendations:")
for rec in recs:
print(f" {rec['priority']}. {rec['system']}: {rec['reason']}")
Rack Configuration Calculations
def rack_configuration(clear_height_ft, load_height_ft=5, load_depth_ft=4,
aisle_width_ft=12, rack_depth='single'):
"""
Calculate rack configuration and capacity
Parameters:
- clear_height_ft: Building clear height
- load_height_ft: Height per pallet level
- load_depth_ft: Depth per pallet position
- aisle_width_ft: Aisle width for equipment
- rack_depth: 'single', 'double', 'back-to-back'
"""
# Calculate number of levels (leave clearance for sprinklers/lights)
usable_height = clear_height_ft - 4 # 4 ft clearance
levels = int(usable_height / load_height_ft)
# Rack bay width (typically 96-108 inches for 2 pallets side-by-side)
bay_width_ft = 9 # 2 x 42" pallets + structure
# Calculate positions per bay
if rack_depth == 'single':
positions_per_bay = 2 # 2 pallets wide
depth_ft = load_depth_ft + 2 # Structure
elif rack_depth == 'double':
positions_per_bay = 4 # 2 deep x 2 wide
depth_ft = (load_depth_ft * 2) + 2
elif rack_depth == 'back-to-back':
positions_per_bay = 4 # 2 racks back to back, 2 wide each
depth_ft = (load_depth_ft * 2) + 3 # Shared structure
# Positions per bay
positions_per_bay_total = positions_per_bay * levels
# Linear feet required per bay (includes aisle)
linear_ft_per_bay = bay_width_ft
# Calculate density (positions per 1000 sq ft)
sq_ft_per_bay = bay_width_ft * (depth_ft + aisle_width_ft)
positions_per_1000_sqft = (positions_per_bay_total / sq_ft_per_bay) * 1000
return {
'levels': levels,
'positions_per_bay': positions_per_bay_total,
'bay_width_ft': bay_width_ft,
'depth_ft': depth_ft,
'sq_ft_per_bay': round(sq_ft_per_bay, 1),
'positions_per_1000_sqft': round(positions_per_1000_sqft, 1)
}
# Example
config = rack_configuration(
clear_height_ft=32,
load_height_ft=5,
aisle_width_ft=12,
rack_depth='single'
)
print(f"Rack levels: {config['levels']}")
print(f"Positions per bay: {config['positions_per_bay']}")
print(f"Density: {config['positions_per_1000_sqft']} positions per 1000 sq ft")
Material Handling Equipment Selection
Equipment Types & Specs
1. Counterbalance Forklifts
- Lift height: 15-20 ft
- Aisle width: 12-13 ft
- Use: Receiving, shipping, low-level storage
- Cost: $25K-$40K
2. Reach Trucks
- Lift height: 25-35 ft
- Aisle width: 8-10 ft
- Use: Selective racking, better utilization
- Cost: $35K-$50K
3. Very Narrow Aisle (VNA) / Turret Trucks
- Lift height: 35-45 ft
- Aisle width: 5-6.5 ft
- Use: Maximum density, high SKU count
- Cost: $60K-$100K+
- Requires wire guidance, flat floors
4. Order Pickers
- Lift height: 25-35 ft
- Use: Each/case picking, person-to-goods
- Cost: $40K-$70K
5. Automated Guided Vehicles (AGV)
- Lift height: Varies
- Use: Putaway, replenishment, goods-to-person
- Cost: $100K-$200K per vehicle
def select_material_handling_equipment(storage_height_ft, aisle_budget='medium',
throughput_level='medium',
automation_interest=False):
"""
Recommend material handling equipment
Parameters:
- storage_height_ft: How high storage needs to go
- aisle_budget: 'tight' (<8 ft), 'medium' (8-12 ft), 'wide' (>12 ft)
- throughput_level: 'low', 'medium', 'high'
- automation_interest: Considering automation?
"""
recommendations = []
if storage_height_ft <= 15:
recommendations.append({
'equipment': 'Counterbalance Forklift',
'aisle_width': '12-13 ft',
'cost': '$25K-$40K',
'reason': 'Low height, versatile, lowest cost'
})
elif storage_height_ft <= 30:
if aisle_budget == 'tight':
recommendations.append({
'equipment': 'Very Narrow Aisle (VNA)',
'aisle_width': '5-6.5 ft',
'cost': '$60K-$100K',
'reason': 'Maximum space utilization, tight aisles'
})
else:
recommendations.append({
'equipment': 'Reach Truck',
'aisle_width': '8-10 ft',
'cost': '$35K-$50K',
'reason': 'Good balance of cost and density'
})
else: # > 30 ft
recommendations.append({
'equipment': 'VNA or Automated AS/RS',
'aisle_width': '5-6.5 ft or N/A',
'cost': '$60K+ or $2M+ system',
'reason': 'Required for very high storage'
})
if automation_interest and throughput_level == 'high':
recommendations.append({
'equipment': 'Automated Storage/Retrieval (AS/RS)',
'aisle_width': 'N/A',
'cost': '$2M-$10M+ system',
'reason': 'High throughput, labor savings, accuracy'
})
return recommendations
# Example
equipment = select_material_handling_equipment(
storage_height_ft=28,
aisle_budget='medium',
throughput_level='medium',
automation_interest=False
)
print("Material Handling Equipment Recommendations:")
for eq in equipment:
print(f"\n {eq['equipment']}")
print(f" Aisle width: {eq['aisle_width']}")
print(f" Cost: {eq['cost']}")
print(f" Reason: {eq['reason']}")
Dock & Receiving/Shipping Design
Dock Door Calculations
def calculate_dock_doors(inbound_trucks_per_day, outbound_trucks_per_day,
hours_of_operation=10, dwell_time_hours=2,
utilization_target=0.80):
"""
Calculate required dock doors
Parameters:
- inbound_trucks_per_day: Daily truck arrivals
- outbound_trucks_per_day: Daily truck departures
- hours_of_operation: Working hours per day
- dwell_time_hours: Hours per truck at dock (unload/load time)
- utilization_target: Target dock utilization (0.80 = 80%)
"""
# Capacity per dock door per day
door_capacity = hours_of_operation / dwell_time_hours
# Receiving doors needed
receiving_doors_raw = inbound_trucks_per_day / door_capacity
receiving_doors = receiving_doors_raw / utilization_target
# Shipping doors needed
shipping_doors_raw = outbound_trucks_per_day / door_capacity
shipping_doors = shipping_doors_raw / utilization_target
return {
'receiving_doors': int(np.ceil(receiving_doors)),
'shipping_doors': int(np.ceil(shipping_doors)),
'total_doors': int(np.ceil(receiving_doors + shipping_doors)),
'receiving_utilization': receiving_doors_raw / np.ceil(receiving_doors),
'shipping_utilization': shipping_doors_raw / np.ceil(shipping_doors)
}
# Example
doors = calculate_dock_doors(
inbound_trucks_per_day=50,
outbound_trucks_per_day=70,
hours_of_operation=16, # 2 shifts
dwell_time_hours=2,
utilization_target=0.80
)
print(f"Receiving doors needed: {doors['receiving_doors']}")
print(f"Shipping doors needed: {doors['shipping_doors']}")
print(f"Total dock doors: {doors['total_doors']}")
print(f"Receiving utilization: {doors['receiving_utilization']:.1%}")
print(f"Shipping utilization: {doors['shipping_utilization']:.1%}")
Dock Configuration
Design Considerations:
- Dock spacing: 12 ft centers (standard)
- Dock depth: 60-80 ft for staging area
- Turnaround space: 130-150 ft for 53' trailers
- Drive-in docks: Save space but reduce throughput
- Cross-dock: Requires receiving and shipping proximity
Pick Path & Slotting Design
Travel Distance Calculation
def calculate_pick_travel_distance(orders_per_day, lines_per_order,
avg_travel_per_pick_ft=150,
picker_speed_ft_per_min=200):
"""
Calculate picker travel distance and time
Parameters:
- orders_per_day: Daily order volume
- lines_per_order: Average order lines
- avg_travel_per_pick_ft: Average travel distance per pick
- picker_speed_ft_per_min: Walking/driving speed
"""
picks_per_day = orders_per_day * lines_per_order
# Total travel distance
total_travel_ft = picks_per_day * avg_travel_per_pick_ft
total_travel_miles = total_travel_ft / 5280
# Travel time
travel_time_min = total_travel_ft / picker_speed_ft_per_min
travel_time_hours = travel_time_min / 60
# If picks per hour = 100, calculate labor needed
pick_time_hours = picks_per_day / 100
total_labor_hours = pick_time_hours + travel_time_hours
return {
'picks_per_day': picks_per_day,
'total_travel_miles': round(total_travel_miles, 1),
'travel_time_hours': round(travel_time_hours, 1),
'pick_time_hours': round(pick_time_hours, 1),
'total_labor_hours': round(total_labor_hours, 1),
'pickers_needed_single_shift': round(total_labor_hours / 8, 1)
}
# Example
travel = calculate_pick_travel_distance(
orders_per_day=2000,
lines_per_order=5,
avg_travel_per_pick_ft=150,
picker_speed_ft_per_min=200
)
print(f"Daily picks: {travel['picks_per_day']}")
print(f"Daily travel: {travel['total_travel_miles']} miles")
print(f"Travel time: {travel['travel_time_hours']} hours")
print(f"Pickers needed: {travel['pickers_needed_single_shift']}")
Golden Zone Placement
Principle:
- Place fastest movers in most accessible locations
- "Golden zone": Waist to shoulder height, front of rack
- Minimize vertical and horizontal travel
Implementation: See warehouse-slotting-optimization skill for detailed algorithms
Automation & Technology
Warehouse Automation Options
1. Conveyor Systems
- Use: Move products between zones
- Cost: $200-$500 per linear foot
- ROI: 2-4 years
2. Sortation Systems
- Use: Sort orders/cartons to lanes/destinations
- Types: Sliding shoe, cross-belt, tilt-tray
- Cost: $500K-$3M+
- Throughput: 5K-30K+ units/hour
3. Automated Storage & Retrieval (AS/RS)
- Use: Dense storage, high throughput
- Types: Mini-load, unit-load, shuttle systems
- Cost: $2M-$20M+
- ROI: 3-7 years
4. Goods-to-Person (GTP)
- Use: Eliminate picker travel
- Types: Vertical lift modules, horizontal carousels, shuttle systems
- Cost: $500K-$5M+
- Pick rates: 200-400+ lines/person/hour
5. Robotics
- Types: AMRs (autonomous mobile robots), picking robots, palletizing robots
- Cost: $50K-$200K per robot
- Scalability: Add/remove as needed
6. Automated Guided Vehicles (AGV)
- Use: Move pallets/containers
- Cost: $100K-$200K per vehicle
- Requires infrastructure (wires/magnets or LiDAR)
def automation_roi_analysis(current_labor_cost, automation_cost,
labor_savings_pct, maintenance_cost_annual,
years=5):
"""
Calculate ROI for warehouse automation
Parameters:
- current_labor_cost: Annual labor cost ($)
- automation_cost: Upfront automation investment ($)
- labor_savings_pct: Labor reduction (e.g., 0.40 for 40%)
- maintenance_cost_annual: Annual maintenance ($)
- years: Analysis period
"""
annual_savings = current_labor_cost * labor_savings_pct
annual_net_savings = annual_savings - maintenance_cost_annual
# Simple payback period
payback_years = automation_cost / annual_net_savings
# NPV calculation (assume 10% discount rate)
discount_rate = 0.10
npv = -automation_cost
for year in range(1, years + 1):
npv += annual_net_savings / ((1 + discount_rate) ** year)
# ROI
total_savings = annual_net_savings * years
roi = (total_savings - automation_cost) / automation_cost
return {
'automation_cost': automation_cost,
'annual_labor_savings': round(annual_savings, 0),
'annual_maintenance': maintenance_cost_annual,
'annual_net_savings': round(annual_net_savings, 0),
'payback_years': round(payback_years, 2),
'npv_5_year': round(npv, 0),
'roi_5_year': round(roi, 2)
}
# Example
roi = automation_roi_analysis(
current_labor_cost=2_000_000, # $2M annual labor
automation_cost=4_000_000, # $4M automation investment
labor_savings_pct=0.50, # 50% labor reduction
maintenance_cost_annual=200_000, # $200K annual maintenance
years=5
)
print(f"Automation cost: ${roi['automation_cost']:,.0f}")
print(f"Annual labor savings: ${roi['annual_labor_savings']:,.0f}")
print(f"Annual net savings: ${roi['annual_net_savings']:,.0f}")
print(f"Payback period: {roi['payback_years']} years")
print(f"5-year NPV: ${roi['npv_5_year']:,.0f}")
print(f"5-year ROI: {roi['roi_5_year']:.1%}")
Warehouse KPIs & Performance
Key Performance Indicators
def warehouse_kpis(total_sq_ft, storage_sq_ft, occupied_positions,
total_positions, throughput_units, labor_hours,
orders_shipped, order_accuracy_pct):
"""
Calculate warehouse performance KPIs
"""
# Space utilization
space_utilization = occupied_positions / total_positions
# Inventory density
inventory_density = occupied_positions / (storage_sq_ft / 1000)
# Productivity
units_per_labor_hour = throughput_units / labor_hours
# Order accuracy
order_accuracy = order_accuracy_pct / 100
# Operating cost per unit (example)
# Would need cost inputs for full calculation
kpis = {
'Space_Utilization_%': round(space_utilization * 100, 1),
'Inventory_Density_per_1000sqft': round(inventory_density, 1),
'Units_per_Labor_Hour': round(units_per_labor_hour, 1),
'Order_Accuracy_%': round(order_accuracy * 100, 2),
'Orders_per_Labor_Hour': round(orders_shipped / labor_hours, 1)
}
return kpis
# Example
kpis = warehouse_kpis(
total_sq_ft=200000,
storage_sq_ft=120000,
occupied_positions=4200,
total_positions=5000,
throughput_units=50000,
labor_hours=500,
orders_shipped=2000,
order_accuracy_pct=99.5
)
print("Warehouse KPIs:")
for metric, value in kpis.items():
print(f" {metric}: {value}")
Tools & Libraries
Design & Simulation Software
CAD/Layout Tools:
- AutoCAD: 2D/3D warehouse layout
- SketchUp: 3D visualization
- Warehouse Blueprint: Online warehouse design
- SmartDraw: Warehouse layout templates
Simulation:
- FlexSim: 3D simulation modeling
- AnyLogic: Multi-method simulation
- Simio: Process simulation
- Arena: Discrete event simulation
- SimPy (Python): Discrete event simulation library
Analysis:
- Excel/Python: Capacity calculations, ROI analysis
- Tableau/Power BI: Performance dashboards
Common Challenges & Solutions
Challenge: Insufficient Height Utilization
Problem:
- Low storage density
- Wasting cubic footage
- Only using 10-15 ft of 30+ ft clear height
Solutions:
- Install taller racking (selective or VNA)
- Use reach trucks or order pickers
- Implement mezzanines for picking
- Consider AS/RS for maximum density
Challenge: Excessive Picker Travel
Problem:
- Low productivity
- High labor costs
- Pickers traveling miles per day
Solutions:
- Implement velocity-based slotting (see warehouse-slotting-optimization)
- Zone picking or batch picking strategies
- Goods-to-person automation
- Optimize pick path routing
- Forward pick locations for fast movers
Challenge: Dock Congestion
Problem:
- Trucks waiting, detention fees
- Receiving/shipping bottleneck
- Poor appointment scheduling
Solutions:
- Add dock doors if capacity constrained
- Implement dock scheduling system (YMS)
- Use cross-docking to bypass storage
- Separate receiving and shipping operations
- Stagger appointments throughout day
Challenge: Seasonal Volume Fluctuations
Problem:
- Facility sized for peak, underutilized off-peak
- Can't handle peak volume
- Temporary labor challenges
Solutions:
- Flexible storage (collapsible racks, temporary)
- Overflow space with 3PL partners
- Scale automation (add/remove AMRs)
- Cross-training workforce
- Build for average + use overflow strategy
Challenge: Mixed Order Profiles
Problem:
- Some orders are pallets, some are eaches
- Difficult to optimize for both
- Separate processes inefficient
Solutions:
- Zone warehouse by order type
- Separate pallet and each picking areas
- Use multi-modal automation
- Different pick strategies by order type
- Consider separate facilities for very different profiles
Output Format
Warehouse Design Report
Executive Summary:
- Warehouse size and configuration
- Storage capacity (pallet positions)
- Throughput capacity (units/day, orders/day)
- Capital investment required
- Operating cost estimates
Facility Specifications:
| Specification | Value |
|---|---|
| Total Square Footage | 250,000 sq ft |
| Clear Height | 32 ft |
| Storage Square Footage | 150,000 sq ft |
| Pallet Positions | 6,500 |
| Receiving Dock Doors | 12 |
| Shipping Dock Doors | 18 |
| Storage System | Selective Racking (80%), Push-Back (20%) |
| Material Handling | Reach Trucks (6), Counterbalance (4) |
Layout Diagram:
- Floor plan with functional zones
- Material flow diagram
- Racking layout and aisle configuration
Capacity Analysis:
| Metric | Design Capacity | Peak Capacity (1.2x) |
|---|---|---|
| Storage Positions | 6,500 | 7,800 (w/ floor stack) |
| Daily Throughput | 100,000 units | 120,000 units |
| Orders per Day | 3,000 | 3,600 |
| Receiving (pallets/day) | 800 | 960 |
| Shipping (trucks/day) | 90 | 108 |
Investment Summary:
| Category | Cost |
|---|---|
| Building (if new) | $12M |
| Racking Systems | $2.5M |
| Material Handling Equipment | $800K |
| Conveyor/Sortation | $1.5M |
| IT Systems (WMS, etc.) | $500K |
| Total Capital | $17.3M |
Operating Costs (Annual):
| Category | Cost |
|---|---|
| Labor | $4.5M |
| Lease/Depreciation | $2.0M |
| Utilities | $400K |
| Maintenance | $300K |
| Total Annual | $7.2M |
Cost per Unit: $0.72 per unit shipped
Questions to Ask
If you need more context:
- What's the throughput requirement? (units/day, orders/day, order profile)
- What's the SKU count and velocity distribution?
- What's the growth projection over 3-5 years?
- Is a site identified? What are the constraints? (size, shape, clear height)
- What's the order profile? (pallets, cases, eaches, mixed)
- Are there special requirements? (temp control, hazmat, security)
- What's the automation appetite and budget?
- Greenfield or brownfield (existing building)?
Related Skills
- warehouse-slotting-optimization: Optimize product placement within warehouse
- warehouse-automation: Deep dive into automation systems
- order-fulfillment: Pick, pack, ship operations design
- facility-location-problem: Where to locate the warehouse
- picker-routing-optimization: Optimize pick paths
- dock-door-assignment: Optimize dock scheduling
- cross-docking: Flow-through operations design
- warehouse-location-optimization: Network-level warehouse placement
More from kishorkukreja/awesome-supply-chain
procurement-optimization
When the user wants to optimize procurement decisions, allocate orders across suppliers, or determine optimal order quantities. Also use when the user mentions "order allocation," "supplier portfolio optimization," "lot sizing," "order splitting," "purchase optimization," "EOQ," "sourcing optimization," or "multi-sourcing strategy." For supplier selection, see supplier-selection. For spend analysis, see spend-analysis.
77replenishment-strategy
When the user wants to design or optimize replenishment strategies, determine replenishment policies, or improve inventory flow between locations. Also use when the user mentions "inventory replenishment," "stock replenishment," "min-max inventory," "DRP," "auto-replenishment," "vendor-managed inventory," "forward pick replenishment," or "retail store replenishment." For safety stock calculations, see inventory-optimization. For multi-echelon networks, see multi-echelon-inventory.
37inventory-optimization
When the user wants to optimize inventory levels, calculate safety stock, determine reorder points, or minimize inventory costs. Also use when the user mentions "inventory management," "safety stock," "EOQ," "reorder point," "service level," "stockout prevention," "ABC analysis," "inventory turns," or "working capital reduction." For warehouse slotting, see warehouse-slotting-optimization. For multi-echelon systems, see multi-echelon-inventory.
34supplier-selection
When the user wants to evaluate suppliers, select vendors, or perform supplier scoring and qualification. Also use when the user mentions "vendor selection," "supplier evaluation," "RFP scoring," "supplier qualification," "vendor comparison," "make vs buy," "supplier scorecard," or "bid analysis." For ongoing supplier risk monitoring, see supplier-risk-management. For contract negotiation, see contract-management.
32pharmaceutical-supply-chain
When the user wants to optimize pharmaceutical supply chains, manage cold chain logistics, ensure regulatory compliance, or implement serialization. Also use when the user mentions "pharma supply chain," "GMP compliance," "cold chain," "drug serialization," "clinical trials logistics," "pharmaceutical distribution," "good distribution practices," "GDP," "drug safety," or "pharmaceutical quality." For general healthcare, see hospital-logistics. For clinical trials specifically, see clinical-trial-logistics.
30retail-replenishment
When the user wants to optimize retail store replenishment, calculate reorder points for stores, or manage continuous replenishment. Also use when the user mentions "store replenishment," "auto-replenishment," "min-max inventory," "store orders," "DC to store," "continuous replenishment," or "vendor-managed inventory (VMI)." For initial allocation, see retail-allocation. For DC operations, see warehouse-design.
29