Wave, Batch & Zone Picking
Wave/batch/zone picking: order clustering, pick-list optimization, picker assignment, wave progress
Wave, Batch & Zone Picking
Wave/batch/zone picking: order clustering, pick-list optimization, picker assignment, wave progress
Wave, Batch & Zone Picking turns a pile of individual transfers into organised, trackable picking waves. Define named warehouse zones with an explicit walking order, cluster eligible transfers into waves by hand or automatically, optimize each wave's pick path by zone and location, and balance workload across a pool of pickers, with wave progress tracked live as transfers complete.
Key Features
Warehouse picking zones
stock.warehouse.zone is a named, sequenced group of stock locations (each location keeps its own in-zone sequence too), giving pickers an explicit walking order; every pick line inherits its zone from its own source location, enforced with a one-location-one-zone constraint.
Create Wave and Auto-Cluster wizards
The Create Wave wizard groups selected or filtered transfers (by channel, carrier, priority, zone or operation type) into one wave; the Auto-Cluster wizard buckets every eligible, unassigned transfer at once by any combination of those criteria, with an optional per-wave size cap that splits an oversized cluster into several sequential waves.
Pure-python clustering and pick-path engine
services/wave_picking.py implements cluster_pickings, optimize_pick_path, compute_progress and assign_pickers as framework-free functions, unit tested without a database.
Pick-list optimization
action_optimize_pick_list re-sequences every pick line of a wave by zone order then in-zone location order, storing the result on each stock.move.line's pick_sequence field so the picker's list is walked in physical order, not raw creation order.
Picker assignment and workload balancing
A picker can be assigned to a wave directly (action_assign_picker), or the Balance Picker Workload wizard spreads a batch of draft, unassigned waves across a pool of pickers with a largest-job-first greedy balancing pass that accounts for each picker's already-assigned load.
Draft to in-progress to done lifecycle
Each wave moves through a draft, in_progress, done (and cancelled) lifecycle validated by validate_transition: starting a wave reserves its transfers and assigns the picker, and it can only be closed once every transfer is done or cancelled.
Live wave progress tracking
Every wave computes its transfer count, completed count and completion percentage live from the state of its underlying transfers via compute_progress.
Traceable cluster criteria
Each wave keeps the channel, carrier, priority and zone filter it was built or auto-clustered from, so it stays clear afterward why a set of transfers ended up grouped together.
Use Cases
Screenshots
03 Zone List
04 Zone Form
05 Wave Creation Wizard
06 Auto Cluster Wizard
Why Choose This Module
Because the clustering, pick-path optimization, progress and picker-balancing logic all live in a single framework-free, unit-tested engine, the same decisions that used to require a warehouse management system are available directly inside standard Odoo Inventory, with every wave, zone and pick sequence a plain, reportable Odoo record.
Specifications
- Compatible: Odoo 18.0 / 19.0 / 20.0
- License: OPL-1
- Languages: 35+
- Author: Pokutsoft
- Dependencies: stock
- Support: support@pokutsoft.com
- Update date: 2026-10-01
Related modules
ABC/XYZ Inventory Classification
ABC/XYZ product classification by value and demand variability, with auto-recompute and stock-policy suggestions
Cycle Counting ABC / Inventory Record Accuracy
ABC/XYZ product classification, level-loaded cycle count scheduling, blind counting with recount gates and Inventory Record Accuracy (IRA) tracking
Dead Stock & Slow-Moving Analytics
Dead/slow stock aging, tied-up capital and liquidation suggestions with a live dashboard