The price on a purchase order is rarely what you actually paid for stock. An imported shipment also brings freight, insurance, customs duties, brokerage and local delivery. If those charges sit in an expense account instead of on the products, inventory is undervalued, cost of goods sold is too low, and every margin report flatters you. Landed costs are Odoo's fix: they fold additional costs into the valuation of the products that caused them.
What a landed cost is — and what it is not
In Odoo's own documentation, the Landed Costs feature is used to take additional costs into account when calculating the valuation of a product, including shipment, insurance, customs duties, taxes and other fees. That definition matters. A landed cost is not a markup, a selling-price adjustment or a way to pass a charge to a customer. It is a valuation adjustment to stock you have already received.
Two consequences follow. Landed costs only make sense against a receipt: you allocate a charge to the products in a specific transfer, and Odoo spreads it across that receipt's valuation. And the charge must be a cost of getting the product into stock. Freight, border duty and transit insurance qualify; the courier fee for delivering a sold order does not — that is a cost of selling, not of inventory.
The prerequisites most people miss
Landed costs have hard requirements, and most failed setups fail here.
- The costing method must be FIFO or AVCO. To apply a landed cost on a vendor bill, the products in the original purchase order must belong to a product category whose costing method is either Average Cost (AVCO) or First In First Out (FIFO). Products valued at Standard Price cannot receive landed costs, because a manually set standard cost is by definition not rebuilt from actual receipt costs.
- The landed cost product must be a Service. Every recurring charge — International Shipping, Customs Duties, Insurance — is represented by a product, and Odoo is explicit: landed cost products must have their Product Type set to Service. A stockable product here would try to move inventory that does not exist.
- Accounting must be installed. The valuation adjustment ultimately becomes a journal entry, with automated posting requiring automated inventory valuation on the category.
Skip them and you will meet the familiar symptom: the Create Landed Costs button never appears.
Step 1: Enable the feature and choose a journal
Go to Inventory > Configuration > Settings, scroll to the Valuation section, tick Landed Costs and save. A Default Journal field then appears: choose the journal in which all landed-cost accounting entries should be recorded, so capitalised freight and duty in a period is easy to reconcile.
Step 2: Create landed cost products with sensible defaults
For charges you see repeatedly, create one service product per charge type under Inventory > Products. On the product form, set Product Type to Service, open the Purchase tab and tick Is a Landed Cost in the Vendor Bills section. A Default Split Method field then appears.
Doing this once pays off on every bill: the product can be added to a request for quotation or vendor bill as a landed-cost line, carrying the split method you decided in advance.
Step 3: Choose the split method that matches how the cost was incurred
The split method is the whole decision in landed costs. Odoo offers five, and they answer different physical questions:
- Equal — splits the cost equally across each product included in the receipt, regardless of the quantity of each. Rarely right for mixed receipts; useful only when a flat fee genuinely applies per product line.
- By Quantity — splits the cost across each unit of all products in the receipt. Right for per-unit charges, such as a handling fee billed per item.
- By Current Cost — splits the cost according to the cost of each product unit, so a product with a higher cost receives a greater share. This is the usual choice for ad valorem charges such as customs duties and insurance, which are themselves calculated as a percentage of value.
- By Weight — splits the cost according to the weight of the products in the receipt. This is how most freight is actually billed, so it is normally the honest choice for ocean and air freight.
- By Volume — splits the cost according to the volume of the products in the receipt. Right when freight is charged on dimensional or cubic volume, as with bulky, light goods.
The rule: match the split to the invoice's own logic. Allocating freight by current cost quietly over-costs expensive, compact items and under-costs the heavy, cheap ones that filled the truck — and those distorted costs then drive pricing decisions for months.
Step 4: Run the workflow, from bill to valuation adjustment
The documented flow starts from a real purchase:
- Confirm the purchase order, receive the products and validate the receipt. Only validated transfers can be selected for a landed cost.
- Create the vendor bill from the purchase order. Add each landed cost product as a bill line with the actual amount from the freight forwarder, broker or insurer.
- Check the Landed Costs column on the bill: the landed cost lines have the box ticked, the ordinary product lines do not. That tick is what separates a capitalised charge from a normal purchase line.
- Click Create Landed Costs at the top of the bill. Odoo creates a landed cost record with the charge pre-filled in the Additional Costs tab.
- On the landed cost form, choose the receipt in the Transfers field. You can also create the record directly from
Inventory > Operations > Landed Costsif the charges did not arrive on a vendor bill first. - Click Compute. Open the Valuation Adjustments tab and read it before validating: the Original Value column shows the original price from the purchase order, the Additional Landed Cost column shows what is being added, and the New Value column shows the sum.
- Click Validate. Odoo posts the landed cost entry to the accounting journal and updates the valuation of the received stock.
Step 6 is the control point. Compute is a preview, not a commitment. If a split is wrong, or a zero weight is skewing a By Weight split, the Valuation Adjustments tab is where you will see it — after Validate, you are correcting accounting instead of preventing an error.
A worked example
Suppose a receipt contains 10 units of a product bought at $15 each, so the receipt is initially valued at $150. The shipment also brings a $15 freight bill and $45 in customs clearance, entered as two landed cost lines. Validating the landed cost adds $60 to that receipt's valuation, taking it to $210 — a true landed unit cost of $21 instead of $15.
That $6 difference is not cosmetic. Sell one unit at $30 and the un-landed books show a $15 gross profit, a 50 percent margin. The landed books show $9, a 30 percent margin. Only the second number can tell you whether raising the price, renegotiating freight or dropping the product is the right move.
With several products on one receipt, the arithmetic runs per product by each line's split method: freight by weight, duty by current cost, handling by quantity. Each cost line keeps its own method.
What happens in the accounts
When the vendor bill is first recorded, the freight or duty line debits an expense account. Validating the landed cost credits that expense back out and debits the inventory valuation account instead: the charge moves from profit and loss onto the balance sheet, attached to the stock. It returns to profit and loss later, as part of cost of goods sold when the units are delivered — recognised in the same period, and on the same units, as the revenue it helped produce.
Apply landed costs promptly, while the receipt is still intact in stock, rather than batching them at month end — once units have been delivered, part of the adjustment belongs to cost of goods sold rather than remaining stock.
Common mistakes and a pre-flight checklist
- Missing documents, missing costs. Do not validate with only the freight invoice while the broker's statement is still coming: an omitted component understates every unit for its whole life in stock. Wait for the complete set, then validate once.
- Zero weights and volumes. By Weight and By Volume splits divide by totals taken from the products. Products with no weight or volume set get little or nothing, and the rest absorb their share. Maintain weight and volume on imported products as master data, not as an afterthought.
- Duty applied to products that did not incur it. A standard landed cost spreads each line across the selected transfer. If only some lines in a consolidated receipt were dutiable, split the receipt or the landed cost so the duty lands only where it belongs.
- Standard Price categories. If the button is missing, check the category costing method before debugging anything else. It is the most common cause.
Used this way, landed costs turn a vague feeling that imports are less profitable than they look into an exact per-unit number.
Further reading
- Odoo Documentation: Landed costs — the official configuration, split-method definitions and vendor-bill workflow.
- Odoo Documentation (13.0): Integrating additional costs to products — the earlier official walkthrough of the same feature from the vendor bill.
