Odoo Community Association

Stock Barcodes

Beta License: AGPL-3 OCA/stock-logistics-barcode Translate me on Weblate Try me on Runboat

This module provides a barcode scanning interface for stock operations: receipts, deliveries, internal transfers, relocations and inventory adjustments.

It is designed for keyboard-wedge scanners (USB/Bluetooth) and works on desktop and mobile browsers, without requiring the Odoo Enterprise barcode application.

Main features:

Table of contents

Configuration

Barcodes on master data

The interface recognizes four kinds of barcodes. Assign them first:

Warehouse locations

  1. You need the permission Manage Multiple Stock Locations to see the menu.

    Warehouse location access

  2. Go to Inventory > Configuration > Locations.

  3. Select the location and fill in the Barcode field.

    Warehouse location barcode

Product packagings

  1. You need the permission Manage Product Packaging to see the menu.

    Product packaging access

  2. Go to Inventory > Configuration > Product Packagings.

  3. Create or select a packaging and fill in the Barcode field. Scanning a packaging selects its product and proposes the packaging quantity.

    Product packaging barcode

Products

  1. Go to Inventory > Products > Products.
  2. Fill in the Barcode field of each product.

Lots / serial numbers

The lot name acts as its barcode, so no extra configuration is needed (requires Lots & Serial Numbers enabled).

Product lot barcode

Packages are matched by their name, so scanning a package label selects the package content (requires Packages enabled).

Barcode option groups

Go to Inventory > Configuration > Barcodes > Barcode Option Groups to define how the scan screen behaves. The first task of an implementation is to analyze with the customer the flow of each operation (what is labelled, what the operator reads and in which order, whether readings are confirmed one by one) and adjust the options below to it. The module ships six example groups: Picking IN, Picking OUT, Picking Internal, Relocation, Inventory and a generic Operation fallback. The Inventory group is always the one used by the inventory scan screen.

Steps to scan

GS1-128 labels (stock_barcodes_gs1) are decoded as a whole: the product, lot and quantity they carry are set regardless of the steps.

The Steps to scan list defines, per field of the screen (location, product, packaging, lot, package, destination, destination package, quantity, owner, …):

  • Step: order in which the fields are asked. The current step is the step of the first required field still empty, and only the fields to scan of that step are matched against a barcode.
  • To scan: the field can be filled by reading a barcode.
  • Required: a reading is not processed while the field is empty.
  • Filled default: the field is filled from the pending move (guided mode) or from the picking or operation type when the screen opens.
  • Forced (guided mode): a value different from the pending move is rejected (Wrong product, Wrong lot, Wrong location).
  • Clean after done: the field is emptied after each processed reading.

A field that is required but not scannable in its step can only be filled by default, from the stock of a scanned lot or package, or by hand in manual entry.

Screen and confirmation

  • Mode: Guided proposes one pending move at a time; empty means free mode, where barcodes are read in any order.
  • Manual entry: open the screen with editable fields; Manual entry on edit switches to it when a pending move is edited with the pencil; Manual entry field focus is the field focused when switching.
  • Is manual confirm: scans only fill the screen and the operator confirms each reading. Otherwise a reading is processed as soon as the required fields are filled.
  • Is manual qty: the operator always types the quantity; scans do not set it.
  • Ignore filled fields: a barcode skips the required fields that already have a value, e.g. so that a second location barcode sets the destination.
  • Keep screen values: keep the values of the screen until the pending move is completed.
  • Show form scan: keep the scan fields always visible; otherwise they are only shown in manual entry.
  • Show stock and Show owner: show the quantity available in the location and the owner field on the screen.
  • Display Odoo notifications: also notify when a reading is missing a required field.

Pending moves

  • Show pending moves: none, only pending or all (pending and done), built from the operations or the detailed operations (Source pending moves).
  • Group key for todo records: expression grouping the pending moves, e.g. object.picking_id,object.product_id.
  • Location field to sort: sort by source or destination location (X, Y, Z position and name). By default the destination is used for receipts and internal transfers and the source for the rest.
  • Show detailed operations: show the detailed operations already read on the screen.
  • Confirmed moves: also work on moves without reservation.

Quantities

  • Replace quantity on each reading: a confirmed reading replaces the quantity already recorded (done quantity of the detailed operation, counted quantity of the inventory) instead of being added to it. Editing a counted inventory line from the list always replaces it.
  • Accumulate repeated readings: with manual confirmation, reading the same product, lot or packaging again before confirming adds one unit (or packaging) to the quantity to confirm. Combined with the previous option, units can be counted one by one on the screen and the result replaces the counted quantity.
  • Allow not demanded product: accept products outside the picking demand, adding a move for them.
  • Allow negative quant: accept quantities over the stock available in the location, and lots without stock.

Lots, packages and locations

  • Fill fields from lot: reading a lot or product fills product, lot, package, owner and location from its stock (not on receipts).
  • Ignore quant location: when filling from stock, keep the location of the screen.
  • Get lots automatically (pickings): propose the reserved lot, or the first one by removal strategy (not on receipts).
  • Create lots if not match: accept new lot names; the lot is created with the reading in inventories and on validation in transfers.
  • Auto put in pack: on validation of a picking of an operation type using the group, put its lines in a new package if none has one.
  • Use location dest. putaway: when the destination is required and empty, compute it from the putaway strategy.
  • Show fixed dest. location: show on each pending move the destination already planned by a fixed putaway, and make scans reuse that move line (see Usage).

Other

  • Search picking from product: when the screen is opened from an operation type, reading a product opens the first or last ready picking containing it.
  • Read items on inventory mode: open the inventory screen listing the items already counted instead of the pending ones.
  • Code: some codes change the behavior. IN does not take the source location from the stock of a scanned lot or package, OUT does not propose its quantity in stock, and REL accepts quantities over the demand without asking.

Operation types

On each operation type (Inventory > Configuration > Operation Types) you can select:

  • Barcode option group: used when scanning the operation type or its pickings.
  • New picking barcode option group: used when creating an unplanned picking from the barcode interface (New button).

The Barcodes tiles and the scanner button of the Inventory > Overview cards only list operation types with a barcode option group. The Scan barcodes button of a transfer uses the generic Operation group when its operation type has none.

Barcode actions

Inventory > Configuration > Barcodes > Barcode Actions define the tiles shown in the Barcodes main menu. Each action can have its own barcode: scanning it from the main menu opens the action directly.

Create barcode action

Select actions and press Print barcodes to generate a PDF with their Code128 barcodes, e.g. for a laminated menu sheet.

Print barcodes

System parameters

The system parameter stock_barcodes.limit_product_qty (default 999999) rejects absurd quantities caused by scanning a barcode into a quantity input.

Usage

The barcode scan screens recognize, in both free and guided mode:

  1. Warehouse locations (barcode field).
  2. Product packagings (barcode field).
  3. Products (barcode field).
  4. Lots / serial numbers (the barcode is the lot name).
  5. Packages (matched by name).

A bell sound confirms a successful scan and an error sound signals a rejected one. Status messages under the barcode field explain what the screen is waiting for and why a scan was rejected. The Manual button toggles manual entry to type values without a scanner.

Barcode interface for picking operations

You can open the scan screen from three places:

  1. Barcodes main menu (app Barcodes): select an operation tile, then pick one of the ready transfers from the list.

    Operation barcode action

    List picking

  2. An operation type card in Inventory > Overview (scanner button): scan products for any ready picking of that type. With Search picking from product, reading a product opens a ready picking that contains it.

  3. A specific transfer (Scan barcodes button in Inventory > Transfers): the picking is locked and every scan applies to it.

    Barcode interface picking

Free mode

Scan in any order; the screen reacts to the kind of barcode read:

  • Product: adds 1 unit (or waits for a lot if the product is tracked). The source location is resolved automatically from the pending reserved lines.
  • Packaging: selects the product and adds the packaging quantity.
  • Lot: scan the product first when several lots share the same name. When fill fields from lot is active, scanning a lot fills product, package, owner and location from the available stock.
  • Package: fills all fields from the package content.
  • Location: sets the source (or destination, per configuration) for the following scans.

Quantities beyond the picking demand or beyond available stock are not written silently: the screen asks for confirmation (force done) or rejects the scan, depending on the option group.

Product information and stock by location

Once a product is read, the information button next to it opens a dialog with the on hand, incoming, outgoing and forecasted quantities of the product and its stock in each location. Deliveries and internal transfers list first the locations the removal strategy takes stock from; receptions list them in reverse order. Tapping a location fills the source location, or the destination location on receptions.

The buttons next to the source and destination location fields open the same list without the product quantities, to pick a location quickly: the source one in removal strategy order, the destination one (receptions and internal transfers) in reverse order.

On small screens, where the field labels are replaced by icons, these buttons are hidden and the product and location icons become buttons that open them instead.

Guided mode

The screen shows the next pending move (product, lot, quantities, locations) and guides the operator step by step (e.g. Scan Source, then Scan Product, Lot). Scanning something different from what is expected is rejected with an explicit message (Wrong product, Wrong lot, Wrong location).

In the pending moves list you can:

  • Jump to another line (arrows or tapping a card).

    List items picking

  • Edit a line with the pencil icon.

    Edit picking

  • Put the whole remaining quantity with the +N button (e.g. +120). Once defined, this button disappears; use the edit icon to change the quantity.

    Quantity picking

  • Show the lines already scanned with the eye icon.

    Picking scanned

  • Decide the backorder behavior per line when quantities are incomplete (create backorder / no backorder / keep pending).

Validation

The Validate button confirms the transfer using the scanned quantities. A wizard is displayed to confirm the action; after validation you return to the ready-pickings list.

Confirm items picking

If some lines have no quantity, the standard confirmation wizard asks whether to process all quantities.

Confirm all quantities

With Auto put in pack enabled, unpacked lines are packed automatically before validating.

Extra products, new lots and packagings

  • Press the + Product button to add an item not in the demand (when the option group allows non-demanded products).

    Add product

    When you select a product, a numeric field is displayed to add the quantity.

    Add quantity product

    The trash can icon resets the form values (except the location) without closing it; Clean values resets everything and closes the form; Confirm adds the new item.

    Reset data form

  • If a scanned lot does not exist on a receipt, it can be created on the fly (Create lots if not match) or through the new lot dialog.

  • Unknown packagings can be registered from the scan screen with the new packaging dialog: scan the packaging barcode, set the name and confirm.

Barcode interface for inventory adjustments

Open Barcodes > Inventory (or the Scan barcodes button of an inventory adjustment).

Inventory barcode action

The screen uses the Inventory option group. With the location filled by default it opens on the stock location of the first warehouse; make the location scannable to count other locations. Then scan products, lots, packagings or packages:

  • Each product scan adds 1 unit to the counted quantity (or the packaging quantity when a packaging is scanned). With Replace quantity on each reading, a new reading overwrites the counted quantity.

  • With Accumulate repeated readings and manual confirmation, scanning the same product, lot or packaging again before confirming adds one more unit (or packaging) to the quantity to confirm.

  • Serial-tracked products accept exactly one unit per serial; a second read of the same serial is rejected.

  • The eye icon switches between the items already counted by you and the pending ones.

    List items

  • Each line in the list can be edited (pencil), incremented/decremented (+/-) or cleared (trash). Confirming an edited line replaces its counted quantity.

    List action items

  • The Apply button is displayed when there are counted items. It opens the standard inventory adjustment confirmation (with reason), applies your counted quants and returns to the main menu.

    Apply inventory

    Apply inventory reason

Barcode actions

  1. Go to Barcodes.
  2. Scan an action barcode (see Configuration) to open the corresponding action directly, or tap its tile.

Show the planned destination location on pending moves

By default the pending moves list on the barcode screen shows the source location and lot of each move. When the option group has Show fixed dest. location enabled, the list also shows the destination location already planned on the stock move line, so the operator sees where the goods must be stored as soon as the picking is opened, without scanning anything.

This only reads the destination resolved upstream when the move was prepared (e.g. the putaway strategy applied at reception). It never recomputes the putaway: putaway is a warehouse decision taken when the move is created, not a barcode-screen concern (see Use location dest. putaway for the opposite, recompute-on-scan behaviour).

In addition, with this option enabled, scanning a product reuses the move line already routed by putaway and keeps its destination, instead of creating a new line at the generic picking destination. This way receiving by barcode keeps the goods on their planned putaway location.

To keep the shown value reliable it is displayed only for moves whose destination has no storage category, i.e. a fixed putaway whose location does not depend on the received quantity. For capacity-based putaway (storage categories) the final location may still change on a partial receipt, so it is intentionally not shown.

Enable it in Inventory > Configuration > Barcode Option Groups, on the option group used by the operation type, with the Show fixed dest. location checkbox.

Known issues / Roadmap

  • Execute action_done() method outside onchange environment.
  • Allow create product when a barcode has not been found.
  • Allow to select picking reading its barcode.
  • Allow to select multiple pickings to process scanned products.
  • Barcode nomenclatures: read the quantity or weight embedded in a barcode (e.g. EAN-13 variable weight/price prefixes), common for fresh food. GS1-128 is handled by stock_barcodes_gs1.
  • Products with several barcodes: only the product barcode field and the packaging barcodes are matched.
  • Scrap from the scan screen (damaged goods found while picking or counting).
  • Manufacturing orders: consume components and produce finished products by scanning.
  • Print product, lot or package labels from the scan screen, e.g. right after receiving.
  • Inventory: choose the option group and the default location per warehouse. The inventory screen always uses the Inventory group and opens on the first warehouse stock location.
  • Search picking from product: order the candidate pickings by priority and scheduled date instead of by stock move creation. Option overlaps to review:
  • Some behavior depends on the group code (IN, OUT, REL) instead of explicit options.
  • Auto put in pack also applies when the picking is validated outside the barcode interface.

Technical debt (see docs/TECHNICAL.md):

  • action_confirm() persists the onchange cache through _convert_to_write(self._cache), relying on ORM internals.
  • Rename the onchange_* helpers to _onchange_* (silent API break for downstream overrides, needs coordination).
  • Drop the deprecated misspelled aliases (_set_messagge_info, check_location_contidion, check_lot_contidion) after one migration cycle.
  • Remove unused code: stock.barcodes.option.message, _scanned_location(), the skip_backorder branch of stock.picking.button_validate() and the unreachable visible_force_done assignment for Allow negative quant in check_done_conditions().

Changelog

18.0.1.6.0 (2026-10-02)

  • [ADD] Product information: a button next to the read product opens its on hand, incoming, outgoing and forecasted quantities and its stock in each location, ordered by the removal strategy (reversed on receptions). Tapping a location fills the screen location.
  • [ADD] Buttons next to the source and destination locations list only the locations with stock to pick one, the destination ones in reverse order. On small screens the field icons replace these buttons.

18.0.1.5.0 (2026-09-29)

  • [IMP] Replace quantity on each reading (no_increase_qty_done) now also applies to inventories: a reading is added to the counted quantity unless it is set. Accumulate read quantity is renamed to Accumulate repeated readings and adds one unit (or packaging) when the same item is read again before a manual confirmation. The migration keeps the inventory behavior of each database and leaves the new accumulation disabled.
  • [FIX] Confirming a counted inventory line edited from the list added its quantity again (doubling it) when readings were added; the edited line now always replaces its counted quantity.
  • [FIX] Map the 15.0 move_lines value of Source pending moves to move_ids.
  • [REM] Remove the unused Show all quantities and Allow direct partial delivery options.

18.0.1.3.0 (2026-07-08)

  • [FIX] Restore bus notifications broken by the 18.0 bus API: scanning an action barcode from the main menu (whose client-side scanner capture was never wired since the feature was introduced in 16.0), the “transfer validated” toast, the manual-edit toggle from a pending line and the display_notification() toasts (e.g. “Lot is required”), which were sent with a per-record notification type nobody subscribes to. Events are now sent to the scanning user only instead of a broadcast channel.
  • [FIX] Notify only the most significant message per interaction. Reading a barcode triggers sequential lookups and checks that buffer intermediate messages (e.g. “Manual entry OK” before the availability check rejects the entry), and each one used to raise its own notification. Messages are now buffered on the wizard (last one wins, as the on-screen message field always behaved) and a single notification is sent when the read or the manual confirmation ends: always for errors, only in manual entry for informative messages, and for “Manual entry OK” only when the whole confirmation succeeded.
  • [FIX] Assign serial numbers button: the core removed the stock.assign.serial wizard in 18.0 leaving stock.move.action_assign_serial() broken (missing stock.act_assign_serial_numbers action), so the button crashed. It now opens the detailed operations dialog of the pending move, where the core 18.0 generate-serials widget lives. Lines receiving a lot/serial in that dialog are counted as scanned and linked to the pending card, so generated serials show up on the barcode screen.
  • [FIX] Show each barcode notification only once. The barcode views subscribed the same handler to two bus notification types, which leaks a listener on every render (the bus service maps subscriptions by callback), so each notification was displayed more and more times as the session went on.
  • [FIX] Barcode action tile counters: the model-field check never matched (checked attributes on a string), so tiles counted all records of the model; named filters now count records matching the filter.
  • [REF] Drop the python-barcode external dependency introduced by the 17.0 migration: barcode action images are rendered again with the core ir.actions.report.barcode() helper, as in 16.0.
  • [REF] Remove pre-17.0 immediate-transfer leftovers, use _read_group aggregation, convert the report model to AbstractModel, drop a duplicated ACL, replace deprecated t-esc with t-out and add limit=1 to singleton barcode lookups.
  • [REF] Rename misspelled methods (_set_message_info, check_location_condition, check_lot_condition). The old names are kept as deprecated aliases; modules overriding them must move their override to the new names.

18.0.1.1.0 (2026-06-22)

  • [ADD] New option Show fixed dest. location on barcode option groups. It shows, in the pending moves list, the destination location already planned on the stock move line (for a fixed putaway, destination without storage category), and makes a scan reuse that move line keeping its destination instead of duplicating it at the generic picking destination. It never recomputes the putaway strategy.

11.0.1.1.0 (2019-09-24)

  • [ADD] New feature. User can uses barcode interface in picking operations.

13.0.1.1.1 (2021-02-06)

  • [ADD] New feature. Add option to get lots automatically based on removal strategy in inventory.

14.0.1.0.0 (2021-04-05)

  • [ADD] New feature. Add security for users.

16.0.1.0.0 (2025-01-23)

  • [IMP] Improved views to optimize navigation and functionality. Intuitive and mobile-friendly views. Visual improvement of the main view accessed from the Barcodes menu.
  • [ADD] New feature. Barcode reading to barcode actions. Generate PDF document for the barcodes of the selected barcode actions.

Bug Tracker

Bugs are tracked on GitHub Issues. In case of trouble, please check there if your issue has already been reported. If you spotted it first, help us to smash it by providing a detailed and welcomed feedback.

Do not contact contributors directly about support or help with technical issues.

Credits

Authors

  • Tecnativa

Contributors

Maintainers

This module is maintained by the OCA.

Odoo Community Association

OCA, or the Odoo Community Association, is a nonprofit organization whose mission is to support the collaborative development of Odoo features and promote its widespread use.

Current maintainers:

carlosdauden sergio-teruel

This module is part of the OCA/stock-logistics-barcode project on GitHub.

You are welcome to contribute. To learn how please visit https://odoo-community.org/page/Contribute.