Inventory Import from Excel / CSV for Odoo 19 Community documentation
A guide to the import: the file, the options, the check, the adjustments, the history and the limits.
Documents version 1.0.0Updated Oct 23, 2026
Start here
In plain words: The warehouse counted the shelves and sent a spreadsheet. Typing 400 quantities into Physical Inventory one by one is slow, and a typo moves your stock. Inventory Import loads the spreadsheet in Odoo Community: it finds each product by reference, barcode or name, checks every row first (with the on-hand quantity and the difference), and only then applies the adjustments, with a history of what each file did.
Tip: Nothing moves until you click Import: the check shows each row as ready, warning or error, with the reason.
What you get
| Feature | What it does |
|---|---|
| Excel and CSV | .xlsx, .xls and .csv files; headers in English or Arabic, in any column order. |
| Finds the product | By internal reference, barcode or name; several matches are reported, not guessed. |
| Locations | A Location column (name or full name) with a default location for the rows that have none. |
| Lots and serial numbers | Existing ones are used; missing ones can be created. A serial number takes the quantity 0 or 1. |
| Two modes | Set the counted quantity (a physical count) or add to the on-hand quantity (a receipt or a correction). |
| The check | On-hand, file quantity, new quantity and difference for each row, with a message for every problem. |
| Apply or count only | Apply the adjustments now, or only set the counts to review in Physical Inventory. |
| History | Each file is kept with its rows, who imported it and the stock moves it made. |
| Template | A ready-to-fill Excel template to download. |
| Arabic | Everything is translated and works right to left. |
Requirements
| Item | Details |
|---|---|
| Odoo | 19.0 (Community or Enterprise) |
| Apps needed | Inventory (stock) |
| License | OPL-1 (Odoo Proprietary License v1.0) |
Install
- Unzip the package. Inside is
taqnix_inventory_import.zip; unzip it to get the foldertaqnix_inventory_import. - Copy the folder into one of the
addons_pathfolders of your Odoo server and restart Odoo. - Log in as an administrator, activate Developer mode, open Apps and press Update Apps List.
- Remove the “Apps” filter, search Inventory Import and press Install.
# or from the command line ./odoo-bin -c odoo.conf -d YOUR_DATABASE -i taqnix_inventory_import --stop-after-init
Prepare the file
In plain words: A header row and one row per product (and location, lot). Only two things are required: a column that tells the product and a Quantity column.
| Column (any of these names) | Meaning |
|---|---|
| Internal Reference, SKU, Code | The product reference. |
| Barcode, EAN | The product barcode. |
| Product, Item | The product name. |
| Quantity, Counted quantity, Qty | The quantity (required). |
| Location | The location name or full name, for example WH/Stock/Shelf A. Optional. |
| Lot, Serial, Lot/Serial Number | The lot or serial number, for the tracked products. |
Tip: Click Download the template on a new import to get a file with the right headers.
Import
In plain words: Open Inventory → Operations → Adjustments → Import inventory and click New. Choose the file, the default location and the mode, then Check the file.
| Option | Meaning |
|---|---|
| Set the counted quantity | The quantity of the file is the new on-hand quantity (a physical count). |
| Add to the on-hand quantity | The quantity is added to the stock; a negative quantity takes stock out. |
| Apply the adjustments now | Untick it to only set the counts and review them in Physical Inventory. |
| Create the missing lots | A lot or serial number that does not exist yet is created. |
| If a row has an error | Import the valid rows and skip the others, or import nothing. |
Read the check
| State | Meaning |
|---|---|
| Ready | The row is fine. |
| Warning | It will be imported, with a remark: a lot that will be created, a lot ignored for a product without tracking, or a product that appears twice (the quantities are added together). |
| Error | It will be skipped: an unknown product or location, a quantity that is not a number, a negative count, a lot missing, a serial number with a quantity other than 0 or 1, a product that does not track its stock. |
In plain words: On hand is the current quantity, New quantity is what the stock will be, and Difference is the adjustment. Correct the file and click Check again as many times as you want.
Apply
In plain words: Import creates the inventory adjustments: each changed product gets a stock move named after the import, and the rows that already match are left alone. The import is then Imported, and the Stock moves button lists what it did.
Tip: With Apply the adjustments now unticked, the quantities are only set as counts: open Inventory → Operations → Physical Inventory to review and apply them.
The history
In plain words: Every import stays in the list with its file, the number of rows, the products changed and who did it. An applied import cannot be deleted: it is the history of your stock.
Who can do what
| Who | Can |
|---|---|
| Inventory administrators | Import, check and apply. |
| Other users | No access: changing stock quantities in bulk is for administrators. |
Arabic and right to left
Limits
| Limit | Detail |
|---|---|
| One sheet | Only the first sheet of an Excel file is read. |
| Size | Up to 10,000 rows per file. |
| Packages and owners | Not handled: the quantities are on the products, the locations and the lots. |
| The other products of a location | They are left alone: only the rows of the file change. |
| Cost | The adjustments use the cost of the product. |
For developers
In plain words: Skip this chapter if you only use the module.
imp = env['taqnix.inventory.import'].create({'file': base64.b64encode(csv_bytes), 'filename': 'count.csv',
'location_id': stock.id, 'mode': 'set', 'apply': True})
imp.action_check()
imp.action_import()
imp.state, imp.changed_countTroubleshooting
| Problem | What to do |
|---|---|
| The file needs a column that tells the product | Add a header such as Internal Reference, Barcode or Product. |
| This product does not track its stock | Tick Track Inventory on the product. |
| The row needs a lot | The product is tracked by lot or serial number: fill the Lot column. |
| No internal location matches | Write the location as it is in Odoo, for example WH/Stock/Shelf A. |
| Nothing moved | The rows already matched the on-hand quantity: Unchanged. |
Updating and removing
Replace the folder with the new version, restart Odoo and run -u taqnix_inventory_import. Your imports and the stock moves they made are kept.
Support
Installation help and bug fixes are included for 6 months, with lifetime updates. Contact us through the marketplace page where you bought the module or write to support@taqnix.com with your Odoo version and a screenshot.