| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) • Invoicing (account) • Purchase (purchase) |
| Lines of code | 1786 |
| Technical Name |
grev_od_purchase_landed_cost |
| License | OPL-1 |
| Website | https://www.grevlin.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Discuss (mail)
• Inventory (stock) • Invoicing (account) • Purchase (purchase) |
| Lines of code | 1786 |
| Technical Name |
grev_od_purchase_landed_cost |
| License | OPL-1 |
| Website | https://www.grevlin.com |
Purchase Landed CostScenario simulation, DDP cost-per-unit, multi-currency costing, and variance analysis for true landed cost visibility
|
|
|
|
|
|
|
Need Help?For support, contact us at odoo@grevlin.com Follow us on X: @GrevlinGlobal ✓ 30 Days Free Support |
|
Grevlin Global Corp
Professional Odoo Solutions & Procurement Optimization |
Purchase Landed Cost
Complete landed cost management for Odoo 19.0: scenario simulation with Incoterm auto-population, multi-currency cost lines, DDP cost-per-unit, variance analysis, and an OWL dashboard for pipeline visibility.
Note
This module extends Odoo's native stock_landed_costs module. It adds procurement-facing workflows (scenarios, simulation, variance) without replacing any standard landed cost accounting logic.
Overview
The Purchase Landed Cost module gives procurement, finance, and logistics teams a single platform to model, simulate, and reconcile the complete cost of every imported shipment. Key capabilities:
- Cost Component Templates — reusable components (freight, customs duties, import tax, insurance, handling, inspection, documentation) with five calculation methods.
- Incoterm Rules — map each Incoterm to its buyer-responsible cost components; scenarios auto-populate in one click.
- Scenario Simulation — named pre-shipment scenarios per Purchase Order with Draft / Active / Archived states and multi-currency cost lines.
- DDP Cost Per Unit — total landed cost divided by total PO quantity, recomputed automatically on every input change.
- Variance Analysis — compare estimated vs actual per cost type with within-budget / minor / major classification.
- Cost Overrun Alerts — major variance schedules a warning activity on the related Purchase Order automatically.
- OWL Dashboard — estimation pipeline counts, variance distribution, 5 KPI tiles, and an embedded scenario kanban.
Configuration
Installation
- Install the module. Ensure these Odoo standard modules are present:
- purchase, product, stock, account, mail
- stock_landed_costs (Odoo native landed costs engine)
- Assign users to the appropriate security group under :menuselection:`Settings --> Users & Companies --> Users`.
Security Groups
| Group | Permissions |
|---|---|
| :guilabel:`Landed Cost User` | Read-only access to all module records. |
| :guilabel:`Landed Cost Manager` | Full CRUD on all records; implies User. |
| :guilabel:`Landed Cost Auditor` | Standalone read-only for finance audit teams (does not imply User). |
Configuring Cost Components
Go to :menuselection:`Purchase Landed Cost --> Configuration --> Cost Components` and click :guilabel:`New`.
| Field | Description |
|---|---|
| :guilabel:`Name` | Descriptive label (e.g. Ocean Freight — FCL 20ft). |
| :guilabel:`Cost Type` | Category: Freight, Customs Duties, Import Tax, Insurance, Handling, Inspection, Documentation, Other. |
| :guilabel:`Calculation Method` | How the amount is computed. See table below. |
| :guilabel:`Origin Country` | Optional filter. Component only appears for this country of origin. |
| :guilabel:`Destination Country` | Optional filter. Component only appears for this destination country. |
Calculation methods:
| Method | Formula |
|---|---|
| Fixed Amount | User-entered absolute cost per shipment. |
| % of Goods Value | rate_value / 100 × total_goods_cost |
| Per Unit | rate_value × total_PO_quantity |
| Per Weight (kg) | rate_value × total_product_weight |
| Per Volume (m³) | rate_value × total_product_volume |
Tip
Use Per Weight for ocean freight (LCL) and % of Goods Value for ad-valorem customs duty and insurance premiums.
Configuring Incoterm Rules
Go to :menuselection:`Purchase Landed Cost --> Configuration --> Incoterm Rules`. Pre-loaded rules ship with the module:
- FOB — 7 buyer-responsible costs (main carriage, customs import, taxes, insurance, destination handling, inspection, documentation).
- CIF — 4 buyer-responsible costs (customs import, import taxes, destination handling, documentation).
- DDP — 0 buyer costs (all costs borne by seller).
Add custom rules by clicking :guilabel:`New`, selecting an Incoterm, and linking it to the cost components that become the buyer's responsibility under that term.
Usage
Creating a Cost Scenario
- Open a confirmed or draft Purchase Order.
- Go to :menuselection:`Purchase Landed Cost --> Cost Scenarios --> New`.
- Fill in the header:
- :guilabel:`Purchase Order` — the linked PO.
- :guilabel:`Incoterm` — trade term for this shipment.
- :guilabel:`Origin Country` and :guilabel:`Destination Country`.
- Click :guilabel:`Populate from Incoterm`. The system reads the Incoterm rule and creates one scenario line per buyer-responsible component, pre-filling the calculation method from the component template.
- Adjust individual lines as needed:
- Override :guilabel:`Rate / Value`.
- Set :guilabel:`Cost Currency` and :guilabel:`Exchange Rate` for multi-currency lines.
- The :guilabel:`Calculated Amount` column updates automatically.
- Review summary totals at the bottom of the form:
- :guilabel:`Total Goods Cost` — PO untaxed amount.
- :guilabel:`Total Additional Cost` — sum of all calculated amounts in company currency.
- :guilabel:`Total Landed Cost` — goods + additional.
- :guilabel:`Overhead %` — additional as % of goods value.
- :guilabel:`Total Quantity` — sum of PO line quantities.
- :guilabel:`DDP Cost Per Unit` — total landed cost ÷ total quantity.
- Click :guilabel:`Set Active` to promote the scenario to Active state.
Creating the Linked Landed Cost
Once the active scenario is confirmed, click :guilabel:`Create Landed Cost`. This generates a stock.landed.cost record linked to the PO and scenario, pre-populated with the scenario's cost lines. The standard Odoo landed cost workflow (validate, apply to stock valuation) then proceeds normally.
Tracking the Estimation Lifecycle
The landed cost record carries an :guilabel:`Estimation State` field:
| State | Meaning |
|---|---|
| None | Not yet estimated. Landed cost created but no scenario linked. |
| Estimated | Scenario has been applied. Awaiting actual cost data. |
| Confirmed | Actuals entered. Ready for variance computation. |
| Reconciled | Variance computed. Record is closed for further edits. |
Use the action buttons on the landed cost form to advance the state: :guilabel:`Mark as Estimated`, :guilabel:`Confirm Estimation`, :guilabel:`Compute Variance`.
Variance Analysis
- After entering actual cost lines on the landed cost record, set the state to Confirmed.
- Click :guilabel:`Compute Variance`.
- The system groups scenario lines and actual lines by :guilabel:`Cost Type` and creates a :guilabel:`Variance` record with one line per cost type.
- Each variance line is classified automatically:
- Within Budget — absolute variance ≤ threshold (default 5%).
- Minor Variance — between threshold and 3× threshold.
- Major Variance — above 3× threshold.
- If Major Variance is detected, a warning activity is scheduled on the linked Purchase Order.
Important
The variance threshold is configurable via :menuselection:`Settings --> Technical --> Parameters --> System Parameters`. Key: grev.lc.variance.threshold. Default: 5 (percent).
Using the Dashboard
Navigate to :menuselection:`Purchase Landed Cost --> Dashboard`.
- Left panel — estimation pipeline counts by state. Click any count button to filter the embedded scenario kanban.
- Right panel — variance distribution (within-budget, minor, major). Click to navigate to the variance list.
- KPI strip — total landed cost this month, average overhead %, pending reconciliation count, active scenarios count, major variance count.
- Refresh button reloads all data without a full page reload.
Technical Details
Data Model
| Model | Description |
|---|---|
| stock.landed.cost (extended) | Adds purchase_order_id, scenario_id, estimation_state, total_purchase_price, total_quantity, cost_per_unit. |
| stock.landed.cost.lines (extended) | Adds cost_type, cost_currency_id, exchange_rate, price_unit_company_currency. |
| grev.purchase.landed.cost.component | Reusable cost component templates with type, method, country filters. |
| grev.purchase.landed.cost.incoterm.rule | Incoterm → buyer-responsible components mapping. |
| grev.purchase.landed.cost.scenario | Pre-shipment cost scenario (per PO, per Incoterm, per route). |
| grev.purchase.landed.cost.scenario.line | One line per cost component in a scenario; stores multi-currency inputs and calculated_amount. |
| grev.purchase.landed.cost.variance | Estimated vs actual variance record, linked to stock.landed.cost. |
| grev.purchase.landed.cost.variance.line | Per-cost-type variance breakdown with classification state. |
Key Computed Fields
All totals on scenarios and landed costs are stored computed fields (store=True). They recompute via @api.depends chains covering:
- Scenario: PO line quantities/amounts, scenario line inputs (rate, method, currency, exchange rate).
- Landed cost: cost line amounts, PO amount_untaxed.
This means the UI shows up-to-date values without requiring a manual recalculation step.
Integration Points
Upstream (data sources):
- purchase.order — goods cost and quantity for scenario totals.
- grev_od_purchase_esourcing — estimated bid prices (optional).
- grev_od_purchase_comparator — selected offer prices (optional).
Downstream (consumers):
- stock.landed.cost — actual cost execution and stock valuation.
- grev_od_spend_analytics — total cost reporting and KPIs.
- grev_od_purchase_ai_assistant — predictive landed cost insights (phase 2, optional).
Note
Cross-module lookups use try/except guards. The module degrades gracefully when optional suite modules are not installed.
Out of Scope
- No accounting postings — calculation and preparation only; journal entries are produced by the native stock_landed_costs module.
- No logistics execution — belongs to grev_purchase_trade_logistics.
- No quality inspection — belongs to grev_od_purchase_quality_check.
See Also
- :doc:`../grev_od_purchase_comparator/doc/index` — Supplier Price Comparator
- :doc:`../grev_od_purchase_trade_logistics/doc/index` — Trade Logistics
- :doc:`../grev_od_purchase_budget_control/doc/index` — Budget Control
- :doc:`../grev_od_spend_analytics/doc/index` — Spend Analytics
Odoo Proprietary License v1.0 This software and associated files (the "Software") may only be used (executed, modified, executed after modifications) if you have purchased a valid license from the authors, typically via Odoo Apps, or if you have received a written agreement from the authors of the Software (see the COPYRIGHT file). You may develop Odoo modules that use the Software as a library (typically by depending on it, importing it and using its resources), but without copying any source code or material from the Software. You may distribute those modules under the license of your choice, provided that this license is compatible with the terms of the Odoo Proprietary License (For example: LGPL, MIT, or proprietary licenses similar to this one). It is forbidden to publish, distribute, sublicense, or sell copies of the Software or modified copies of the Software. The above copyright notice and this permission notice must be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
Please log in to comment on this module