If stock is your biggest balance-sheet item, a spreadsheet plus a cloud accounting file usually starts creaking somewhere around the second warehouse or the first imported container. Odoo's Inventory app is a full warehouse management module: multi-step receipts, landed cost apportionment, lot and serial traceability, inter-warehouse resupply and forecast-driven replenishment. All of that sits in the free Community edition, not behind an Enterprise paywall.
This article assumes you already know your way around a receipt and a delivery order. Here we're dealing with the things that actually bite importers, distributors and light manufacturers.
Turn on the settings that unlock real warehouse control
Out of the box Odoo hides most of its inventory depth. Go to Inventory → Configuration → Settings and enable, at minimum:
- Storage Locations — lets you have bins, racks and staging areas inside a warehouse instead of one undifferentiated "Stock" bucket.
- Multi-Step Routes — required for two-step receipts (Input → Quality Check → Stock) or pick-and-pack delivery. Also unlocks inter-warehouse resupply.
- Lots & Serial Numbers — and, if you sell anything perishable, Expiration Dates underneath it.
- Landed Costs — the one importers cannot live without.
- Units of Measure — if you buy in cartons of 24 and sell singles.
Then set each warehouse's incoming and outgoing shipment steps on the warehouse record itself (Configuration → Warehouses). A common Australian setup is a 3PL in Sydney configured as a separate warehouse with two-step receipts, and a branch in Perth resupplied from Sydney using the Resupply From checkbox — that generates an inter-warehouse transfer through an in-transit location, so stock on the truck across the Nullarbor is still on your books and still visible.
Landed costs, and the GST question on imports
A container of stock costs more than the supplier invoice. Sea freight, customs brokerage, duty, wharf charges and local cartage all belong in the unit cost, or your margins are fiction.
In Odoo, create a product with Product Type = Service and tick Is a Landed Cost. Enter the freight forwarder's bill as a vendor bill using that product. Then go to Inventory → Operations → Landed Costs, create a record, pick the receipt (or receipts) the costs apply to, add the cost lines, and choose a split method — By Quantity, By Weight, By Volume or By Current Cost. Hit Compute to see the per-line adjustment before you validate; once validated, Odoo posts the revaluation and adjusts the unit cost of the goods received.
The Australian wrinkle: be deliberate about whether GST paid or deferred at the border belongs in that apportionment at all. Duty, freight and handling are part of the cost of the goods; GST is a tax you generally recover through your BAS rather than a cost of the stock. To illustrate the scale of the error — GST is levied at 10%, so folding it into the landed cost of a shipment would overstate the unit cost of that shipment by roughly that proportion, and your gross margin reporting with it. How your import GST and any deferral arrangement should be recorded is a question for your accountant or BAS agent — get the treatment agreed before you process your first container, not after.
Pick a costing method before you have transactions
Costing is set on the product category, not the product: Inventory → Configuration → Product Categories. You choose Standard, FIFO or Average Cost (AVCO), and separately whether Inventory Valuation is Manual or Automated.
For importers buying in USD, AVCO smooths exchange-rate noise across shipments; for serialised or batch-traced goods, FIFO gives you a cost per unit you can trace back to a specific receipt. Automated valuation posts journal entries on every stock move and needs Stock Input, Stock Output and Stock Valuation accounts configured — do this with your accountant, and do it before you load opening balances. Changing costing method later revalues everything and creates entries you'll spend a day explaining.
Replenishment that understands a six-week lead time
Inventory → Operations → Replenishment is the working screen. Set reordering rules with min/max quantities per product per warehouse, and a multiple if your supplier only ships full pallets.
Lead time is where most setups fail. Three separate fields matter: the vendor lead time on the product's Purchase tab, Days to Purchase in Purchase settings (your own approval time), and Purchase Security Lead Time as a buffer. For an overseas supplier at 30 days production plus 28 days sea freight, put 58 in vendor lead time — then if you need stock on the shelf in early September, Odoo's forecast will push you to raise the purchase order in early July. The Forecasted Report button on any product shows exactly which sale orders and purchase orders drive the projected quantity, day by day, so you can see the gap before it becomes a stockout.
Lots, serials and stocktakes
Tracking is set per product (Inventory tab → Traceability). Once on, Odoo forces a lot or serial at receipt and at delivery, and the Traceability Report gives you the full chain — which container a batch arrived in, which customers received it. If you ever face a recall, that's the difference between a targeted callback and emailing your entire customer list.
For counts, use Inventory → Operations → Physical Inventory. Filter by location, enter Counted Quantity, then Apply. Set a counting frequency on locations so Odoo schedules cycle counts rather than shutting the warehouse for a weekend each June. Adjustments post to the Inventory Adjustment account on the product category, so write-offs are visible rather than buried in COGS.
The honest limits of Community
Odoo's dedicated Barcode app is Enterprise-only. In Community you can still use a USB or Bluetooth scanner — they behave as keyboards, so scanning into a search field or a lot/serial field on a receipt works fine on a tablet. What you don't get is the purpose-built scan-only warehouse interface. The Quality app and Studio are also Enterprise, and there's no bundled Australia Post or Sendle connector — that's third-party or custom development.
Financial reporting is the other honest gap: the Enterprise accounting reports and Studio are not part of Community, and they are not part of our offering. Plenty of Australian businesses run Odoo for inventory, purchasing and sales and keep Xero or MYOB for the general ledger and BAS lodgement. That's a legitimate architecture, not a failure. Our Community vs Enterprise comparison lays out the full split.
Why per-user pricing hurts warehouses specifically
Inventory businesses need logins for pickers, receivers and the stocktake casual — people who touch the system for twenty minutes a day. Per-user pricing models typically charge the same rate for a picker as for an operations manager, which quietly discourages you from giving warehouse staff their own login at all. That's how you end up with one shared account and no audit trail on adjustments.
ERPForge charges a flat $29/month for up to 5 users, or $79/month for up to 15 users, AUD +GST — never per user. The difference between the two plans is the user cap; every Community app is included on both. Hosting is AWS Sydney, so tablets on the warehouse floor aren't fighting trans-Pacific latency; your data stays in Australia, nightly backups are kept 7 days, and SSL is included.
A live demo instance builds from the chat on our homepage in about five minutes. Load a few products, a receipt and a landed cost, and see whether the model fits your warehouse before you commit. If you need something Odoo doesn't do natively, describe the scope at custom development — we work it through with you and come back with fixed-price scope in writing first.
See your Odoo running in five minutes. No card, no sales call — a chat, a verified email, and a live instance.
Start the demo →