Landed Costs and the Bill of Entry Flow in Odoo 20

The price on a purchase order is only part of what imported goods actually cost. By the time a shipment clears the port and reaches your shelf, it has also absorbed ocean or air freight, cargo insurance, customs duty, brokerage fees, port handling, and the truck ride to your warehouse. If your inventory valuation stops at the supplier's invoice price, every margin report downstream is wrong — usually in the optimistic direction, because the missing costs make products look more profitable than they are.

Landed costs are Odoo's mechanism for fixing that: they fold those additional costs into the valuation of the received products, so product cost — and cost of goods sold when the item sells — reflects what the goods truly cost to land. Odoo 20 keeps that proven engine, sharpens it with per-product landed costs and clearer valuation reporting, and adds one headline localisation item: a dedicated bill of entry flow in the India localisation that ties import customs duty directly into landed costs.

Diagram showing the Odoo 20 bill of entry flow routing import customs duty into landed costs and inventory valuation

What belongs in a landed cost

Not every expense attached to a shipment belongs in valuation. The standard rule: a cost belongs in landed cost if it was necessary to bring the goods to their present location and condition. In practice that means:

  • Freight and shipping — ocean, air, or road, including origin charges you bear.
  • Insurance on the consignment in transit.
  • Customs duty and import levies assessed on the shipment.
  • Customs brokerage and clearing fees, plus port and terminal handling.
  • Inland transport from the port of entry to your warehouse.

Just as important is what to leave out. Recoverable taxes are the classic error: where import VAT or GST can be claimed back as input credit, it is not a cost of the goods and must not be capitalised into valuation. Storage after receipt, outbound delivery costs, and general overhead are period costs, not acquisition costs. Decide your inclusion list once and agree it with your accountant — an undocumented policy becomes a year-end argument.

How landed costs work in Odoo

Configuration

Landed costs are enabled in the Inventory settings, in the Valuation section, where you also choose a default journal for the related accounting entries. Two prerequisites matter. First, landed cost products must be service products: a freight charge is not something you stock. Second, the products on the original purchase order must belong to a product category whose costing method is AVCO (average cost) or FIFO — landed costs adjust real valuation, and standard-price categories do not absorb them the same way.

Landed cost products and split methods

For charges that recur — international shipping, customs clearance, insurance — create a dedicated product once, flag it Is a Landed Cost on the Purchase tab, and set a Default Split Method. The split method decides how a cost is distributed across the products in a receipt:

  • Equal — split evenly across the products in the receipt, regardless of quantity. Suits flat documentation or brokerage fees.
  • By Quantity — split across every unit received. Suits per-item handling or inspection charges.
  • By Current Cost — split in proportion to each product's cost. Suits insurance and ad valorem duty, which scale with value.
  • By Weight — split by product weight. Suits air freight and weight-priced road transport.
  • By Volume — split by product volume. Suits ocean freight, where you are buying container space.

The important discipline is to use a different method per cost line. One shipment might correctly use volume for ocean freight, current cost for insurance, and equal for the broker's flat fee. Applying one method to everything is the most common reason a landed cost setup is barely better than a blanket percentage markup.

Applying the costs

There are two entry points. From a vendor bill, tick the Landed Costs option on the relevant bill lines (or add a landed cost product as a line), then click Create Landed Costs — Odoo builds the landed cost record with the amounts pre-filled. Or create the record directly under Inventory → Operations → Landed Costs, pick the transfers (receipts) the costs apply to, and add the cost lines. Click Compute to calculate the allocation per product; the Valuation Adjustments tab previews how much value each product gains. Validate posts the journal entry and updates product costs. Because the charges often arrive after the goods — a freight invoice can land weeks later — this can be done after the fact, and the valuation catches up.

What is new for landed costs in Odoo 20

Odoo 20 does not reinvent landed costs, but the Inventory section of the release notes includes a genuinely useful refinement: landed costs for specific products. You can now add landed costs to individual products of a transfer, rather than always spreading a cost across everything on the receipt. That matters for mixed shipments where one line attracted a specific charge — a certification fee, a special handling charge — which previously had to be forced through a split method that did not really fit.

Two accounting-side changes make the results easier to live with. Cost adjustments and their impact on valuation are now listed in a dedicated Valuation Adjustments menu (available in debug mode), with journal entries created automatically under perpetual accounting — the trail from landed cost to ledger is visible in one place. And when a product's cost changes after delivery — exactly what a late-arriving landed cost does — the delivery's value, and the invoice cost under perpetual accounting, are updated retroactively, keeping COGS aligned with the corrected cost. Odoo 20 also moves HS (harmonised system) codes to the product-variant level; duty is assessed per classification, and variants of one product do not always share a code.

The bill of entry flow: an India localisation addition

The bill of entry item sits in the India section of the Odoo 20 release notes, under Accounting — worth being precise about that scope. A bill of entry is the legal customs declaration an importer (or their broker) files with Indian customs to clear imported goods into the country; it is the document against which import customs duty is assessed and paid. In Odoo 20, the Indian localisation gains a new bill of entry flow for imported goods which, in the release notes' own words, “simplifies the recording of import customs duty and ensures the duty amount is included in inventory costing through landed costs.”

That second clause is the point. For an Indian importer, customs duty is typically the largest landed cost on a shipment, and also the one most often recorded in a spreadsheet or standalone journal while the goods sit in inventory at their pre-duty value. The new flow connects the customs document to the costing machinery: duty recorded through the bill of entry flow feeds the landed cost allocation, so valuation includes the duty actually incurred, and the audit trail runs from customs declaration to stock valuation to general ledger.

Who it helps is specific: businesses on the Indian localisation that import goods — manufacturers bringing in components, distributors and traders bringing in finished stock. For them, the flow removes a manual reconciliation step between the broker's paperwork and the books. If you are not on the Indian localisation, the flow itself does not apply — but the pattern does. Every importer has an equivalent customs document and the same costing obligation; outside India you reach the same result by recording duty as a landed cost line (ideally its own cost product, split by current cost, since duty is ad valorem) against the receipt. Odoo 20's contribution there is the general machinery above.

A worked example

Say a receipt brings in 100 units of Product A at $50 and 50 units of Product B at $200 — a goods value of $15,000. The shipment adds $1,500 of ocean freight, $300 of insurance, and $1,200 of customs duty, and the goods have already started selling before the freight bill arrives. Applied with sensible split methods — freight by volume, insurance and duty by current cost — the $3,000 raises the receipt's valuation by exactly $3,000, distributed per method, and each product's unit cost rises accordingly. Under perpetual accounting, units already delivered get their COGS corrected retroactively in Odoo 20 rather than stranding the difference. Every subsequent margin on A and B is then calculated against a cost that includes getting the goods to the shelf — the only margin figure worth pricing on.

Practical guidance

  • One cost product per charge type, each with its own default split method, beats one generic “shipping” product.
  • Keep duty separate. Where a shipment mixes products at materially different duty rates, enter duty as separate lines per rate group instead of one pooled amount.
  • Apply costs promptly. Retroactive correction helps, but margins reported in the gap are still wrong while it lasts.
  • Check the costing method first. If landed costs will not apply, the AVCO/FIFO setting on the product category is the first place to look.

Landed costs are unglamorous, but they are where an ERP earns its keep for importers: one database where the purchase, the shipment, the duty, and the valuation agree. Odoo 20 tightens that story — finer-grained application, clearer adjustment reporting — and, for Indian importers, closes the loop between the customs declaration and the cost of goods on the shelf.

Further reading

Leave a Comment