Skip to content
Operations · Warehouse management module

A warehouse management system built for the people walking the aisles

Knowing you have 40 units somewhere in the building isn't the same as knowing they're in aisle 12, bay 3, top shelf. A warehouse management system closes that gap. Tell erpfly how goods arrive, where they go and how pickers find them, and it generates the Odoo addon or ERPNext app that runs it.

ERPNext v16

Works with ERPNext v15 and v16, and Odoo 17, 18 and 19.

Features

What your warehouse management module can do

Bins your team can find

A location code on every shelf, printed as a barcode label, arranged as aisle, bay and level. Odoo uses sub-locations. ERPNext uses a tree of child warehouses.

Putaway that thinks for the receiver

Rules by product category, weight or storage type send incoming goods to the right zone, so the receiver scans instead of guessing.

Scan-to-confirm picking

The picker scans the bin, then the product. A wrong bin stops the line with a clear message on the handheld, before the wrong item reaches a box.

Pick paths in walking order

Pick lists sorted by aisle and bay, so a picker doesn't walk to the back wall three times for one order.

Supervisor override with a reason

Real warehouses have damaged labels. A stock manager can force a line through, and the reason is logged against the transfer.

The output

What actually gets generated

Real files in a real repository. Here’s the typical output when someone asks for warehouse management.

ERPNext / Frappe app

  • Child Warehouse tree for aisle, bay and level locations
  • Putaway Rule records generated from your zoning sheet
  • Bin confirmation fields on Pick List Item
  • doc_events check on Pick List before submit
  • Location label Print Format with barcodes

Odoo addon

  • stock.location hierarchy with barcode labels
  • stock.putaway.rule and storage category data
  • Scan confirmation field on stock.move.line
  • button_validate override on stock.picking
  • Handheld picking view (custom OWL component for Community)
scan_confirm_picking/models/stock_picking.py
from odoo import _, api, fields, models
from odoo.exceptions import UserError, ValidationError


class StockMoveLine(models.Model):
    _inherit = "stock.move.line"

    bin_confirmed = fields.Boolean(copy=False)
    override_reason = fields.Char(copy=False)

    def action_confirm_bin(self, scanned_code):
        """Called by the handheld view with whatever the scanner typed."""
        self.ensure_one()
        expected = self.location_id.barcode or self.location_id.name
        if (scanned_code or "").strip() != expected:
            raise UserError(_("Wrong bin. Expected %s, scanned %s.") % (expected, scanned_code))
        self.bin_confirmed = True

    @api.constrains("override_reason")
    def _check_override_rights(self):
        if any(self.mapped("override_reason")) and not self.env.user.has_group("stock.group_stock_manager"):
            raise ValidationError(_("Only a stock manager can skip a bin scan."))


class StockPicking(models.Model):
    _inherit = "stock.picking"

    def button_validate(self):
        for picking in self.filtered(lambda p: p.picking_type_code == "outgoing"):
            open_lines = picking.move_line_ids.filtered(
                lambda ml: ml.quantity and not (ml.bin_confirmed or ml.override_reason))
            if open_lines:
                raise UserError(_("%s line(s) on %s still need a bin scan.") % (len(open_lines), picking.name))
        return super().button_validate()
Trimmed excerpt. The full module includes tests, fixtures and a README.

How it works

From a paragraph to a pull request

The long version
  1. 01

    Describe it

    In your own words. Paste the spreadsheet or a photo of the paper form if that's easier.

  2. 02

    Answer a couple of questions

    It asks only what it can't work out from your setup, like who's allowed to override.

  3. 03

    Try it on a sandbox

    A copy of your site with the module installed. Break it, then ask for changes.

  4. 04

    Merge when it's right

    Code lands as a pull request with tests. Your developer, or ours, reviews it first.

Where warehouses really lose time

It’s rarely the software. It’s walking. A picker gets a list sorted by order line, not by location, and crosses the building four times for one order. Then there’s the wrong-bin pick: two near-identical cartons of M8 and M10 bolts side by side, a tired person at 4pm, and a customer who gets the wrong one.

A warehouse management system exists to fix exactly those two things. It tells people where to put stock when it arrives and where to find it when it leaves, and it checks their work with a scan instead of trusting their memory. Nobody likes being checked. Everybody likes not repacking a shipment on Friday afternoon.

How a warehouse management system fits into Odoo and ERPNext

Odoo is the more natural fit here. Stock locations nest as deep as you like, each can carry a barcode, and putaway rules and storage categories are part of the Community Inventory app. Multi-step receipts (input, quality, stock) and deliveries (pick, pack, ship) are configuration, not code. What erpfly adds is your logic: which scans are compulsory, who can override, how pick lists are sorted, and a handheld screen if you’re not on Enterprise.

ERPNext models locations differently. There’s no storage-location object below a warehouse. (ERPNext does have a doctype called Bin, but it’s the quantity record for an item in a warehouse, which confuses everyone exactly once.) Instead, warehouses form a tree, so “Aisle 12 / Bay 3 / Level C” becomes a child warehouse. Putaway Rule and Pick List are standard doctypes, and scan fields on stock transactions accept keyboard-style scanners. We generate the warehouse tree from your spreadsheet, extra fields on Pick List Item for bin confirmation, and a validation hook that blocks submission until the scans are done.

Picking between the two platforms for a warehouse-heavy business? Our ERPNext vs Odoo comparison goes into the trade-offs.

Worked example: a building supplies wholesaler with a wrong-bin problem

Say you run a single 1,800-bin warehouse selling fixings and fittings. Three pickers handle around 250 order lines a day. Your own count of returns shows about six wrong-item picks a week, nearly all from adjacent bins with lookalike cartons.

Here’s what you’d type:

  1. Every bin gets a barcode label, format aisle-bay-level, like 12-03-C.
  2. On outgoing transfers, the picker scans the bin before confirming quantity.
  3. A wrong scan shows “Wrong bin. Expected 12-03-C” and the line stays open.
  4. The delivery can’t be validated with open lines. Tomasz, the warehouse supervisor, can force it through with a reason.

On Odoo, that’s the code on this page plus a view and an access file. Tomasz is in the stock manager group, so he can type an override reason on a line with a torn label. The pickers can’t, and every override stays on the transfer for anyone who asks later. On a busy day, 250 lines means 250 extra scans, each taking a second or two. That’s the trade you’re making, and it’s usually a good one.

Things we’d leave out, at least at first

Scanning absolutely everything. Scanning the bin catches the wrong-location mistake. Scanning bin, product, lot and quantity on every line catches a bit more and slows everything down. Start with the scan that matches your actual errors. You can always add the second one when the returns tell you to.

Slotting optimisation in version one. Moving fast sellers near the dispatch door is smart. Doing it with an algorithm before you have three months of clean pick data is guesswork with extra steps.

A bin for every single box. Locations should be where a person looks, usually a shelf or bay. Go finer and your location count explodes while the labels start falling off.

Replacing your 3PL’s WMS. If you store stock for dozens of clients with per-client billing, a specialist system earns its fee. We’d build the integration, not the replacement.

What sits next to warehouse management

Bins only make sense once item-level stock is right, so inventory management usually comes first. Goods arriving from purchase orders feed putaway, and incoming inspection can route to a quarantine location through quality management. If you run trucks as well as racks, our notes on ERP for logistics companies are worth a look.

Guides and terms for warehouse management

Warehouse management module questions

Something missing? Email hello@erpfly.com and a person will answer.

Which barcode scanners and handhelds work?

Any scanner that acts as a keyboard (HID mode) works with both platforms, including cheap USB guns and most Android handhelds with a built-in scan engine. Odoo's own Barcode app is Enterprise only. On Community, we generate a lightweight handheld view instead.

ERPNext doesn't have bin locations. Is that a problem?

Not really. ERPNext warehouses form a tree, so a bin is a child warehouse under its zone, and Putaway Rules and Pick Lists work with that. It gets clumsy past several thousand bins, and we'll tell you if you're heading there.

Can this replace the standalone WMS we already pay for?

Sometimes. If you run one or two buildings with pick, pack and ship, the ERP plus a focused module usually covers it. If you run automated conveyors, slotting optimisation or dozens of client accounts as a 3PL, keep the specialist WMS and let us generate the integration.

What happens to our customisations when Odoo or ERPNext upgrades?

They're in a separate addon or app, so upgrades don't overwrite them. Picking is an area that changes between Odoo versions (move line quantities changed in 17, for example), so budget a short test run on a copy before you upgrade production.

How do we get our bin list into the system?

Send the spreadsheet you already use for labels. We generate the location records and a Print Format or QWeb report for the barcode labels from it, so the codes in the system match what's stuck on the shelves.

How long before pickers are using it?

The module itself is quick to generate. Labelling the shelves is the slow bit, usually a weekend or two for a mid-sized building. Run one aisle first and see what breaks.

Your next module is one paragraph away

Write it the way you’d explain it to a new hire. We’ll turn it into an app you can read, test and install.

ERPNext v16

Create your account

Free to start. No card needed.

By signing up you agree to our terms and privacy policy.