Odoo Transit Warehouse for EXW and FOB Imports: Setup and Valuation
Set up an Odoo transit warehouse for EXW and FOB imports in Odoo 19 and 20: transit location, routes, lead times, valuation, landed costs and customs.
Importers face the same gap: the bill and the ownership arrive long before the container. Odoo models that gap well if locations, routes and valuation accounts are set up together. Our Odoo consulting services start with exactly this kind of flow review.
This guide is for import managers, controllers and Odoo admins buying EXW, FCA or FOB on Odoo 19 or 20. For the wider buying setup, see our guide to Odoo for trading companies.
What is a transit warehouse in Odoo?
An Odoo transit warehouse is not a separate app but a stock location, usually of the Transit type, that holds goods between two physical places. Odoo has seven location types, and only some of them count as stock you own.
Odoo's own guide to location types lists seven types, including Transit, which tracks "products shipped between different addresses" in inter-company or inter-warehouse operations.
| Location type | Counted in inventory value? | Typical use |
|---|---|---|
| Vendor | No | Goods not yet received from a supplier |
| Internal | Yes | Warehouse stock, input, quality and packing zones |
| Transit (with a company) | Yes | Goods moving between two addresses you control |
| Inter-company transit (no company) | No | Default hand-off point between two companies |
| Customer | No | Goods delivered to a customer |
| Virtual | Not applicable | Structure only, should not hold stock |
The Odoo 20 valuation guide marks Transit as "in inventory", and moves between two in-inventory locations do not change value. The EXW and FOB design rests on that rule.
Why do EXW and FOB purchases need in-transit stock in Odoo?
EXW and FOB purchases need in-transit stock because ownership and risk pass to you before the goods reach your warehouse. If Odoo only records the goods at arrival, your balance sheet understates stock for the whole voyage.
Under Incoterms rules, EXW passes risk at the seller's premises and FOB once goods are on board at origin. Odoo lists all 11 in its Incoterms documentation, but the field does not move stock.
| Incoterm | Where risk passes to the buyer | Use a transit step in Odoo? |
|---|---|---|
| EXW (Ex Works) | Seller's premises | Yes, from pickup |
| FCA (Free Carrier) | Handover to your carrier | Yes, from handover |
| FOB (Free on Board) | On board the vessel at origin port | Yes, from loading |
| CIF (Cost, Insurance and Freight) | On board, seller pays freight and insurance | Often yes, check your accounting policy |
| DAP (Delivered at Place) | At your named place, before unloading | Usually no |
| DDP (Delivered Duty Paid) | At your named place, duty paid | No, receive directly |
In Odoo 20 you can set a default purchase Incoterm and Incoterm Location on each vendor, and new RFQs pick them up. Our Odoo 20 Purchase release notes show the new vendor fields. In Odoo 19 you pick the Incoterm on each order.
Transit or Internal: which location type should hold in-transit stock?

Use a Transit location with your company set, placed outside your warehouse stock tree, for most EXW and FOB imports. It is valued, it is not sold by mistake, and it reads clearly in reports.
Many how-to guides use an Internal location under the warehouse. That works for valuation, but it can mix goods at sea with goods on the shelf. The table compares the three common options.
| Factor | Transit location, company set | Internal location under WH | Default Inter-company transit |
|---|---|---|---|
| Valued in Odoo 19 and 20 | Yes | Yes | No, it has no company |
| Shown as on hand in the warehouse | Not if placed outside WH | Yes, it sits under WH | No |
| Risk of selling goods at sea | Low | High without extra rules | Low |
| Works with push rules | Yes, via product or category route | Yes, via warehouse route | Built for resupply only |
| Reporting clarity | Clear "In Transit" line | Mixed with input zones | Inter-company moves only |
| Best for | EXW, FCA and FOB imports | Short local hops | Moving stock between your companies |
Odoo computes warehouse on-hand quantity from every location under that warehouse. If the transit location sits inside WH, a container still at sea can look available to sales. Keep it under its own parent, and test forecasts before go-live.
How to set up an Odoo transit warehouse step by step
You need one location, two operation types and one route, and the steps are the same in Odoo 19 and Odoo 20. Build it in a test database first and run one dummy purchase end to end.
- Enable settings: in Inventory settings, turn on Storage Locations and Multi-Step Routes.
- Create the location: add "In Transit" with Location Type set to Transit, Company set to your company, and a parent outside WH/Stock.
- Create the shipment operation type: a Receipt type, for example "Shipped from Vendor", with Vendors as default source and In Transit as default destination.
- Create the arrival operation type: for example "Arrival from Transit", from In Transit to WH/Stock or WH/Input if you use two-step receipts.
- Create the route: add a route "Import via Transit", selectable on Product Categories and Products, with a Push To rule from In Transit to your receiving location.
- Set the lead time: put your typical voyage days in the rule's Lead Time field, so the arrival transfer gets a realistic scheduled date.
- Assign the route: set it on the import product categories, and set "Deliver To" on the purchase order to the Shipped from Vendor operation type.
- Test the cycle: confirm a PO, validate the shipment on the loading date, check the inventory valuation, then validate the arrival.
With two- or three-step receipts, point the push rule at WH/Input and let the warehouse rules take goods on to stock. Odoo's routes documentation explains Push To and Pull From rules.
How do Odoo routes and lead times move goods from transit to stock?
A Push To rule creates the arrival transfer the moment you validate the shipment into transit, dated by the rule's lead time. You do not need to create the second transfer by hand.
In the Odoo 20 source, the push rule adds its Lead Time in days to the date of the validated move. For example, a 35-day rule on a shipment validated on 1 March schedules the arrival for 5 April. Update that date when the carrier gives you an ETA.
- One route per lane: a 35-day sea lane and a 7-day air lane need different lead times, so create a route or rule for each.
- Location-specific push routes: Odoo 20 can choose the push rule by the exact destination, as our Odoo 20 Inventory release notes show.
- Promised dates: Odoo 20 keeps the vendor's original Promised Date when you move the expected arrival on a PO, so on-time rates stay honest.
- Serials and lots: assign lot or serial numbers on the shipment into transit, then reuse them on arrival for full traceability.
How is in-transit stock valued in Odoo 19 and 20?
Goods enter stock value when you validate the vendor-to-transit receipt, at the purchase order price converted to company currency. The later move from transit to stock changes location only, not value.
Odoo 20 docs value a receipt at the quantity times "the unit price on the source purchase order line, converted to the company's currency". For foreign-currency FOB orders the shipment-date rate matters; see our Odoo multi currency accounting guide.
How that value reaches the general ledger depends on the accounting method in Accounting settings. Odoo's inventory valuation guide for accountants describes two options.
| Accounting method | When in-transit value hits the ledger | What to check |
|---|---|---|
| Perpetual (at invoicing) | When the vendor bill posts, plus closing entries for receipts not yet billed | Valuation and variation accounts |
| Periodic (at closing) | At the closing entry, manual, daily or monthly | Closing frequency matches your reporting |
Odoo's valuation docs are marked "for Odoo 19 or later" because the model changed in 19, so older guides may not match. Our post on Odoo 20 inventory valuation changes covers FIFO and AVCO in detail.
How do vendor bills, landed costs and customs duties work for goods in transit?
Validate the shipment into transit first, then the vendor bill matches received quantities, and freight and duties go on as landed costs on that same receipt. This order keeps the bill, the stock and the cost in step.
Odoo's bill Control Policy is either "On ordered quantities" or "On received quantities". With received quantities, the bill can be posted as soon as goods reach the transit location, which matches EXW and FOB terms where you pay against shipping documents.
Freight, insurance and duties belong on the receipt that brought the value in: the vendor-to-transit transfer. Odoo's landed costs documentation covers setup; cost products must be Services.
Odoo 20 adds two useful changes. Each landed cost line has an "Apply On" field, so duty can hit one product only. And if goods were already sold when the landed cost arrives, Odoo replays the delivery value and, with perpetual accounting, updates the posted invoice's COGS lines.
Can Odoo model a customs or bonded warehouse?
Yes, as a separate valued location with its own operation types, but Odoo has no dedicated bonded-warehouse feature or duty-suspension logic. Customs status is a process you model, not a switch you turn on.
A typical Odoo customs warehouse setup adds a "Customs Hold" location after In Transit. Goods move from transit to customs hold on arrival at port, then to stock once cleared. Duties post as a landed cost when the customs entry is known.
- Separate location: keeps cleared and uncleared goods apart in stock reports.
- Quality checks: add an inspection step before release if customs or your own QC requires it.
- Duty tracking: use a landed cost product per duty type so reports split duty from freight.
- Local rules: bonded storage rules, re-export and duty deferral differ by country and usually need custom fields or a customs broker integration.
Which industries need in-transit stock tracking in Odoo?
Any business that imports on long lead times and pays before arrival benefits from tracking goods in transit. The table shows where we see the biggest effect.
| Industry | Pain or cost driver | Odoo approach | How iVentureTeam helps |
|---|---|---|---|
| Wholesale and distribution | Containers at sea for weeks, paid on bill of lading | Transit location, push route by lane | Design lanes, lead times and reports |
| Manufacturing | Imported raw materials drive production plans | Transit stock visible in forecasts, not on hand | Link transit to MRP, see our Odoo ERP for manufacturing page |
| Logistics and 3PL | Many inbound lanes and handover points | Locations per port or hub | Model hubs, see Odoo ERP for logistics |
| Retail and eCommerce | Seasonal stock bought FOB months ahead | Transit value in reports, no early selling | Keep transit out of webshop stock |
| Electronics and hardware | Serial numbers from the factory | Serials assigned at shipment | Set up tracking and landed costs |
What are the common mistakes with Odoo in-transit stock?
Most problems come from location placement, missing company fields and landed costs posted on the wrong transfer. Each one is easy to avoid in a test run.
- Transit under WH/Stock: goods at sea show as available and get promised to customers.
- No company on the location: Odoo treats the location as not valued, so stock value drops when goods ship.
- Using Inter-company transit for imports: it is built for moves between your companies and is not valued.
- Landed costs on the arrival: the arrival does not change value, so put costs on the vendor-to-transit receipt.
- One lead time for all lanes: arrival dates and reorder planning drift for air and sea shipments.
- Upgrading without a retest: valuation changed in Odoo 19, so retest transit flows before any upgrade from 17 or 18.
To size a project that includes import flows, start with our free Odoo project estimate tool.
How iVentureTeam helps set up Odoo transit warehouse flows

We design, test and document the full import flow, from Incoterm to landed cost, so stock value and the ledger agree. We have delivered 150+ ERP projects across 35+ countries with 40+ Odoo specialists over 13+ years.
- Flow design: locations, operation types and routes per lane, including customs hold steps.
- Accounting setup: valuation method, accounts, bill control and landed cost products, agreed with your accountant.
- Testing: dummy EXW and FOB orders run end to end in a copy of your database.
- Rollout: part of a wider project through our Odoo implementation services, or a focused fix for a live system.
- Tracking: carrier tracking linked to purchase orders when you need live ETAs.
Odoo in-transit stock case study: inbound shipment tracking with AfterShip
A US eCommerce retailer had no tracking linked to inbound purchase shipments, so receiving dates were guesswork. We connected Odoo Purchase and Sales to AfterShip so shipments update themselves inside Odoo.
Tracking numbers lived in emails and carrier portals, not on Odoo records. Purchasing had little visibility on inbound stock, and with hundreds of couriers, per-carrier integrations were not maintainable.
We built a custom Purchase extension that records the vendor's tracking info against the matching PO, plus a scheduled action that polls AfterShip and writes the latest status. One integration covers 686 couriers, delivered in 5 weeks.
Purchasing now plans receiving around live inbound tracking rather than vendor promises. Read the AfterShip inbound and outbound tracking case study.
The bottom line on Odoo transit warehouse setup
For EXW and FOB imports, use a company-owned Transit location outside your stock tree, a push route with a real lead time, and landed costs on the shipment receipt. That gives you correct stock value while the goods are at sea.
Test the whole cycle on Odoo 19 or 20 before go-live: PO, shipment, bill, landed cost, arrival and closing entry. If the valuation report and the ledger agree after one test order, the design is sound.
Ready to get your import stock right in Odoo?

Get a transit and landed cost flow designed and tested for your lanes. Talk to an Odoo inventory consultant about your import flow, call +91-90235-15208, or email business@iventureteam.com.
Frequently Asked Questions
What is a transit location in Odoo?
+
It is a location type for goods moving between two addresses, such as two warehouses or a vendor and your dock. In Odoo 19 and 20, a Transit location with a company set counts as inventory you own.
How do I track goods in transit in Odoo?
+
Create a Transit location, a receipt type from Vendors to that location, and a push route to your stock. Validate the receipt when goods ship, and Odoo creates the arrival transfer automatically.
Is in-transit stock included in Odoo inventory valuation?
+
Yes, if the transit location has your company set. The default Inter-company transit location has no company and is not valued, so do not use it for imports.
Do Incoterms change stock moves in Odoo?
+
No. The Incoterm field on a purchase order records the trade term and its location, but routes and operation types decide how stock moves. Odoo 20 can fill the Incoterm from the vendor.
When should I validate the receipt into transit for FOB?
+
Validate it on the date the goods are loaded on board, usually the bill of lading date. That matches when risk passes to you under FOB and puts the stock value in the right period.
Can I post the vendor bill before goods arrive?
+
Yes. With the "On received quantities" control policy, the bill matches the quantity received into transit, so you can post it as soon as the shipment is validated.
Where do freight and import duties go?
+
Add them as landed costs on the vendor-to-transit receipt, since that transfer brought the value in. In Odoo 20, the Apply On field lets you charge a duty to chosen products only.
Does Odoo have a bonded or customs warehouse feature?
+
Not as a dedicated feature. You model it with a separate customs hold location and operation types, and add custom fields or a broker integration for local duty rules.
Does this setup work in both Odoo 19 and Odoo 20?
+
Yes. Locations, operation types, push rules and valuation work the same way. Odoo 20 adds vendor default Incoterms, location-specific push routes and landed costs on chosen products.
Free written answer from a certified consultant
Running your warehouse on Odoo?
We review your costing method and valuation setup in Odoo and show what to fix before it reaches your books.
Free, with no obligation. A senior consultant replies within 12 business hours.
Free Odoo tools
All tools- Odoo Health CheckVersion, modules, findings and upgrade cost
- Odoo App SelectorWhich apps you need, by industry
- Odoo Project EstimateIndicative cost and timeline in minutes
- Odoo Implementation Cost CalculatorImplementation cost and timeline, in minutes
- Odoo Migration Cost CalculatorVersion jump or legacy ERP, priced in minutes
Continue reading
Odoo Removal Strategies: FIFO, LIFO, FEFO Setup and Valuation Impact
Set up Odoo removal strategies in Odoo 19 and 20: FIFO, LIFO, FEFO with expiry dates, Closest Location and Least Packages, plus their valuation impact.
Odoo Year End Closing Checklist: Lock Dates, Accruals, Depreciation
Odoo year end closing checklist for Odoo 19 and 20: pre-close checks, accruals, depreciation, lock dates, current year earnings and the new fiscal year.
Odoo Automation Rules in Odoo 19 and 20: Triggers, Actions, Examples
Odoo automation rules in Odoo 19 and 20: every trigger and action, worked examples, why rules fail to fire, what changed in 20 and when to use code instead.
