Back to Skills

cross-docking

majiayu000
Updated Yesterday
14 views
58
9
58
View on GitHub
Designdesign

About

This skill helps developers design and optimize cross-docking logistics systems to minimize storage and accelerate product flow. It activates when users discuss transshipment, flow-through distribution, or related terms like "dock-to-dock" or "consolidation center." The skill provides expertise on facility design, operational requirements, and process optimization for efficient dock-to-dock transfer.

Quick Install

Claude Code

Recommended
Plugin CommandRecommended
/plugin add https://github.com/majiayu000/claude-skill-registry
Git CloneAlternative
git clone https://github.com/majiayu000/claude-skill-registry.git ~/.claude/skills/cross-docking

Copy and paste this command in Claude Code to install this skill

Documentation

Cross-Docking

You are an expert in cross-docking operations and transshipment logistics. Your goal is to help design and optimize cross-dock facilities that minimize handling, reduce inventory, and accelerate product flow from inbound to outbound without storage.

Initial Assessment

Before designing cross-dock operations, understand:

  1. Business Context

    • What products are being cross-docked?
    • Current supply chain structure?
    • Why cross-dock? (speed, cost, space constraints)
    • Volume and SKU complexity?
  2. Operational Requirements

    • Inbound frequency? (continuous, scheduled)
    • Outbound frequency? (daily routes, on-demand)
    • Processing window? (hours from receipt to ship)
    • Quality/inspection requirements?
  3. Facility Characteristics

    • Existing facility or new build?
    • Number of dock doors?
    • Staging area size?
    • Material handling equipment?
    • Technology systems (WMS, TMS)?
  4. Product Characteristics

    • Case-level or pallet-level?
    • Full pallet, mixed pallet, or break-bulk?
    • Temperature requirements?
    • Handling restrictions?

Cross-Docking Framework

Types of Cross-Docking

1. Pre-Distributed Cross-Docking

  • Supplier pre-sorts and labels for final destination
  • Minimal handling at cross-dock
  • Direct transfer inbound to outbound
  • Best for: Retail distribution, known destinations

2. Consolidation Cross-Docking

  • Combine inbound shipments from multiple origins
  • Consolidate into single outbound shipment
  • Best for: LTL to TL conversion, supplier consolidation

3. Deconsolidation (Break-Bulk) Cross-Docking

  • Receive bulk shipments (TL, container)
  • Break into smaller shipments for multiple destinations
  • Best for: Import distribution, regional breakdown

4. Opportunistic Cross-Docking

  • Dynamic decision to cross-dock vs. store
  • Based on immediate outbound demand
  • Best for: Mixed operations, demand-driven

5. Manufacturing Cross-Docking

  • Receive components, assemble/kit, ship finished goods
  • Light assembly or kitting operations
  • Best for: JIT manufacturing, value-added services

Cross-Dock Design Principles

Facility Layout

import numpy as np
import matplotlib.pyplot as plt

class CrossDockLayoutDesigner:
    """
    Design optimal cross-dock facility layout

    Optimize door assignments and flow paths
    """

    def __init__(self, num_inbound_doors, num_outbound_doors,
                 staging_area_sqft):
        self.inbound_doors = num_inbound_doors
        self.outbound_doors = num_outbound_doors
        self.staging_area = staging_area_sqft

    def calculate_facility_requirements(self, daily_volume_pallets,
                                       dwell_time_hours=4):
        """
        Calculate facility size requirements

        Parameters:
        - daily_volume_pallets: pallets per day through facility
        - dwell_time_hours: average time pallet in facility
        """

        # Peak simultaneous pallets in facility
        pallets_per_hour = daily_volume_pallets / 24
        peak_pallets = pallets_per_hour * dwell_time_hours

        # Space per pallet (including aisles)
        sqft_per_pallet = 25  # 40x48 pallet + spacing

        staging_required = peak_pallets * sqft_per_pallet

        # Door requirements
        # Assume 30 pallets per door per day (4-hour turnaround)
        inbound_doors_needed = np.ceil(daily_volume_pallets / 30)
        outbound_doors_needed = np.ceil(daily_volume_pallets / 30)

        return {
            'staging_area_sqft': staging_required,
            'inbound_doors_needed': int(inbound_doors_needed),
            'outbound_doors_needed': int(outbound_doors_needed),
            'peak_pallets': peak_pallets,
            'daily_volume': daily_volume_pallets
        }

    def design_i_shaped_layout(self):
        """
        I-shaped layout: Inbound on one side, outbound on opposite

        Pros: Clear separation, simple traffic flow
        Cons: Longer travel distance across facility
        """

        layout = {
            'type': 'I-shaped',
            'inbound_side': 'North',
            'outbound_side': 'South',
            'staging': 'Center aisle',
            'flow': 'North to South',
            'avg_travel_distance': self.staging_area ** 0.5,  # Rough estimate
            'advantages': [
                'Clear separation of inbound/outbound',
                'Easy to scale by adding doors',
                'Simple traffic patterns'
            ],
            'disadvantages': [
                'Longer travel distances',
                'May require more staging space'
            ]
        }

        return layout

    def design_l_shaped_layout(self):
        """
        L-shaped layout: Inbound and outbound on adjacent sides

        Pros: Shorter travel distance, compact
        Cons: More complex traffic patterns
        """

        layout = {
            'type': 'L-shaped',
            'inbound_side': 'North',
            'outbound_side': 'East',
            'staging': 'Corner staging area',
            'flow': 'North to East',
            'avg_travel_distance': self.staging_area ** 0.5 * 0.7,
            'advantages': [
                'Shorter travel distances',
                'More compact footprint',
                'Better land utilization'
            ],
            'disadvantages': [
                'Complex traffic flow',
                'Potential congestion at corner',
                'Less scalable'
            ]
        }

        return layout

    def design_t_shaped_layout(self):
        """
        T-shaped layout: Inbound on base, outbound on two wings

        Pros: Balanced flow, multiple staging zones
        Cons: Requires specific building shape
        """

        layout = {
            'type': 'T-shaped',
            'inbound_side': 'North (base)',
            'outbound_sides': 'East and West (wings)',
            'staging': 'Distributed staging zones',
            'flow': 'North to East/West',
            'advantages': [
                'Balanced distribution',
                'Multiple staging zones',
                'Good for high volume'
            ],
            'disadvantages': [
                'Requires specific building',
                'More complex management',
                'Higher facility cost'
            ]
        }

        return layout

    def recommend_layout(self, daily_volume, land_constraints=None):
        """
        Recommend optimal layout based on requirements

        Parameters:
        - daily_volume: daily pallet volume
        - land_constraints: 'rectangular', 'square', 'irregular'
        """

        if daily_volume < 500:
            recommendation = 'I-shaped'
            rationale = 'Lower volume, simple operations'

        elif daily_volume < 1500:
            if land_constraints == 'square':
                recommendation = 'L-shaped'
                rationale = 'Medium volume, compact footprint'
            else:
                recommendation = 'I-shaped'
                rationale = 'Medium volume, scalable design'

        else:
            recommendation = 'T-shaped or X-shaped'
            rationale = 'High volume, need distributed operations'

        return {
            'recommended_layout': recommendation,
            'rationale': rationale,
            'daily_volume': daily_volume
        }

# Example usage
designer = CrossDockLayoutDesigner(
    num_inbound_doors=20,
    num_outbound_doors=25,
    staging_area_sqft=50000
)

requirements = designer.calculate_facility_requirements(
    daily_volume_pallets=1200,
    dwell_time_hours=4
)

print(f"Staging area needed: {requirements['staging_area_sqft']:,.0f} sq ft")
print(f"Inbound doors: {requirements['inbound_doors_needed']}")
print(f"Outbound doors: {requirements['outbound_doors_needed']}")

layout_rec = designer.recommend_layout(daily_volume=1200)
print(f"\nRecommended layout: {layout_rec['recommended_layout']}")
print(f"Rationale: {layout_rec['rationale']}")

Door Assignment Optimization

from pulp import *
import pandas as pd

class DoorAssignmentOptimizer:
    """
    Optimize assignment of shipments to dock doors

    Minimize travel distance and congestion
    """

    def __init__(self, inbound_shipments, outbound_routes, door_positions):
        """
        Parameters:
        - inbound_shipments: DataFrame with inbound load details
        - outbound_routes: DataFrame with outbound route details
        - door_positions: Dict mapping door IDs to (x, y) positions
        """
        self.inbound = inbound_shipments
        self.outbound = outbound_routes
        self.door_positions = door_positions

    def calculate_distance_matrix(self):
        """
        Calculate distance between all inbound and outbound doors

        Returns matrix of travel distances
        """

        inbound_doors = sorted(self.inbound['door_id'].unique())
        outbound_doors = sorted(self.outbound['door_id'].unique())

        distances = {}

        for in_door in inbound_doors:
            for out_door in outbound_doors:
                in_pos = self.door_positions[in_door]
                out_pos = self.door_positions[out_door]

                # Euclidean distance (simplified)
                distance = ((in_pos[0] - out_pos[0]) ** 2 +
                           (in_pos[1] - out_pos[1]) ** 2) ** 0.5

                distances[(in_door, out_door)] = distance

        return distances

    def optimize_door_assignments(self):
        """
        Assign shipments to minimize total travel distance

        Uses MIP optimization
        """

        # Calculate distance matrix
        distances = self.calculate_distance_matrix()

        # Create optimization problem
        prob = LpProblem("Door_Assignment", LpMinimize)

        # Decision variables
        # x[i,j] = 1 if inbound shipment i assigned to inbound door j
        inbound_assignments = LpVariable.dicts(
            "InboundAssign",
            [(i, j) for i in self.inbound.index
             for j in self.inbound['door_id'].unique()],
            cat='Binary'
        )

        # y[k,m] = 1 if outbound route k assigned to outbound door m
        outbound_assignments = LpVariable.dicts(
            "OutboundAssign",
            [(k, m) for k in self.outbound.index
             for m in self.outbound['door_id'].unique()],
            cat='Binary'
        )

        # Objective: minimize total travel distance
        # This is simplified - in practice, track pallet flows between doors
        prob += lpSum([
            distances.get((self.inbound.loc[i, 'door_id'],
                          self.outbound.loc[k, 'door_id']), 0) *
            self.inbound.loc[i, 'pallets'] *
            inbound_assignments.get((i, self.inbound.loc[i, 'door_id']), 0)
            for i in self.inbound.index
            for k in self.outbound.index
        ])

        # Constraints: Each shipment assigned to exactly one door
        for i in self.inbound.index:
            prob += lpSum([inbound_assignments[(i, j)]
                          for j in self.inbound['door_id'].unique()]) == 1

        for k in self.outbound.index:
            prob += lpSum([outbound_assignments[(k, m)]
                          for m in self.outbound['door_id'].unique()]) == 1

        # Solve
        prob.solve(PULP_CBC_CMD(msg=0))

        # Extract solution
        assignments = {
            'inbound': {},
            'outbound': {},
            'total_distance': value(prob.objective)
        }

        for (i, j), var in inbound_assignments.items():
            if var.varValue > 0.5:
                assignments['inbound'][i] = j

        for (k, m), var in outbound_assignments.items():
            if var.varValue > 0.5:
                assignments['outbound'][k] = m

        return assignments

    def analyze_flow_patterns(self):
        """
        Analyze flow patterns between inbound and outbound

        Identify high-volume lanes for optimization
        """

        # Group by origin-destination pairs
        flows = []

        for _, inbound in self.inbound.iterrows():
            for _, outbound in self.outbound.iterrows():
                # Simplified: assume all inbound goes to all outbound
                flow_volume = inbound['pallets'] * 0.1  # Simplified allocation

                flows.append({
                    'inbound_door': inbound['door_id'],
                    'outbound_door': outbound['door_id'],
                    'volume': flow_volume,
                    'origin': inbound['origin'],
                    'destination': outbound['destination']
                })

        flows_df = pd.DataFrame(flows)

        # Identify top flow lanes
        top_flows = flows_df.nlargest(10, 'volume')

        return {
            'all_flows': flows_df,
            'top_flows': top_flows,
            'total_volume': flows_df['volume'].sum()
        }

Cross-Dock Operations

Receiving Process

class CrossDockReceivingManager:
    """
    Manage inbound receiving process for cross-dock

    Optimize receiving sequence and staging
    """

    def __init__(self):
        self.receiving_queue = []
        self.staged_pallets = {}

    def schedule_inbound_receipts(self, appointments):
        """
        Schedule inbound truck appointments

        Optimize door utilization and avoid congestion

        Parameters:
        - appointments: DataFrame with requested arrival times
        """

        # Time slot capacity (doors * slots per hour)
        num_doors = 20
        capacity_per_hour = num_doors * 1  # 1 truck per door per hour

        scheduled = []

        for _, appt in appointments.iterrows():
            requested_time = appt['requested_arrival']

            # Find available slot
            slot_found = False
            for hour_offset in range(24):  # Try up to 24 hours ahead
                check_time = requested_time + pd.Timedelta(hours=hour_offset)

                # Count trucks in this hour
                trucks_in_slot = sum(
                    1 for s in scheduled
                    if s['scheduled_time'].hour == check_time.hour
                )

                if trucks_in_slot < capacity_per_hour:
                    scheduled.append({
                        'shipment_id': appt['shipment_id'],
                        'requested_time': requested_time,
                        'scheduled_time': check_time,
                        'door_assigned': trucks_in_slot + 1,
                        'delay_hours': hour_offset
                    })
                    slot_found = True
                    break

            if not slot_found:
                scheduled.append({
                    'shipment_id': appt['shipment_id'],
                    'requested_time': requested_time,
                    'scheduled_time': None,
                    'status': 'Unable to schedule'
                })

        return pd.DataFrame(scheduled)

    def process_inbound_shipment(self, shipment_id, pallets, destinations):
        """
        Process inbound shipment

        Sort and stage pallets by destination

        Parameters:
        - shipment_id: unique shipment identifier
        - pallets: list of pallet IDs
        - destinations: dict mapping pallet to destination
        """

        processed = {
            'shipment_id': shipment_id,
            'total_pallets': len(pallets),
            'staged_by_destination': {}
        }

        # Sort pallets by destination
        for pallet in pallets:
            destination = destinations.get(pallet, 'Unknown')

            if destination not in self.staged_pallets:
                self.staged_pallets[destination] = []

            self.staged_pallets[destination].append(pallet)

            if destination not in processed['staged_by_destination']:
                processed['staged_by_destination'][destination] = 0

            processed['staged_by_destination'][destination] += 1

        return processed

    def get_staging_summary(self):
        """Get summary of staged pallets by destination"""

        summary = []

        for destination, pallets in self.staged_pallets.items():
            summary.append({
                'destination': destination,
                'pallets_staged': len(pallets),
                'ready_to_ship': len(pallets) >= 20  # Minimum for TL
            })

        return pd.DataFrame(summary)

Shipping Process

class CrossDockShippingManager:
    """
    Manage outbound shipping process

    Build loads and dispatch trucks
    """

    def __init__(self, truck_capacity=26):
        self.truck_capacity = truck_capacity  # pallets
        self.outbound_loads = []

    def build_outbound_loads(self, staged_pallets, routes):
        """
        Build outbound truck loads from staged pallets

        Parameters:
        - staged_pallets: dict of destination -> pallet list
        - routes: DataFrame with route information
        """

        loads = []
        load_id = 1

        for _, route in routes.iterrows():
            destination = route['destination']
            available_pallets = staged_pallets.get(destination, [])

            if len(available_pallets) == 0:
                continue

            # Build full truckloads
            while len(available_pallets) >= self.truck_capacity:
                load_pallets = available_pallets[:self.truck_capacity]
                available_pallets = available_pallets[self.truck_capacity:]

                loads.append({
                    'load_id': f'LOAD{load_id:04d}',
                    'destination': destination,
                    'pallets': len(load_pallets),
                    'utilization': 1.0,
                    'status': 'Full Load'
                })

                load_id += 1

            # Handle remaining pallets (partial load)
            if len(available_pallets) > 0:
                loads.append({
                    'load_id': f'LOAD{load_id:04d}',
                    'destination': destination,
                    'pallets': len(available_pallets),
                    'utilization': len(available_pallets) / self.truck_capacity,
                    'status': 'Partial Load'
                })

                load_id += 1

        return pd.DataFrame(loads)

    def optimize_multi_stop_routes(self, partial_loads, max_stops=3):
        """
        Consolidate partial loads into multi-stop routes

        Reduce number of trucks needed

        Parameters:
        - partial_loads: DataFrame with partial loads
        - max_stops: maximum stops per route
        """

        # Simple greedy algorithm
        multi_stop_routes = []
        remaining_loads = partial_loads.copy()

        while len(remaining_loads) > 0:
            # Start new route
            route = []
            total_pallets = 0

            for idx, load in remaining_loads.iterrows():
                if (len(route) < max_stops and
                    total_pallets + load['pallets'] <= self.truck_capacity):

                    route.append({
                        'load_id': load['load_id'],
                        'destination': load['destination'],
                        'pallets': load['pallets']
                    })

                    total_pallets += load['pallets']
                    remaining_loads = remaining_loads.drop(idx)

                    if total_pallets >= self.truck_capacity:
                        break

            if route:
                multi_stop_routes.append({
                    'route_id': len(multi_stop_routes) + 1,
                    'stops': len(route),
                    'total_pallets': total_pallets,
                    'utilization': total_pallets / self.truck_capacity,
                    'route': route
                })

        return multi_stop_routes

Cross-Dock Performance Metrics

Key Performance Indicators

class CrossDockMetrics:
    """
    Calculate cross-dock performance metrics

    Track efficiency and identify improvement opportunities
    """

    def __init__(self, operations_data):
        """
        Parameters:
        - operations_data: DataFrame with operational logs
          columns: ['timestamp', 'shipment_id', 'event_type',
                   'location', 'pallets', 'duration']
        """
        self.data = operations_data

    def calculate_dwell_time(self):
        """
        Calculate average dwell time

        Time from inbound receipt to outbound ship
        """

        # Group by shipment
        shipment_times = {}

        for _, event in self.data.iterrows():
            shipment_id = event['shipment_id']

            if shipment_id not in shipment_times:
                shipment_times[shipment_id] = {}

            event_type = event['event_type']
            timestamp = event['timestamp']

            if event_type == 'inbound_received':
                shipment_times[shipment_id]['received'] = timestamp
            elif event_type == 'outbound_shipped':
                shipment_times[shipment_id]['shipped'] = timestamp

        # Calculate dwell times
        dwell_times = []

        for shipment_id, times in shipment_times.items():
            if 'received' in times and 'shipped' in times:
                dwell = (times['shipped'] - times['received']).total_seconds() / 3600
                dwell_times.append(dwell)

        return {
            'avg_dwell_time_hours': np.mean(dwell_times) if dwell_times else 0,
            'median_dwell_time_hours': np.median(dwell_times) if dwell_times else 0,
            'max_dwell_time_hours': np.max(dwell_times) if dwell_times else 0,
            'target_dwell_time_hours': 4,  # Best practice
            'shipments_within_target': sum(1 for d in dwell_times if d <= 4) / len(dwell_times) if dwell_times else 0
        }

    def calculate_dock_door_utilization(self, num_doors=20, hours_per_day=16):
        """
        Calculate dock door utilization

        % of time doors are occupied
        """

        # Count door-hours used
        door_events = self.data[
            self.data['event_type'].isin(['inbound_received', 'outbound_shipped'])
        ]

        total_door_hours = door_events['duration'].sum()

        # Available door-hours
        days = (self.data['timestamp'].max() - self.data['timestamp'].min()).days
        available_door_hours = num_doors * hours_per_day * days

        utilization = total_door_hours / available_door_hours if available_door_hours > 0 else 0

        return {
            'door_utilization': utilization,
            'total_door_hours_used': total_door_hours,
            'available_door_hours': available_door_hours,
            'target_utilization': 0.75  # 75% target
        }

    def calculate_throughput(self):
        """
        Calculate facility throughput

        Pallets per hour, per day, per square foot
        """

        total_pallets = self.data[
            self.data['event_type'] == 'inbound_received'
        ]['pallets'].sum()

        hours = (self.data['timestamp'].max() -
                self.data['timestamp'].min()).total_seconds() / 3600

        days = hours / 24

        return {
            'pallets_per_hour': total_pallets / hours if hours > 0 else 0,
            'pallets_per_day': total_pallets / days if days > 0 else 0,
            'total_pallets': total_pallets
        }

    def calculate_crossdock_rate(self):
        """
        Calculate % of volume cross-docked vs. stored

        True cross-dock = ship within 24 hours
        """

        shipment_times = {}

        for _, event in self.data.iterrows():
            shipment_id = event['shipment_id']

            if shipment_id not in shipment_times:
                shipment_times[shipment_id] = {}

            if event['event_type'] == 'inbound_received':
                shipment_times[shipment_id]['received'] = event['timestamp']
            elif event['event_type'] == 'outbound_shipped':
                shipment_times[shipment_id]['shipped'] = event['timestamp']

        # Calculate cross-dock rate
        total_shipments = len(shipment_times)
        crossdocked = 0

        for times in shipment_times.values():
            if 'received' in times and 'shipped' in times:
                dwell_hours = (times['shipped'] - times['received']).total_seconds() / 3600
                if dwell_hours <= 24:
                    crossdocked += 1

        crossdock_rate = crossdocked / total_shipments if total_shipments > 0 else 0

        return {
            'crossdock_rate': crossdock_rate,
            'total_shipments': total_shipments,
            'crossdocked_shipments': crossdocked,
            'stored_shipments': total_shipments - crossdocked,
            'target_crossdock_rate': 0.90  # 90% target
        }

    def generate_performance_report(self):
        """Generate comprehensive performance report"""

        dwell = self.calculate_dwell_time()
        doors = self.calculate_dock_door_utilization()
        throughput = self.calculate_throughput()
        xdock_rate = self.calculate_crossdock_rate()

        return {
            'dwell_time': dwell,
            'door_utilization': doors,
            'throughput': throughput,
            'crossdock_rate': xdock_rate
        }

Common Challenges & Solutions

Challenge: Long Dwell Times

Problem:

  • Product sitting too long in cross-dock
  • Approaching storage operation (defeating purpose)
  • Target: <4 hours, seeing 12-24 hours

Solutions:

  • Synchronized inbound/outbound schedules
  • Pre-assigned outbound destinations (before arrival)
  • Dedicated staging zones by destination
  • Wave-based processing (time windows)
  • Improve dock door scheduling
  • Better WMS system for visibility
  • Real-time status tracking

Challenge: Mismatched Inbound/Outbound Timing

Problem:

  • Inbound arrives, but no outbound ready
  • Outbound waiting for inbound
  • Creates storage need

Solutions:

  • Time-slotted appointments
  • Advance shipping notices (ASN)
  • Buffer staging for timing mismatches
  • Multi-day outbound consolidation window
  • Demand-driven pull system
  • Communicate closely with carriers

Challenge: Product Damage

Problem:

  • Multiple handling points increase damage
  • Fast pace increases risk
  • Claims and returns

Solutions:

  • Minimize touches (goal: 2 or less)
  • Use conveyors or automated systems
  • Train employees on proper handling
  • Pre-palletized/floor-loaded inbound
  • Quality checkpoints at key stages
  • Track damage by handler/shift

Challenge: Mixing Cross-Dock and Storage

Problem:

  • Facility has both cross-dock and storage
  • Confusion about which product to cross-dock
  • Suboptimal use of space

Solutions:

  • Clearly define cross-dock criteria
  • Separate physical zones
  • Different SKU strategies (A items = cross-dock)
  • Use WMS to direct putaway decisions
  • Track and measure cross-dock percentage
  • Set targets by product category

Challenge: High Labor Costs

Problem:

  • Labor-intensive sorting and staging
  • Premium pay for speed requirements
  • Overtime for processing windows

Solutions:

  • Automate sortation (sorters, conveyors)
  • Pre-sort at origin (pre-distributed model)
  • Use RF/barcode scanning for accuracy
  • Optimize door assignments (reduce travel)
  • Cross-train workforce
  • Flex labor with peak times

Challenge: Limited Staging Space

Problem:

  • Congested staging areas
  • Can't hold pallets for consolidation
  • Inefficient use of space

Solutions:

  • Increase staging density (narrower aisles)
  • Vertical staging (pallet racking)
  • Dynamic staging zones (real-time allocation)
  • Flow-through lanes (minimal staging)
  • Off-site buffer warehouse (overflow)
  • Smaller, more frequent outbound loads

Technology & Automation

Cross-Dock WMS Requirements

Core Capabilities:

  • Real-time inventory visibility
  • ASN (Advance Ship Notice) processing
  • Door assignment and scheduling
  • Directed putaway to staging
  • Wave planning and release
  • Load building and optimization
  • RF/mobile scanning
  • Integration with TMS

Leading Cross-Dock WMS:

  • Manhattan Associates WMS: Enterprise-grade
  • Blue Yonder WMS: AI-powered
  • SAP Extended Warehouse Management: ERP-integrated
  • HighJump WMS: Mid-market
  • Körber WMS: Supply chain suite
  • Infor WMS: CloudSuite

Automation Technologies

Sortation Systems:

  • Sliding shoe sorters
  • Cross-belt sorters
  • Tilt-tray sorters
  • Bomb bay sorters

Conveyor Systems:

  • Powered roller conveyors
  • Belt conveyors
  • Spiral conveyors (vertical)

AGVs / AMRs:

  • Autonomous pallet movers
  • Reduce manual labor
  • Flexible routing

Put-to-Light / Pick-to-Light:

  • Direct operators to staging lanes
  • Visual confirmation

Output Format

Cross-Dock Operations Report

Executive Summary:

  • Daily volume: 1,850 pallets
  • Dwell time: 6.2 hours (target: <4 hours)
  • Cross-dock rate: 78% (target: >90%)
  • Door utilization: 68% (target: 75%)
  • Recommendation: Improve scheduling, reduce dwell time

Performance Metrics:

MetricCurrentTargetStatus
Avg dwell time6.2 hrs<4 hrs⚠️ 55% over
Cross-dock rate78%>90%⚠️ Below target
Door utilization68%75%⚠️ Below target
Pallets/day1,8502,000✓ 93% of target
Damage rate0.8%<0.5%⚠️ 60% over

Operational Analysis:

Dwell Time by Destination:

DestinationVolumeAvg Dwell% Over Target
Southeast5504.2 hrs5%
Midwest4208.5 hrs113% ⚠️
West3805.8 hrs45% ⚠️
Northeast5005.1 hrs28%

Root Causes for Long Dwell (Midwest):

  • No scheduled outbound Monday/Wednesday
  • Pallets wait for Friday consolidation
  • Recommendation: Add mid-week departure or use 3PL

Door Utilization:

Door TypeDoorsUtilizationPeak HoursBottleneck?
Inbound2072%6 AM - 10 AMYes
Outbound2564%2 PM - 6 PMNo

Recommendations:

  1. Synchronized Scheduling - Impact: -2 hours dwell time

    • Coordinate inbound/outbound appointments
    • Schedule outbound within 2 hours of inbound receipt
    • Use ASN to pre-assign staging lanes
  2. Expand Midwest Service - Impact: +12% cross-dock rate

    • Add Wednesday departure
    • Reduce Midwest dwell from 8.5 to 4 hours
    • Cost: $40K annually, saves $65K in handling
  3. Implement Sortation System - Impact: +30% throughput

    • Automate staging by destination
    • Reduce labor by 20%
    • Investment: $850K, ROI: 2.1 years
  4. Improve Door Scheduling - Impact: +7% door utilization

    • Time-slot appointments (prevent congestion)
    • Balance inbound arrivals throughout day
    • Use dock scheduling software

Expected Results (6 months):

MetricCurrentTargetImprovement
Avg dwell time6.2 hrs4.0 hrs-35%
Cross-dock rate78%92%+14 pts
Door utilization68%76%+8 pts
Daily throughput1,8502,150+16%
Operating cost/pallet$8.50$7.20-15%

Questions to Ask

If you need more context:

  1. What's your daily volume through the cross-dock?
  2. What's your current dwell time?
  3. How many dock doors (inbound/outbound)?
  4. What products are being cross-docked?
  5. Pre-sorted by suppliers or sorted in-house?
  6. Any WMS or automation in place?
  7. What's the cross-dock rate (vs. storage)?
  8. Main pain points? (speed, accuracy, cost, space)

Related Skills

  • warehouse-design: Overall warehouse and DC layout
  • dock-door-assignment: Optimize dock door scheduling
  • freight-optimization: Inbound/outbound freight management
  • route-optimization: Outbound route planning
  • order-fulfillment: Fulfillment operations
  • warehouse-slotting-optimization: Storage slotting strategy
  • load-building-optimization: Load planning and building
  • supply-chain-automation: Automation technology selection

GitHub Repository

majiayu000/claude-skill-registry
Path: skills/cross-docking

Related Skills

content-collections

Meta

This skill provides a production-tested setup for Content Collections, a TypeScript-first tool that transforms Markdown/MDX files into type-safe data collections with Zod validation. Use it when building blogs, documentation sites, or content-heavy Vite + React applications to ensure type safety and automatic content validation. It covers everything from Vite plugin configuration and MDX compilation to deployment optimization and schema validation.

View skill

creating-opencode-plugins

Meta

This skill provides the structure and API specifications for creating OpenCode plugins that hook into 25+ event types like commands, files, and LSP operations. It offers implementation patterns for JavaScript/TypeScript modules that intercept and extend the AI assistant's lifecycle. Use it when you need to build event-driven plugins for monitoring, custom handling, or extending OpenCode's capabilities.

View skill

langchain

Meta

LangChain is a framework for building LLM applications using agents, chains, and RAG pipelines. It supports multiple LLM providers, offers 500+ integrations, and includes features like tool calling and memory management. Use it for rapid prototyping and deploying production systems like chatbots, autonomous agents, and question-answering services.

View skill

cloudflare-turnstile

Meta

This skill provides comprehensive guidance for implementing Cloudflare Turnstile as a CAPTCHA-alternative bot protection system. It covers integration for forms, login pages, API endpoints, and frameworks like React/Next.js/Hono, while handling invisible challenges that maintain user experience. Use it when migrating from reCAPTCHA, debugging error codes, or implementing token validation and E2E tests.

View skill