Skip to main content
iVentureTeam
Import Logistics

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.

Siddharth JambukiyaSiddharth JambukiyaOdoo Techno-Functional Consultant
November 12, 202613 min read1 view
Odoo Transit Warehouse for EXW and FOB Imports: Setup and Valuation cover

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 typeCounted in inventory value?Typical use
VendorNoGoods not yet received from a supplier
InternalYesWarehouse stock, input, quality and packing zones
Transit (with a company)YesGoods moving between two addresses you control
Inter-company transit (no company)NoDefault hand-off point between two companies
CustomerNoGoods delivered to a customer
VirtualNot applicableStructure 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.

IncotermWhere risk passes to the buyerUse a transit step in Odoo?
EXW (Ex Works)Seller's premisesYes, from pickup
FCA (Free Carrier)Handover to your carrierYes, from handover
FOB (Free on Board)On board the vessel at origin portYes, from loading
CIF (Cost, Insurance and Freight)On board, seller pays freight and insuranceOften yes, check your accounting policy
DAP (Delivered at Place)At your named place, before unloadingUsually no
DDP (Delivered Duty Paid)At your named place, duty paidNo, 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?

Odoo in-transit stock: Which location should hold it?

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.

FactorTransit location, company setInternal location under WHDefault Inter-company transit
Valued in Odoo 19 and 20YesYesNo, it has no company
Shown as on hand in the warehouseNot if placed outside WHYes, it sits under WHNo
Risk of selling goods at seaLowHigh without extra rulesLow
Works with push rulesYes, via product or category routeYes, via warehouse routeBuilt for resupply only
Reporting clarityClear "In Transit" lineMixed with input zonesInter-company moves only
Best forEXW, FCA and FOB importsShort local hopsMoving 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.

  1. Enable settings: in Inventory settings, turn on Storage Locations and Multi-Step Routes.
  2. Create the location: add "In Transit" with Location Type set to Transit, Company set to your company, and a parent outside WH/Stock.
  3. Create the shipment operation type: a Receipt type, for example "Shipped from Vendor", with Vendors as default source and In Transit as default destination.
  4. 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.
  5. 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.
  6. 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.
  7. 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.
  8. 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 methodWhen in-transit value hits the ledgerWhat to check
Perpetual (at invoicing)When the vendor bill posts, plus closing entries for receipts not yet billedValuation and variation accounts
Periodic (at closing)At the closing entry, manual, daily or monthlyClosing 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.

IndustryPain or cost driverOdoo approachHow iVentureTeam helps
Wholesale and distributionContainers at sea for weeks, paid on bill of ladingTransit location, push route by laneDesign lanes, lead times and reports
ManufacturingImported raw materials drive production plansTransit stock visible in forecasts, not on handLink transit to MRP, see our Odoo ERP for manufacturing page
Logistics and 3PLMany inbound lanes and handover pointsLocations per port or hubModel hubs, see Odoo ERP for logistics
Retail and eCommerceSeasonal stock bought FOB months aheadTransit value in reports, no early sellingKeep transit out of webshop stock
Electronics and hardwareSerial numbers from the factorySerials assigned at shipmentSet 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

Planning import flows? Price the project

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?

Book an import flow review

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.