Every figure here is illustrative. We use a publicly listed product, Spark Solar's Spark 144 Cells TOPCon M10 MBB module (nominal power 560–585 Wp), only as a product reference. The shipment, prices, BoM and conversion costs are our assumptions, not claims about Spark Solar's purchasing or production.
The assumptions:
- 144 cells per module, so a 14,400-cell shipment builds exactly 100 modules
- No breakage, no rework, no production losses
- Glass-backsheet construction, chosen only to demonstrate the costing
- USD 1 = ₹85, a fixed rate for the arithmetic, not a live or accounting rate
- GST isn't modelled
Because the invoice covers only the goods. In this example the supplier bill is ₹2,44,800, but bringing those cells into the factory costs ₹3,65,300 once freight, insurance, duty and clearance are counted. Roughly one rupee in three of the true cell cost arrives on bills that never mention a solar cell.
That's the core problem. Freight comes from a forwarder, duty from customs, clearance from a CHA, often weeks apart. Each bill gets paid and booked correctly. But unless someone ties them back to the receipt, inventory still carries the cells at ₹17 each, and every manufacturing order consumes them at ₹17.
The result is quiet: understated product cost, margins that look better than they are, and quotations priced off a number that was never complete. It's the same disconnect we see across manufacturing businesses running on spreadsheets, just with larger import bills.
Create the purchase order in the supplier's currency, then validate the receipt when the cells arrive. Here, 14,400 cells at USD 0.20 each gives a USD 2,880 invoice, which converts to ₹2,44,800 at the assumed rate. That puts the base cost at ₹17.00 per cell.
| Purchase detail | Illustrative value |
| Quantity purchased | 14,400 cells |
| Supplier price per cell | USD 0.20 |
| Supplier invoice | USD 2,880 |
| Assumed exchange rate | USD 1 = ₹85 |
| Supplier invoice value in INR | ₹2,44,800 |
| Base purchase cost per cell | ₹17.00 |
Validating the receipt matters more than it looks. The landed cost record in Odoo attaches to a validated receipt (a stock transfer), not to the purchase order. No validated receipt, nothing to allocate against.
Expenses incurred to bring the goods to their current location and condition belong in landed cost. In this example that's ₹1,20,500 across five lines, with freight and customs duty making up 75% of it.
| Import expense | Illustrative amount |
| International freight (USD 500 × ₹85) | ₹42,500 |
| Insurance | ₹5,000 |
| Customs duty | ₹48,000 |
| Port and customs clearance | ₹18,000 |
| Other eligible import expenses | ₹7,000 |
| Total additional landed costs | ₹1,20,500 |
The duty figure is hypothetical. It isn't the statutory rate for any real solar-cell import.
What usually doesn't belong? Recoverable taxes. Import IGST that you claim back as input credit is normally a receivable, not inventory cost, while basic customs duty that you can't recover is. Which lines qualify depends on your tax position, so confirm the treatment with your CA before you configure the landed-cost products.
Odoo's Landed Costs feature takes expenses booked on separate vendor bills and adds them to the value of the stock they relate to. You mark the expense as a landed-cost product on the bill, create the landed-cost record, pick the validated receipt, compute, review and validate.
Odoo offers five split methods, set per cost line:
| Split method | How it spreads the cost | Fits |
| Equal | Same amount per receipt line | Small fixed fees |
| By Quantity | Per unit received | Single-product shipments |
| By Current Cost | In proportion to product value | Duty and insurance (value-based charges) |
| By Weight | In proportion to product weight | Sea and air freight |
| By Volume | In proportion to product volume | LCL freight billed on CBM |
In our example the container holds one product, so every method gives the same answer: ₹1,20,500 spread across 14,400 cells.
Mixed containers are where it goes wrong. Say the same shipment also carried junction boxes and ribbon. Split duty "By Quantity" and a ₹30 junction box absorbs the same duty as a cell worth far more, so cells come out understated and junction boxes overstated. Because Odoo sets the split method per cost line, you can send duty and insurance by current cost and freight by weight inside the same landed-cost record. In our experience that one setting decides whether the per-module numbers are usable.
About ₹25.37, up from ₹17.00. The landed cost formula is simple: (supplier value + eligible landed costs) ÷ units received. Here that's ₹3,65,300 ÷ 14,400 cells, an increase of roughly ₹8.37 per cell.
| Calculation | Amount |
| Original cell purchase value | ₹2,44,800 |
| Additional landed costs | ₹1,20,500 |
| Total landed inventory value | ₹3,65,300 |
| Total cells received | 14,400 |
| Original cost per cell | ₹17.00 |
| Landed cost per cell | ≈ ₹25.37 |
At module level, the landed cost example looks like this:
| Cell-cost comparison | Per module |
| Cell purchase cost before landed costs | ₹2,448 |
| Landed costs allocated to 144 cells | ₹1,205 |
| Cell cost after landed costs | ₹3,653 |
So what does ₹1,205 a module mean in practice? On a 1 MW order of 575 Wp modules (about 1,740 modules), it's roughly ₹21 lakh of cost that either sits in your inventory valuation or doesn't.
Timing matters as much as the method. Duty and clearance bills often arrive after the cells are already on the line. Once a manufacturing order has consumed cells, a later landed cost can't revalue the modules built from them; the share tied to consumed stock goes to the accounts rather than into those finished goods. We've found the practical fix is a process rule: no manufacturing order consumes an import lot until its landed-cost record is validated.