Skip to main content

Multiple Product Barcodes

Purpose​

Multiple Product Barcodes lets one product variant have supplier, manufacturer, legacy, internal, or packaging codes alongside its normal Odoo barcode. Each alias records its company, type, and applicability. Product searches can find effective aliases, while conflict checks prevent an active alias from reserving a code already used in the configured scope.

This extends Inventory and product records. It does not replace the product's main barcode. Cashier scanning requires the separate POS Barcode Aliases integration.

Before you start​

Install the addon matching your Odoo major version in an environment that accepts custom addons. The 19.0 manifest depends on Inventory (stock) and the Python library openpyxl; it declares no Enterprise-only dependency. Your administrator must make the required library available before installation.

Have the product variants, companies, and any applicable vendors and units ready. Aliases belong to variants, so choose the exact variant when a template has several options. Use the current company that should own the alias.

The workflow below is source-reviewed for 19.0. Selected differences were inspected for the other catalogue versions; no runtime or scanner test was performed for this guide.

Access and roles​

Internal users have read access to aliases, alias types, and coverage records, subject to company access. Inventory Administrators can create and edit aliases, manage alias types, and use the import, replacement, and conflict wizards. Ordinary users cannot delete aliases; archive or expire them to preserve history. Manager notes and technical normalization details are restricted to Inventory Administrators.

An administrator should assign the appropriate role. Having access to a product does not grant permission to maintain its aliases.

Setup and menu​

In Inventory, use Barcode Aliases or the Barcode Aliases smart button on a product. The product variant also has a read-only Barcode Aliases tab. Inventory configuration provides Barcode Alias Types and Resolve Barcode Conflict; reporting provides Barcode Conflicts and Alias Coverage and Usage.

The Inventory settings block Barcode Aliases contains Uniqueness scope and Usage diagnostics. The default uniqueness policy is Per Company. Global reserves a normalized code across the database and cannot be enabled while conflicting reservations remain. Usage diagnostics counts successful calls to the server alias resolver; it should not be interpreted as a complete count of every POS scan.

The supplied types are UPC / EAN, Packaging, Supplier, Manufacturer, Legacy, Internal, and Custom. Types determine which optional fields are allowed. Exact removes scanner framing and surrounding whitespace; Compact also removes internal whitespace; GTIN validates supported numeric barcode lengths and their check digit. Changing a type revalidates its existing aliases.

Workflow​

  1. Open Barcode Aliases, create a record, and choose the product variant, company, type, and code. Supplier and manufacturer types can include a vendor and effective dates. Save the record. A valid new alias starts in Active state.
  2. For a Packaging alias, enter a positive quantity and a packaging unit convertible to the product's unit. The addon calculates the quantity in the product unit for supported consumers such as the POS bridge. Identity aliases use quantity one and no packaging unit.
  3. Search for the product using its alias in an applicable product selection field. Resolution excludes expired, archived, future-dated, and out-of-date aliases and respects product access. Native product barcodes take precedence over alias resolution. Do not assume every separately installed barcode application uses this resolver.
  4. For bulk entry, open Import Barcode Aliases. Upload UTF-8 CSV or XLSX with code, type, and product columns. A product reference can be an external ID, exact internal reference, or primary barcode; use an unambiguous variant reference. Optional columns are company, vendor, quantity, uom, date_from, date_to, and notes.
  5. Select Preview and inspect valid and error rows. Download the correction file when needed. Import Valid Rows rechecks the upload and creates only valid rows; it does not import the rows marked as errors. Correct and resubmit those separately.
  6. When a code changes, open the existing alias and choose Replace. Enter a new code, type, and reason, then select Replace Alias. The replacement is created and linked to the expired original. Use Expire when the old code should stop resolving without a replacement.
  7. If a conflict is reported, use Resolve Barcode Conflict, enter the code and company, and select Detect Conflicts. Inspect native products, unit/packaging reservations, and alias candidates. Keep Selected Alias expires other candidate aliases; it cannot silently remove a conflicting native barcode. Review coverage and conflicts afterward.

Practice scenario​

In an authorised test database, create fictional product variant “Cedar Tea 250 g” with internal reference CT250. Add a Supplier alias CEDAR-CT250 with an effective start date. Search for that code in a product selector, then replace it with CEDAR-CT250-B and reason “Supplier label revision”. The source-derived expectation is that the original is retained as expired and points to the new active alias. This scenario has not been executed.

Troubleshooting and limitations​

An alias cannot conflict with another active alias, a native product barcode, or a native unit/packaging barcode in the configured scope. Review the existing reservation instead of changing normalization to evade a conflict. GTIN types reject invalid lengths or check digits. Dates must be ordered, optional fields must be allowed by the type, and packaging units must be convertible.

Imports accept 1–2,000 data rows and files no larger than 2 MB. Formula cells, macro-enabled workbooks, legacy Excel files, binary CSV content, and ambiguous product references are rejected. Preserve leading zeroes by storing barcode cells as text. Expired alias identity details are immutable; use the replacement workflow for future changes.

Catalogue versions are 15.0, 16.0, 17.0, 18.0, 19.0, and 20.0. Versions 15–16 declare xlrd and xlsxwriter rather than openpyxl; verify the installed library versions before relying on XLSX imports. Versions 15–18 check native packaging records, while 19–20 use native product unit/packaging records. Version 20 adapts upload handling and access definitions to that version's APIs. These are targeted source comparisons, not a claim of equivalent tested behavior.